From f0eac9de65c4f6c4fa67dfb266be960624411155 Mon Sep 17 00:00:00 2001 From: Mawmanager Date: Mon, 19 Dec 2022 15:40:35 +0800 Subject: [PATCH 01/19] =?UTF-8?q?=E4=BF=AE=E6=94=B9.java-version=20?= =?UTF-8?q?=E4=B8=BAJDK17=20=E4=BF=AE=E6=94=B9.version=E4=B8=BA4.0.0-SNAPS?= =?UTF-8?q?HOT=20=E4=BF=AE=E6=94=B9=E6=8F=92=E4=BB=B6=E3=80=81=E4=BE=9D?= =?UTF-8?q?=E8=B5=96=E7=9A=84=E9=95=9C=E5=83=8F=E4=B8=BA=E9=98=BF=E9=87=8C?= =?UTF-8?q?=E4=BA=91=E5=92=8CJitpack.io=20--------------------------------?= =?UTF-8?q?-------------=20Modify=20.java-version=20to=20JDK17=20Modify=20?= =?UTF-8?q?.version=20to=204.0.0-SNAPSHOT=20Modify=20the=20plug-in=20and?= =?UTF-8?q?=20dependent=20images=20to=20Alibaba=20Cloud=20and=20Jitpack.io?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .java-version | 2 +- .version | 2 +- build.gradle | 26 ++++++++++++++++---------- gradle.properties | 7 ++++++- settings.gradle | 35 +++++++++++++++++++++++++++++++++++ 5 files changed, 59 insertions(+), 13 deletions(-) diff --git a/.java-version b/.java-version index 229ebd33f55..9910c7f9cec 100644 --- a/.java-version +++ b/.java-version @@ -1 +1 @@ -11.0.7 +17.0.5 \ No newline at end of file diff --git a/.version b/.version index ad121e8340e..afa63656064 100644 --- a/.version +++ b/.version @@ -1 +1 @@ -3.0.1-SNAPSHOT \ No newline at end of file +4.0.0-SNAPSHOT \ No newline at end of file diff --git a/build.gradle b/build.gradle index 9a58b861178..50b954366a3 100644 --- a/build.gradle +++ b/build.gradle @@ -1,13 +1,13 @@ plugins { - id 'com.github.ben-manes.versions' version '0.29.0' + id 'com.github.ben-manes.versions' version '0.28.0' id 'se.patrikerdes.use-latest-versions' version '0.2.14' id "com.jfrog.bintray" version "1.8.5" - id "com.jfrog.artifactory" version "4.16.1" + id "com.jfrog.artifactory" version "4.15.2" id "com.github.kt3k.coveralls" version "2.10.1" id "org.asciidoctor.jvm.convert" version "2.4.0" id "org.ajoberstar.grgit" version "4.0.2" id "org.ajoberstar.git-publish" version "3.0.0-rc.1" - id "org.sonarqube" version "3.0" + id "org.sonarqube" version "2.8" } sonarqube { @@ -23,17 +23,23 @@ apply from: "$rootDir/gradle/ide.gradle" apply plugin: 'springfox-multi-release' allprojects { - apply plugin: 'jacoco' - repositories { - jcenter() + mavenLocal() + //maven {url "https://plugins.gradle.org/m2/"} + maven {url 'https://maven.aliyun.com/repository/public'} + maven {url 'https://maven.aliyun.com/repository/google'} + maven {url 'https://maven.aliyun.com/repository/spring'} + maven {url 'https://maven.aliyun.com/repository/jcenter'} + maven {url 'https://maven.aliyun.com/repository/spring-plugin'} + maven {url 'https://jitpack.io'} + gradlePluginPortal() } + + apply plugin: 'jacoco' ext['groovy.version'] = "$groovy" } subprojects { - - //Not strictly groovy projects but useful for the IDE to recognise groovy test sources apply plugin: 'java-library' //gradle groovy plugin extends the java plugin apply plugin: 'groovy' //gradle groovy plugin extends the java plugin apply plugin: 'idea' @@ -82,8 +88,8 @@ subprojects { useJUnitPlatform() } - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 } apply from: "$rootDir/gradle/documentation.gradle" diff --git a/gradle.properties b/gradle.properties index 5a9f3a000f8..d73490c742b 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1 +1,6 @@ -org.gradle.jvmargs=-Xmx3G -XX:+HeapDumpOnOutOfMemoryError \ No newline at end of file +org.gradle.jvmargs=-Xmx3G -XX:+HeapDumpOnOutOfMemoryError + +#systemProp.http.proxyHost=127.0.0.1 +#systemProp.https.proxyHost=127.0.0.1 +#systemProp.https.proxyPort=9998 +#systemProp.http.proxyPort=9998 diff --git a/settings.gradle b/settings.gradle index d73a78481ad..5901eac5144 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1,3 +1,38 @@ +import org.gradle.api.initialization.resolve.RepositoriesMode + +pluginManagement { + repositories { + mavenLocal() + //maven {url "https://plugins.gradle.org/m2/"} + maven{ url 'https://maven.aliyun.com/repository/public'} + maven{ url 'https://maven.aliyun.com/repository/central'} + maven {url 'https://maven.aliyun.com/repository/google'} + maven {url 'https://maven.aliyun.com/repository/spring'} + maven {url 'https://maven.aliyun.com/nexus/content/repositories/jcenter'} + maven {url 'https://maven.aliyun.com/repository/spring-plugin'} + maven { url 'https://jitpack.io' } + gradlePluginPortal() + } +} + +dependencyResolutionManagement { + repositoriesMode.set(RepositoriesMode.PREFER_PROJECT) + repositories { + //maven {url "https://plugins.gradle.org/m2/"} + maven {url 'https://maven.aliyun.com/repository/public'} + maven {url 'https://maven.aliyun.com/repository/central'} + maven {url 'https://maven.aliyun.com/repository/google'} + maven {url 'https://maven.aliyun.com/repository/spring'} + maven {url 'https://maven.aliyun.com/nexus/content/repositories/jcenter'} + maven {url 'https://maven.aliyun.com/repository/spring-plugin'} + maven { url 'https://jitpack.io' } + mavenCentral() + gradlePluginPortal() + } +} + + + rootProject.name = 'springfox' include 'springfox-core' include 'springfox-spi' From 243345bf828c9556000aba9dd8ea03b7ced586a2 Mon Sep 17 00:00:00 2001 From: Mawmanager Date: Mon, 19 Dec 2022 15:52:31 +0800 Subject: [PATCH 02/19] =?UTF-8?q?wrapper=E4=B8=AD=E7=9A=84Gradle6.5?= =?UTF-8?q?=E7=89=88=E6=9C=AC=E6=94=B9=E4=B8=BA7.4=20springfox-webflux?= =?UTF-8?q?=E7=9A=84springboot=E7=89=88=E6=9C=AC=E6=94=B9=E4=B8=BA3.0.0=20?= =?UTF-8?q?=E5=9C=A8buildSrc/build.gradle=E4=B8=ADspock-core=E7=89=88?= =?UTF-8?q?=E6=9C=AC=E6=94=B9=E4=B8=BA2.0-grovy-3.0=20=E5=9C=A8=E5=A4=9A?= =?UTF-8?q?=E4=B8=AA=E4=BE=9D=E8=B5=96=E4=B8=ADjavax.servlet=E6=94=B9?= =?UTF-8?q?=E4=B8=BAjakarta.servlet=20=E5=9C=A8dependencies.gradle?= =?UTF-8?q?=E4=B8=AD=E6=9B=B4=E6=96=B0=E4=BA=86=E5=8F=98=E9=87=8F=20groovy?= =?UTF-8?q?=20=3D=20=20"4.0.6"=20spock=20=3D=20"2.0-groovy-3.0"=20spring?= =?UTF-8?q?=20=3D=20"3.0.0"=20springWeb=20=3D=20"6.0.2"=20springIntegratio?= =?UTF-8?q?n=20=3D=20"6.0.0"=20springHateoas=20=3D=20"2.0.0"=20springDataR?= =?UTF-8?q?est=20=3D=20"4.0.0"=20springPluginVersion=20=3D=20"3.0.0"=20spr?= =?UTF-8?q?ingBoot=20=20=3D=20"3.0.0"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- buildSrc/build.gradle | 3 +- gradle/dependencies.gradle | 55 ++++++++++--------- gradle/wrapper/gradle-wrapper.properties | 2 +- oas-contract-tests/build.gradle | 4 +- springfox-boot-starter/build.gradle | 6 +- springfox-core/build.gradle | 2 +- springfox-data-rest/build.gradle | 2 +- springfox-oas/build.gradle | 13 +++-- springfox-petstore-webflux/build.gradle | 2 +- .../build.gradle | 4 +- springfox-spring-web/build.gradle | 3 +- springfox-spring-webmvc/build.gradle | 4 +- springfox-swagger-common/build.gradle | 4 +- springfox-swagger-ui/build.gradle | 2 +- springfox-swagger1/build.gradle | 18 +++--- springfox-swagger2/build.gradle | 14 ++--- swagger-contract-tests-webflux/build.gradle | 2 +- swagger-contract-tests/build.gradle | 4 +- 18 files changed, 74 insertions(+), 70 deletions(-) diff --git a/buildSrc/build.gradle b/buildSrc/build.gradle index 3a6752e85cd..9a18994cb4c 100644 --- a/buildSrc/build.gradle +++ b/buildSrc/build.gradle @@ -23,7 +23,8 @@ repositories { dependencies { implementation gradleApi() implementation localGroovy() //Gradle 2.3 -> Groovy 2.3.9 - testImplementation 'org.spockframework:spock-core:1.3-groovy-2.5@jar' + implementation 'org.opentest4j:opentest4j:1.2.0' + testImplementation 'org.spockframework:spock-core:2.0-groovy-3.0@jar' testImplementation 'junit:junit:4.12' } diff --git a/gradle/dependencies.gradle b/gradle/dependencies.gradle index eee353104ec..aff40793602 100644 --- a/gradle/dependencies.gradle +++ b/gradle/dependencies.gradle @@ -4,9 +4,9 @@ ext { classmate = "1.5.1" classGraph = "4.8.83" equalsverifierVersion = '3.3' - groovy = "2.5.12" + groovy = "4.0.6" jacocoVersion = '0.8.5' - jackson = '2.11.0' + jackson = '2.14.1' joda = "2.10.6" jsonPath = "2.4.0" jsonAssert = "1.5.0" @@ -15,24 +15,25 @@ ext { mockito = "3.3.3" objenesis = "3.1" oasCore = "2.1.2" - servlet = "4.0.1" - slf4j = "1.7.25" + servlet = "6.0.0" + slf4j = "2.0.4" snakeyaml = '1.26' - spock = "1.3-groovy-2.5" - spring = "5.2.7.RELEASE" - springIntegration = "5.2.6.RELEASE" - springHateoas = "1.1.0.RELEASE" - springDataRest = "3.3.0.RELEASE" - springPluginVersion = "2.0.0.RELEASE" + spock = "2.0-groovy-3.0" + spring = "3.0.0" + springWeb = "6.0.2" + springIntegration = "6.0.0" + springHateoas = "2.0.0" + springDataRest = "4.0.0" + springPluginVersion = "3.0.0" swagger2Core = "1.5.20" - springBoot = "2.3.1.RELEASE" + springBoot = "3.0.0" springfoxRfc6570Version = "1.0.0" undercouch = "4.0.4" validationApiVersion = '2.0.1.Final' libs = [ test : [ - "org.springframework:spring-test:${spring}", + "org.springframework:spring-test:${springWeb}", "cglib:cglib-nodep:$cglib", "org.objenesis:objenesis:$objenesis", "org.mockito:mockito-core:${mockito}", @@ -41,12 +42,12 @@ ext { "org.yaml:snakeyaml:${snakeyaml}", "org.spockframework:spock-spring:${spock}", "org.spockframework:spock-core:${spock}", - "org.codehaus.groovy:groovy-all:${groovy}", + "org.apache.groovy:groovy-all:${groovy}", "org.springframework.hateoas:spring-hateoas:${springHateoas}", "nl.jqno.equalsverifier:equalsverifier:${equalsverifierVersion}" ], testNoHateoas : [ - "org.springframework:spring-test:${spring}", + "org.springframework:spring-test:${springWeb}", "cglib:cglib-nodep:$cglib", "org.objenesis:objenesis:$objenesis", "org.mockito:mockito-core:${mockito}", @@ -55,7 +56,7 @@ ext { "org.yaml:snakeyaml:${snakeyaml}", "org.spockframework:spock-spring:${spock}", "org.spockframework:spock-core:${spock}", - "org.codehaus.groovy:groovy-all:${groovy}", + "org.apache.groovy:groovy-all:${groovy}", "nl.jqno.equalsverifier:equalsverifier:${equalsverifierVersion}" ], swagger2Core : [ @@ -67,25 +68,25 @@ ext { "io.swagger.core.v3:swagger-models:${oasCore}" ], spring : [ - "org.springframework.plugin:spring-plugin-core:${springPluginVersion}", "org.springframework.plugin:spring-plugin-metadata:${springPluginVersion}", + "org.springframework.plugin:spring-plugin-core:${springPluginVersion}" ], springProvided : [ - "org.springframework:spring-core:$spring", - "org.springframework:spring-web:$spring", - "org.springframework:spring-context:$spring", + "org.springframework:spring-core:$springWeb", + "org.springframework:spring-web:$springWeb", + "org.springframework:spring-context:$springWeb", ], springProvidedWithMvc : [ - "org.springframework:spring-core:$spring", - "org.springframework:spring-web:$spring", - "org.springframework:spring-webmvc:$spring", - "org.springframework:spring-context:$spring", + "org.springframework:spring-core:$springWeb", + "org.springframework:spring-web:$springWeb", + "org.springframework:spring-webmvc:$springWeb", + "org.springframework:spring-context:$springWeb", ], springProvidedWithFlux : [ - "org.springframework:spring-core:$spring", - "org.springframework:spring-web:$spring", - "org.springframework:spring-webflux:$spring", - "org.springframework:spring-context:$spring", + "org.springframework:spring-core:$springWeb", + "org.springframework:spring-web:$springWeb", + "org.springframework:spring-webflux:$springWeb", + "org.springframework:spring-context:$springWeb", ], springProvidedWithSpringIntegration: [ "org.springframework.integration:spring-integration-http:$springIntegration", diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 622ab64a3cb..41dfb87909a 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-6.5-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.4-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/oas-contract-tests/build.gradle b/oas-contract-tests/build.gradle index e7947d308f1..ee5a7b99b24 100644 --- a/oas-contract-tests/build.gradle +++ b/oas-contract-tests/build.gradle @@ -1,6 +1,6 @@ buildscript { ext { - springBootVersion = '2.3.1.RELEASE' + springBootVersion = '3.0.0' } repositories { mavenCentral() @@ -22,7 +22,7 @@ dependencies { implementation "org.springframework.boot:spring-boot-starter-web" implementation "org.springframework.boot:spring-boot-starter-webflux" implementation "org.springframework.boot:spring-boot-starter-data-rest" - implementation "org.codehaus.groovy:groovy-all:$groovy" + implementation "org.apache.groovy:groovy-all:$groovy" implementation 'org.slf4j:slf4j-simple:1.7.30' implementation "javax.validation:validation-api:$validationApiVersion" diff --git a/springfox-boot-starter/build.gradle b/springfox-boot-starter/build.gradle index b81ce6ec849..1e2b0b15cd0 100644 --- a/springfox-boot-starter/build.gradle +++ b/springfox-boot-starter/build.gradle @@ -14,10 +14,10 @@ dependencies { api libs.spring compileOnly libs.springProvidedWithMvc - compileOnly "org.springframework:spring-webflux:$spring" + compileOnly "org.springframework:spring-webflux:$springWeb" compileOnly libs.springBootProvided compileOnly libs.clientProvided - compileOnly "javax.servlet:javax.servlet-api:$servlet" - annotationProcessor "org.springframework.boot:spring-boot-configuration-processor:2.3.1.RELEASE" + compileOnly "jakarta.servlet:jakarta.servlet-api:$servlet" + annotationProcessor "org.springframework.boot:spring-boot-configuration-processor:3.0.0" } diff --git a/springfox-core/build.gradle b/springfox-core/build.gradle index ccf7ca9933b..d3a44b59741 100644 --- a/springfox-core/build.gradle +++ b/springfox-core/build.gradle @@ -19,7 +19,7 @@ dependencies { testImplementation libs.test testImplementation libs.clientProvided - testImplementation "javax.servlet:javax.servlet-api:$servlet" + testImplementation "jakarta.servlet:jakarta.servlet-api:$servlet" testImplementation libs.springProvidedWithMvc } \ No newline at end of file diff --git a/springfox-data-rest/build.gradle b/springfox-data-rest/build.gradle index 9d42b06886e..e1f60ffccfc 100644 --- a/springfox-data-rest/build.gradle +++ b/springfox-data-rest/build.gradle @@ -21,7 +21,7 @@ dependencies { compileOnly libs.springBootProvided compileOnly libs.springProvidedWithMvc - compileOnly "javax.servlet:javax.servlet-api:$servlet" + compileOnly "jakarta.servlet:jakarta.servlet-api:$servlet" testImplementation libs.test } diff --git a/springfox-oas/build.gradle b/springfox-oas/build.gradle index 9a8f4e098f4..d2e9d1f15d7 100644 --- a/springfox-oas/build.gradle +++ b/springfox-oas/build.gradle @@ -1,6 +1,6 @@ -plugins { - id "net.ltgt.apt-idea" version "0.21" -} +//plugins { +// id "net.ltgt.apt-idea" version "0.21" +//} ext { limits = [ @@ -14,7 +14,6 @@ ext { } dependencies { - api libs.oasCore api project(':springfox-spi') api project(':springfox-schema') api project(':springfox-core') @@ -24,14 +23,15 @@ dependencies { api project(':springfox-swagger-common') api libs.core api libs.spring + api libs.oasCore implementation "org.mapstruct:mapstruct:$mapstruct" annotationProcessor "org.mapstruct:mapstruct-processor:$mapstruct" compileOnly libs.springProvidedWithMvc - compileOnly "org.springframework:spring-webflux:$spring" + compileOnly "org.springframework:spring-webflux:$springWeb" compileOnly "org.springframework.boot:spring-boot-autoconfigure:$springBoot" - compileOnly "javax.servlet:javax.servlet-api:$servlet" + compileOnly "jakarta.servlet:jakarta.servlet-api:$servlet" compileOnly libs.clientProvided testImplementation project(':springfox-core').sourceSets.test.output @@ -48,4 +48,5 @@ compileJava { "-Amapstruct.defaultComponentModel=spring", "-Amapstruct.unmappedTargetPolicy=ERROR" ] + } \ No newline at end of file diff --git a/springfox-petstore-webflux/build.gradle b/springfox-petstore-webflux/build.gradle index c8df03a5149..c5a02bdee3b 100644 --- a/springfox-petstore-webflux/build.gradle +++ b/springfox-petstore-webflux/build.gradle @@ -2,7 +2,7 @@ dependencies { implementation libs.core implementation libs.spring implementation libs.springProvidedWithMvc - compileOnly "org.springframework:spring-webflux:$spring" + compileOnly "org.springframework:spring-webflux:$springWeb" implementation libs.swagger2Core diff --git a/springfox-spring-integration-webmvc/build.gradle b/springfox-spring-integration-webmvc/build.gradle index 30f94f0ad32..06e8c80914c 100644 --- a/springfox-spring-integration-webmvc/build.gradle +++ b/springfox-spring-integration-webmvc/build.gradle @@ -20,7 +20,7 @@ dependencies { compileOnly libs.clientProvided compileOnly libs.springProvidedWithSpringIntegration - compileOnly "javax.servlet:javax.servlet-api:$servlet" + compileOnly "jakarta.servlet:jakarta.servlet-api:$servlet" testImplementation "javax.validation:validation-api:$validationApiVersion" testImplementation project(':springfox-core') @@ -30,6 +30,6 @@ dependencies { testImplementation libs.swagger2Core testImplementation project(':springfox-core').sourceSets.test.output testImplementation project(':springfox-schema').sourceSets.test.output - testImplementation "javax.servlet:javax.servlet-api:$servlet" + testImplementation "jakarta.servlet:jakarta.servlet-api:$servlet" implementation libs.clientProvided } diff --git a/springfox-spring-web/build.gradle b/springfox-spring-web/build.gradle index 4e208d6fdae..b6fe30e4cf2 100644 --- a/springfox-spring-web/build.gradle +++ b/springfox-spring-web/build.gradle @@ -17,6 +17,7 @@ dependencies { api "io.github.classgraph:classgraph:$classGraph" api libs.core api libs.spring + api libs.springProvided compileOnly libs.springProvided compileOnly libs.clientProvided @@ -27,7 +28,7 @@ dependencies { testImplementation project(':springfox-core').sourceSets.test.output testImplementation project(':springfox-schema').sourceSets.test.output testImplementation "javax.validation:validation-api:$validationApiVersion" - testImplementation "javax.servlet:javax.servlet-api:$servlet" + testImplementation "jakarta.servlet:jakarta.servlet-api:$servlet" testImplementation libs.clientProvided } diff --git a/springfox-spring-webmvc/build.gradle b/springfox-spring-webmvc/build.gradle index e7b46c8599e..423a5aa1299 100644 --- a/springfox-spring-webmvc/build.gradle +++ b/springfox-spring-webmvc/build.gradle @@ -21,7 +21,7 @@ dependencies { compileOnly libs.springProvidedWithMvc compileOnly libs.clientProvided compileOnly libs.springBootProvided - compileOnly "javax.servlet:javax.servlet-api:$servlet" + compileOnly "jakarta.servlet:jakarta.servlet-api:$servlet" testImplementation libs.test testImplementation libs.swagger2Core @@ -29,7 +29,7 @@ dependencies { testImplementation project(':springfox-core').sourceSets.test.output testImplementation project(':springfox-schema').sourceSets.test.output testImplementation "javax.validation:validation-api:$validationApiVersion" - testImplementation "javax.servlet:javax.servlet-api:$servlet" + testImplementation "jakarta.servlet:jakarta.servlet-api:$servlet" testImplementation libs.springProvidedWithMvc testImplementation libs.clientProvided testImplementation libs.springBootProvided diff --git a/springfox-swagger-common/build.gradle b/springfox-swagger-common/build.gradle index 2a7e1e9728a..7f9204006e6 100644 --- a/springfox-swagger-common/build.gradle +++ b/springfox-swagger-common/build.gradle @@ -22,7 +22,7 @@ dependencies { compileOnly libs.clientProvided compileOnly libs.springProvidedWithMvc - compileOnly "javax.servlet:javax.servlet-api:$servlet" + compileOnly "jakarta.servlet:jakarta.servlet-api:$servlet" testImplementation project(':springfox-core') @@ -33,7 +33,7 @@ dependencies { testImplementation libs.test testImplementation "org.skyscreamer:jsonassert:${jsonAssert}" - testImplementation "javax.servlet:javax.servlet-api:$servlet" + testImplementation "jakarta.servlet:jakarta.servlet-api:$servlet" testImplementation libs.clientProvided testImplementation libs.springProvidedWithMvc } \ No newline at end of file diff --git a/springfox-swagger-ui/build.gradle b/springfox-swagger-ui/build.gradle index 88cfcd27073..29cad9524ce 100644 --- a/springfox-swagger-ui/build.gradle +++ b/springfox-swagger-ui/build.gradle @@ -17,7 +17,7 @@ import org.apache.tools.ant.filters.ReplaceTokens */ plugins { id "de.undercouch.download" version "4.1.0" - id "com.github.node-gradle.node" version "2.2.4" + id "com.github.node-gradle.node" version "3.5.0" } ext { diff --git a/springfox-swagger1/build.gradle b/springfox-swagger1/build.gradle index 50e964cc49f..66895da3abc 100644 --- a/springfox-swagger1/build.gradle +++ b/springfox-swagger1/build.gradle @@ -1,6 +1,6 @@ -plugins { - id "net.ltgt.apt-idea" version "0.21" -} +//plugins { +// id "net.ltgt.apt-idea" version "0.21" +//} ext { limits = [ @@ -42,7 +42,7 @@ dependencies { api libs.swagger2Core compileOnly libs.springProvidedWithMvc compileOnly libs.clientProvided - compileOnly "javax.servlet:javax.servlet-api:$servlet" + compileOnly "jakarta.servlet:jakarta.servlet-api:$servlet" implementation "org.mapstruct:mapstruct:$mapstruct" annotationProcessor "org.mapstruct:mapstruct-processor:$mapstruct" @@ -55,12 +55,12 @@ dependencies { testImplementation libs.test testImplementation libs.springProvidedWithMvc testImplementation libs.clientProvided - testImplementation "javax.servlet:javax.servlet-api:$servlet" + testImplementation "jakarta.servlet:jakarta.servlet-api:$servlet" - integrationTestCompile sourceSets.main.output - integrationTestCompile sourceSets.test.output - integrationTestCompile configurations.testImplementation - integrationTestRuntime configurations.testRuntime + integrationTestImplementation sourceSets.main.output + integrationTestImplementation sourceSets.test.output +// integrationTestImplementation configurations.testImplementation +// integrationTestImplementation configurations.testRuntime } compileJava { diff --git a/springfox-swagger2/build.gradle b/springfox-swagger2/build.gradle index 2db7716a230..20f9b0de680 100644 --- a/springfox-swagger2/build.gradle +++ b/springfox-swagger2/build.gradle @@ -1,6 +1,6 @@ -plugins { - id "net.ltgt.apt-idea" version "0.21" -} +//plugins { +// id "net.ltgt.apt-idea" version "0.21" +//} ext { limits = [ @@ -25,11 +25,11 @@ dependencies { api libs.spring api libs.swagger2Core - compileOnly "org.springframework:spring-webflux:$spring" + compileOnly "org.springframework:spring-webflux:$springWeb" compileOnly libs.springBootProvided compileOnly libs.springProvidedWithMvc compileOnly libs.clientProvided - compileOnly "javax.servlet:javax.servlet-api:$servlet" + compileOnly "jakarta.servlet:jakarta.servlet-api:$servlet" implementation "org.mapstruct:mapstruct:$mapstruct" @@ -41,8 +41,8 @@ dependencies { testImplementation project(':springfox-swagger-common').sourceSets.test.output testImplementation project(':springfox-spring-web').sourceSets.test.output testImplementation project(':springfox-spring-webmvc').sourceSets.test.output - testImplementation "javax.servlet:javax.servlet-api:$servlet" - testImplementation "org.springframework:spring-webflux:$spring" + testImplementation "jakarta.servlet:jakarta.servlet-api:$servlet" + testImplementation "org.springframework:spring-webflux:$springWeb" testImplementation libs.springProvidedWithMvc testImplementation libs.clientProvided diff --git a/swagger-contract-tests-webflux/build.gradle b/swagger-contract-tests-webflux/build.gradle index 534c43d402f..f241af0c417 100644 --- a/swagger-contract-tests-webflux/build.gradle +++ b/swagger-contract-tests-webflux/build.gradle @@ -1,6 +1,6 @@ buildscript { ext { - springBootVersion = '2.3.1.RELEASE' + springBootVersion = '3.0.0' } repositories { mavenCentral() diff --git a/swagger-contract-tests/build.gradle b/swagger-contract-tests/build.gradle index 5e03d1225a9..70aa28fd962 100644 --- a/swagger-contract-tests/build.gradle +++ b/swagger-contract-tests/build.gradle @@ -1,6 +1,6 @@ buildscript { ext { - springBootVersion = '2.3.1.RELEASE' + springBootVersion = '3.0.0' } repositories { mavenCentral() @@ -23,7 +23,7 @@ dependencies { implementation "org.springframework.boot:spring-boot-starter-data-rest" implementation "org.springframework.boot:spring-boot-starter-data-jpa" implementation "com.h2database:h2" - implementation "org.codehaus.groovy:groovy-all:$groovy" + implementation "org.apache.groovy:groovy-all:$groovy" implementation libs.clientProvided implementation "javax.validation:validation-api:$validationApiVersion" implementation 'org.slf4j:slf4j-simple:1.7.30' From a7f343c65d8b915258ecc6874b35238bae1254b9 Mon Sep 17 00:00:00 2001 From: Mawmanager Date: Mon, 19 Dec 2022 15:53:20 +0800 Subject: [PATCH 03/19] =?UTF-8?q?Revert=20"wrapper=E4=B8=AD=E7=9A=84Gradle?= =?UTF-8?q?6.5=E7=89=88=E6=9C=AC=E6=94=B9=E4=B8=BA7.4"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reverts commit 243345bf828c9556000aba9dd8ea03b7ced586a2. --- buildSrc/build.gradle | 3 +- gradle/dependencies.gradle | 55 +++++++++---------- gradle/wrapper/gradle-wrapper.properties | 2 +- oas-contract-tests/build.gradle | 4 +- springfox-boot-starter/build.gradle | 6 +- springfox-core/build.gradle | 2 +- springfox-data-rest/build.gradle | 2 +- springfox-oas/build.gradle | 13 ++--- springfox-petstore-webflux/build.gradle | 2 +- .../build.gradle | 4 +- springfox-spring-web/build.gradle | 3 +- springfox-spring-webmvc/build.gradle | 4 +- springfox-swagger-common/build.gradle | 4 +- springfox-swagger-ui/build.gradle | 2 +- springfox-swagger1/build.gradle | 18 +++--- springfox-swagger2/build.gradle | 14 ++--- swagger-contract-tests-webflux/build.gradle | 2 +- swagger-contract-tests/build.gradle | 4 +- 18 files changed, 70 insertions(+), 74 deletions(-) diff --git a/buildSrc/build.gradle b/buildSrc/build.gradle index 9a18994cb4c..3a6752e85cd 100644 --- a/buildSrc/build.gradle +++ b/buildSrc/build.gradle @@ -23,8 +23,7 @@ repositories { dependencies { implementation gradleApi() implementation localGroovy() //Gradle 2.3 -> Groovy 2.3.9 - implementation 'org.opentest4j:opentest4j:1.2.0' - testImplementation 'org.spockframework:spock-core:2.0-groovy-3.0@jar' + testImplementation 'org.spockframework:spock-core:1.3-groovy-2.5@jar' testImplementation 'junit:junit:4.12' } diff --git a/gradle/dependencies.gradle b/gradle/dependencies.gradle index aff40793602..eee353104ec 100644 --- a/gradle/dependencies.gradle +++ b/gradle/dependencies.gradle @@ -4,9 +4,9 @@ ext { classmate = "1.5.1" classGraph = "4.8.83" equalsverifierVersion = '3.3' - groovy = "4.0.6" + groovy = "2.5.12" jacocoVersion = '0.8.5' - jackson = '2.14.1' + jackson = '2.11.0' joda = "2.10.6" jsonPath = "2.4.0" jsonAssert = "1.5.0" @@ -15,25 +15,24 @@ ext { mockito = "3.3.3" objenesis = "3.1" oasCore = "2.1.2" - servlet = "6.0.0" - slf4j = "2.0.4" + servlet = "4.0.1" + slf4j = "1.7.25" snakeyaml = '1.26' - spock = "2.0-groovy-3.0" - spring = "3.0.0" - springWeb = "6.0.2" - springIntegration = "6.0.0" - springHateoas = "2.0.0" - springDataRest = "4.0.0" - springPluginVersion = "3.0.0" + spock = "1.3-groovy-2.5" + spring = "5.2.7.RELEASE" + springIntegration = "5.2.6.RELEASE" + springHateoas = "1.1.0.RELEASE" + springDataRest = "3.3.0.RELEASE" + springPluginVersion = "2.0.0.RELEASE" swagger2Core = "1.5.20" - springBoot = "3.0.0" + springBoot = "2.3.1.RELEASE" springfoxRfc6570Version = "1.0.0" undercouch = "4.0.4" validationApiVersion = '2.0.1.Final' libs = [ test : [ - "org.springframework:spring-test:${springWeb}", + "org.springframework:spring-test:${spring}", "cglib:cglib-nodep:$cglib", "org.objenesis:objenesis:$objenesis", "org.mockito:mockito-core:${mockito}", @@ -42,12 +41,12 @@ ext { "org.yaml:snakeyaml:${snakeyaml}", "org.spockframework:spock-spring:${spock}", "org.spockframework:spock-core:${spock}", - "org.apache.groovy:groovy-all:${groovy}", + "org.codehaus.groovy:groovy-all:${groovy}", "org.springframework.hateoas:spring-hateoas:${springHateoas}", "nl.jqno.equalsverifier:equalsverifier:${equalsverifierVersion}" ], testNoHateoas : [ - "org.springframework:spring-test:${springWeb}", + "org.springframework:spring-test:${spring}", "cglib:cglib-nodep:$cglib", "org.objenesis:objenesis:$objenesis", "org.mockito:mockito-core:${mockito}", @@ -56,7 +55,7 @@ ext { "org.yaml:snakeyaml:${snakeyaml}", "org.spockframework:spock-spring:${spock}", "org.spockframework:spock-core:${spock}", - "org.apache.groovy:groovy-all:${groovy}", + "org.codehaus.groovy:groovy-all:${groovy}", "nl.jqno.equalsverifier:equalsverifier:${equalsverifierVersion}" ], swagger2Core : [ @@ -68,25 +67,25 @@ ext { "io.swagger.core.v3:swagger-models:${oasCore}" ], spring : [ + "org.springframework.plugin:spring-plugin-core:${springPluginVersion}", "org.springframework.plugin:spring-plugin-metadata:${springPluginVersion}", - "org.springframework.plugin:spring-plugin-core:${springPluginVersion}" ], springProvided : [ - "org.springframework:spring-core:$springWeb", - "org.springframework:spring-web:$springWeb", - "org.springframework:spring-context:$springWeb", + "org.springframework:spring-core:$spring", + "org.springframework:spring-web:$spring", + "org.springframework:spring-context:$spring", ], springProvidedWithMvc : [ - "org.springframework:spring-core:$springWeb", - "org.springframework:spring-web:$springWeb", - "org.springframework:spring-webmvc:$springWeb", - "org.springframework:spring-context:$springWeb", + "org.springframework:spring-core:$spring", + "org.springframework:spring-web:$spring", + "org.springframework:spring-webmvc:$spring", + "org.springframework:spring-context:$spring", ], springProvidedWithFlux : [ - "org.springframework:spring-core:$springWeb", - "org.springframework:spring-web:$springWeb", - "org.springframework:spring-webflux:$springWeb", - "org.springframework:spring-context:$springWeb", + "org.springframework:spring-core:$spring", + "org.springframework:spring-web:$spring", + "org.springframework:spring-webflux:$spring", + "org.springframework:spring-context:$spring", ], springProvidedWithSpringIntegration: [ "org.springframework.integration:spring-integration-http:$springIntegration", diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 41dfb87909a..622ab64a3cb 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.4-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-6.5-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/oas-contract-tests/build.gradle b/oas-contract-tests/build.gradle index ee5a7b99b24..e7947d308f1 100644 --- a/oas-contract-tests/build.gradle +++ b/oas-contract-tests/build.gradle @@ -1,6 +1,6 @@ buildscript { ext { - springBootVersion = '3.0.0' + springBootVersion = '2.3.1.RELEASE' } repositories { mavenCentral() @@ -22,7 +22,7 @@ dependencies { implementation "org.springframework.boot:spring-boot-starter-web" implementation "org.springframework.boot:spring-boot-starter-webflux" implementation "org.springframework.boot:spring-boot-starter-data-rest" - implementation "org.apache.groovy:groovy-all:$groovy" + implementation "org.codehaus.groovy:groovy-all:$groovy" implementation 'org.slf4j:slf4j-simple:1.7.30' implementation "javax.validation:validation-api:$validationApiVersion" diff --git a/springfox-boot-starter/build.gradle b/springfox-boot-starter/build.gradle index 1e2b0b15cd0..b81ce6ec849 100644 --- a/springfox-boot-starter/build.gradle +++ b/springfox-boot-starter/build.gradle @@ -14,10 +14,10 @@ dependencies { api libs.spring compileOnly libs.springProvidedWithMvc - compileOnly "org.springframework:spring-webflux:$springWeb" + compileOnly "org.springframework:spring-webflux:$spring" compileOnly libs.springBootProvided compileOnly libs.clientProvided - compileOnly "jakarta.servlet:jakarta.servlet-api:$servlet" - annotationProcessor "org.springframework.boot:spring-boot-configuration-processor:3.0.0" + compileOnly "javax.servlet:javax.servlet-api:$servlet" + annotationProcessor "org.springframework.boot:spring-boot-configuration-processor:2.3.1.RELEASE" } diff --git a/springfox-core/build.gradle b/springfox-core/build.gradle index d3a44b59741..ccf7ca9933b 100644 --- a/springfox-core/build.gradle +++ b/springfox-core/build.gradle @@ -19,7 +19,7 @@ dependencies { testImplementation libs.test testImplementation libs.clientProvided - testImplementation "jakarta.servlet:jakarta.servlet-api:$servlet" + testImplementation "javax.servlet:javax.servlet-api:$servlet" testImplementation libs.springProvidedWithMvc } \ No newline at end of file diff --git a/springfox-data-rest/build.gradle b/springfox-data-rest/build.gradle index e1f60ffccfc..9d42b06886e 100644 --- a/springfox-data-rest/build.gradle +++ b/springfox-data-rest/build.gradle @@ -21,7 +21,7 @@ dependencies { compileOnly libs.springBootProvided compileOnly libs.springProvidedWithMvc - compileOnly "jakarta.servlet:jakarta.servlet-api:$servlet" + compileOnly "javax.servlet:javax.servlet-api:$servlet" testImplementation libs.test } diff --git a/springfox-oas/build.gradle b/springfox-oas/build.gradle index d2e9d1f15d7..9a8f4e098f4 100644 --- a/springfox-oas/build.gradle +++ b/springfox-oas/build.gradle @@ -1,6 +1,6 @@ -//plugins { -// id "net.ltgt.apt-idea" version "0.21" -//} +plugins { + id "net.ltgt.apt-idea" version "0.21" +} ext { limits = [ @@ -14,6 +14,7 @@ ext { } dependencies { + api libs.oasCore api project(':springfox-spi') api project(':springfox-schema') api project(':springfox-core') @@ -23,15 +24,14 @@ dependencies { api project(':springfox-swagger-common') api libs.core api libs.spring - api libs.oasCore implementation "org.mapstruct:mapstruct:$mapstruct" annotationProcessor "org.mapstruct:mapstruct-processor:$mapstruct" compileOnly libs.springProvidedWithMvc - compileOnly "org.springframework:spring-webflux:$springWeb" + compileOnly "org.springframework:spring-webflux:$spring" compileOnly "org.springframework.boot:spring-boot-autoconfigure:$springBoot" - compileOnly "jakarta.servlet:jakarta.servlet-api:$servlet" + compileOnly "javax.servlet:javax.servlet-api:$servlet" compileOnly libs.clientProvided testImplementation project(':springfox-core').sourceSets.test.output @@ -48,5 +48,4 @@ compileJava { "-Amapstruct.defaultComponentModel=spring", "-Amapstruct.unmappedTargetPolicy=ERROR" ] - } \ No newline at end of file diff --git a/springfox-petstore-webflux/build.gradle b/springfox-petstore-webflux/build.gradle index c5a02bdee3b..c8df03a5149 100644 --- a/springfox-petstore-webflux/build.gradle +++ b/springfox-petstore-webflux/build.gradle @@ -2,7 +2,7 @@ dependencies { implementation libs.core implementation libs.spring implementation libs.springProvidedWithMvc - compileOnly "org.springframework:spring-webflux:$springWeb" + compileOnly "org.springframework:spring-webflux:$spring" implementation libs.swagger2Core diff --git a/springfox-spring-integration-webmvc/build.gradle b/springfox-spring-integration-webmvc/build.gradle index 06e8c80914c..30f94f0ad32 100644 --- a/springfox-spring-integration-webmvc/build.gradle +++ b/springfox-spring-integration-webmvc/build.gradle @@ -20,7 +20,7 @@ dependencies { compileOnly libs.clientProvided compileOnly libs.springProvidedWithSpringIntegration - compileOnly "jakarta.servlet:jakarta.servlet-api:$servlet" + compileOnly "javax.servlet:javax.servlet-api:$servlet" testImplementation "javax.validation:validation-api:$validationApiVersion" testImplementation project(':springfox-core') @@ -30,6 +30,6 @@ dependencies { testImplementation libs.swagger2Core testImplementation project(':springfox-core').sourceSets.test.output testImplementation project(':springfox-schema').sourceSets.test.output - testImplementation "jakarta.servlet:jakarta.servlet-api:$servlet" + testImplementation "javax.servlet:javax.servlet-api:$servlet" implementation libs.clientProvided } diff --git a/springfox-spring-web/build.gradle b/springfox-spring-web/build.gradle index b6fe30e4cf2..4e208d6fdae 100644 --- a/springfox-spring-web/build.gradle +++ b/springfox-spring-web/build.gradle @@ -17,7 +17,6 @@ dependencies { api "io.github.classgraph:classgraph:$classGraph" api libs.core api libs.spring - api libs.springProvided compileOnly libs.springProvided compileOnly libs.clientProvided @@ -28,7 +27,7 @@ dependencies { testImplementation project(':springfox-core').sourceSets.test.output testImplementation project(':springfox-schema').sourceSets.test.output testImplementation "javax.validation:validation-api:$validationApiVersion" - testImplementation "jakarta.servlet:jakarta.servlet-api:$servlet" + testImplementation "javax.servlet:javax.servlet-api:$servlet" testImplementation libs.clientProvided } diff --git a/springfox-spring-webmvc/build.gradle b/springfox-spring-webmvc/build.gradle index 423a5aa1299..e7b46c8599e 100644 --- a/springfox-spring-webmvc/build.gradle +++ b/springfox-spring-webmvc/build.gradle @@ -21,7 +21,7 @@ dependencies { compileOnly libs.springProvidedWithMvc compileOnly libs.clientProvided compileOnly libs.springBootProvided - compileOnly "jakarta.servlet:jakarta.servlet-api:$servlet" + compileOnly "javax.servlet:javax.servlet-api:$servlet" testImplementation libs.test testImplementation libs.swagger2Core @@ -29,7 +29,7 @@ dependencies { testImplementation project(':springfox-core').sourceSets.test.output testImplementation project(':springfox-schema').sourceSets.test.output testImplementation "javax.validation:validation-api:$validationApiVersion" - testImplementation "jakarta.servlet:jakarta.servlet-api:$servlet" + testImplementation "javax.servlet:javax.servlet-api:$servlet" testImplementation libs.springProvidedWithMvc testImplementation libs.clientProvided testImplementation libs.springBootProvided diff --git a/springfox-swagger-common/build.gradle b/springfox-swagger-common/build.gradle index 7f9204006e6..2a7e1e9728a 100644 --- a/springfox-swagger-common/build.gradle +++ b/springfox-swagger-common/build.gradle @@ -22,7 +22,7 @@ dependencies { compileOnly libs.clientProvided compileOnly libs.springProvidedWithMvc - compileOnly "jakarta.servlet:jakarta.servlet-api:$servlet" + compileOnly "javax.servlet:javax.servlet-api:$servlet" testImplementation project(':springfox-core') @@ -33,7 +33,7 @@ dependencies { testImplementation libs.test testImplementation "org.skyscreamer:jsonassert:${jsonAssert}" - testImplementation "jakarta.servlet:jakarta.servlet-api:$servlet" + testImplementation "javax.servlet:javax.servlet-api:$servlet" testImplementation libs.clientProvided testImplementation libs.springProvidedWithMvc } \ No newline at end of file diff --git a/springfox-swagger-ui/build.gradle b/springfox-swagger-ui/build.gradle index 29cad9524ce..88cfcd27073 100644 --- a/springfox-swagger-ui/build.gradle +++ b/springfox-swagger-ui/build.gradle @@ -17,7 +17,7 @@ import org.apache.tools.ant.filters.ReplaceTokens */ plugins { id "de.undercouch.download" version "4.1.0" - id "com.github.node-gradle.node" version "3.5.0" + id "com.github.node-gradle.node" version "2.2.4" } ext { diff --git a/springfox-swagger1/build.gradle b/springfox-swagger1/build.gradle index 66895da3abc..50e964cc49f 100644 --- a/springfox-swagger1/build.gradle +++ b/springfox-swagger1/build.gradle @@ -1,6 +1,6 @@ -//plugins { -// id "net.ltgt.apt-idea" version "0.21" -//} +plugins { + id "net.ltgt.apt-idea" version "0.21" +} ext { limits = [ @@ -42,7 +42,7 @@ dependencies { api libs.swagger2Core compileOnly libs.springProvidedWithMvc compileOnly libs.clientProvided - compileOnly "jakarta.servlet:jakarta.servlet-api:$servlet" + compileOnly "javax.servlet:javax.servlet-api:$servlet" implementation "org.mapstruct:mapstruct:$mapstruct" annotationProcessor "org.mapstruct:mapstruct-processor:$mapstruct" @@ -55,12 +55,12 @@ dependencies { testImplementation libs.test testImplementation libs.springProvidedWithMvc testImplementation libs.clientProvided - testImplementation "jakarta.servlet:jakarta.servlet-api:$servlet" + testImplementation "javax.servlet:javax.servlet-api:$servlet" - integrationTestImplementation sourceSets.main.output - integrationTestImplementation sourceSets.test.output -// integrationTestImplementation configurations.testImplementation -// integrationTestImplementation configurations.testRuntime + integrationTestCompile sourceSets.main.output + integrationTestCompile sourceSets.test.output + integrationTestCompile configurations.testImplementation + integrationTestRuntime configurations.testRuntime } compileJava { diff --git a/springfox-swagger2/build.gradle b/springfox-swagger2/build.gradle index 20f9b0de680..2db7716a230 100644 --- a/springfox-swagger2/build.gradle +++ b/springfox-swagger2/build.gradle @@ -1,6 +1,6 @@ -//plugins { -// id "net.ltgt.apt-idea" version "0.21" -//} +plugins { + id "net.ltgt.apt-idea" version "0.21" +} ext { limits = [ @@ -25,11 +25,11 @@ dependencies { api libs.spring api libs.swagger2Core - compileOnly "org.springframework:spring-webflux:$springWeb" + compileOnly "org.springframework:spring-webflux:$spring" compileOnly libs.springBootProvided compileOnly libs.springProvidedWithMvc compileOnly libs.clientProvided - compileOnly "jakarta.servlet:jakarta.servlet-api:$servlet" + compileOnly "javax.servlet:javax.servlet-api:$servlet" implementation "org.mapstruct:mapstruct:$mapstruct" @@ -41,8 +41,8 @@ dependencies { testImplementation project(':springfox-swagger-common').sourceSets.test.output testImplementation project(':springfox-spring-web').sourceSets.test.output testImplementation project(':springfox-spring-webmvc').sourceSets.test.output - testImplementation "jakarta.servlet:jakarta.servlet-api:$servlet" - testImplementation "org.springframework:spring-webflux:$springWeb" + testImplementation "javax.servlet:javax.servlet-api:$servlet" + testImplementation "org.springframework:spring-webflux:$spring" testImplementation libs.springProvidedWithMvc testImplementation libs.clientProvided diff --git a/swagger-contract-tests-webflux/build.gradle b/swagger-contract-tests-webflux/build.gradle index f241af0c417..534c43d402f 100644 --- a/swagger-contract-tests-webflux/build.gradle +++ b/swagger-contract-tests-webflux/build.gradle @@ -1,6 +1,6 @@ buildscript { ext { - springBootVersion = '3.0.0' + springBootVersion = '2.3.1.RELEASE' } repositories { mavenCentral() diff --git a/swagger-contract-tests/build.gradle b/swagger-contract-tests/build.gradle index 70aa28fd962..5e03d1225a9 100644 --- a/swagger-contract-tests/build.gradle +++ b/swagger-contract-tests/build.gradle @@ -1,6 +1,6 @@ buildscript { ext { - springBootVersion = '3.0.0' + springBootVersion = '2.3.1.RELEASE' } repositories { mavenCentral() @@ -23,7 +23,7 @@ dependencies { implementation "org.springframework.boot:spring-boot-starter-data-rest" implementation "org.springframework.boot:spring-boot-starter-data-jpa" implementation "com.h2database:h2" - implementation "org.apache.groovy:groovy-all:$groovy" + implementation "org.codehaus.groovy:groovy-all:$groovy" implementation libs.clientProvided implementation "javax.validation:validation-api:$validationApiVersion" implementation 'org.slf4j:slf4j-simple:1.7.30' From be023ff59c7b0b59d3f9172b0df7534f0bdf01ce Mon Sep 17 00:00:00 2001 From: Mawmanager Date: Mon, 19 Dec 2022 16:26:28 +0800 Subject: [PATCH 04/19] =?UTF-8?q?Revert=20"Revert=20"wrapper=E4=B8=AD?= =?UTF-8?q?=E7=9A=84Gradle6.5=E7=89=88=E6=9C=AC=E6=94=B9=E4=B8=BA7.4""?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reverts commit a7f343c65d8b915258ecc6874b35238bae1254b9. --- buildSrc/build.gradle | 3 +- gradle/dependencies.gradle | 55 ++++++++++--------- gradle/wrapper/gradle-wrapper.properties | 2 +- oas-contract-tests/build.gradle | 4 +- springfox-boot-starter/build.gradle | 6 +- springfox-core/build.gradle | 2 +- springfox-data-rest/build.gradle | 2 +- springfox-oas/build.gradle | 13 +++-- springfox-petstore-webflux/build.gradle | 2 +- .../build.gradle | 4 +- springfox-spring-web/build.gradle | 3 +- springfox-spring-webmvc/build.gradle | 4 +- springfox-swagger-common/build.gradle | 4 +- springfox-swagger-ui/build.gradle | 2 +- springfox-swagger1/build.gradle | 18 +++--- springfox-swagger2/build.gradle | 14 ++--- swagger-contract-tests-webflux/build.gradle | 2 +- swagger-contract-tests/build.gradle | 4 +- 18 files changed, 74 insertions(+), 70 deletions(-) diff --git a/buildSrc/build.gradle b/buildSrc/build.gradle index 3a6752e85cd..9a18994cb4c 100644 --- a/buildSrc/build.gradle +++ b/buildSrc/build.gradle @@ -23,7 +23,8 @@ repositories { dependencies { implementation gradleApi() implementation localGroovy() //Gradle 2.3 -> Groovy 2.3.9 - testImplementation 'org.spockframework:spock-core:1.3-groovy-2.5@jar' + implementation 'org.opentest4j:opentest4j:1.2.0' + testImplementation 'org.spockframework:spock-core:2.0-groovy-3.0@jar' testImplementation 'junit:junit:4.12' } diff --git a/gradle/dependencies.gradle b/gradle/dependencies.gradle index eee353104ec..aff40793602 100644 --- a/gradle/dependencies.gradle +++ b/gradle/dependencies.gradle @@ -4,9 +4,9 @@ ext { classmate = "1.5.1" classGraph = "4.8.83" equalsverifierVersion = '3.3' - groovy = "2.5.12" + groovy = "4.0.6" jacocoVersion = '0.8.5' - jackson = '2.11.0' + jackson = '2.14.1' joda = "2.10.6" jsonPath = "2.4.0" jsonAssert = "1.5.0" @@ -15,24 +15,25 @@ ext { mockito = "3.3.3" objenesis = "3.1" oasCore = "2.1.2" - servlet = "4.0.1" - slf4j = "1.7.25" + servlet = "6.0.0" + slf4j = "2.0.4" snakeyaml = '1.26' - spock = "1.3-groovy-2.5" - spring = "5.2.7.RELEASE" - springIntegration = "5.2.6.RELEASE" - springHateoas = "1.1.0.RELEASE" - springDataRest = "3.3.0.RELEASE" - springPluginVersion = "2.0.0.RELEASE" + spock = "2.0-groovy-3.0" + spring = "3.0.0" + springWeb = "6.0.2" + springIntegration = "6.0.0" + springHateoas = "2.0.0" + springDataRest = "4.0.0" + springPluginVersion = "3.0.0" swagger2Core = "1.5.20" - springBoot = "2.3.1.RELEASE" + springBoot = "3.0.0" springfoxRfc6570Version = "1.0.0" undercouch = "4.0.4" validationApiVersion = '2.0.1.Final' libs = [ test : [ - "org.springframework:spring-test:${spring}", + "org.springframework:spring-test:${springWeb}", "cglib:cglib-nodep:$cglib", "org.objenesis:objenesis:$objenesis", "org.mockito:mockito-core:${mockito}", @@ -41,12 +42,12 @@ ext { "org.yaml:snakeyaml:${snakeyaml}", "org.spockframework:spock-spring:${spock}", "org.spockframework:spock-core:${spock}", - "org.codehaus.groovy:groovy-all:${groovy}", + "org.apache.groovy:groovy-all:${groovy}", "org.springframework.hateoas:spring-hateoas:${springHateoas}", "nl.jqno.equalsverifier:equalsverifier:${equalsverifierVersion}" ], testNoHateoas : [ - "org.springframework:spring-test:${spring}", + "org.springframework:spring-test:${springWeb}", "cglib:cglib-nodep:$cglib", "org.objenesis:objenesis:$objenesis", "org.mockito:mockito-core:${mockito}", @@ -55,7 +56,7 @@ ext { "org.yaml:snakeyaml:${snakeyaml}", "org.spockframework:spock-spring:${spock}", "org.spockframework:spock-core:${spock}", - "org.codehaus.groovy:groovy-all:${groovy}", + "org.apache.groovy:groovy-all:${groovy}", "nl.jqno.equalsverifier:equalsverifier:${equalsverifierVersion}" ], swagger2Core : [ @@ -67,25 +68,25 @@ ext { "io.swagger.core.v3:swagger-models:${oasCore}" ], spring : [ - "org.springframework.plugin:spring-plugin-core:${springPluginVersion}", "org.springframework.plugin:spring-plugin-metadata:${springPluginVersion}", + "org.springframework.plugin:spring-plugin-core:${springPluginVersion}" ], springProvided : [ - "org.springframework:spring-core:$spring", - "org.springframework:spring-web:$spring", - "org.springframework:spring-context:$spring", + "org.springframework:spring-core:$springWeb", + "org.springframework:spring-web:$springWeb", + "org.springframework:spring-context:$springWeb", ], springProvidedWithMvc : [ - "org.springframework:spring-core:$spring", - "org.springframework:spring-web:$spring", - "org.springframework:spring-webmvc:$spring", - "org.springframework:spring-context:$spring", + "org.springframework:spring-core:$springWeb", + "org.springframework:spring-web:$springWeb", + "org.springframework:spring-webmvc:$springWeb", + "org.springframework:spring-context:$springWeb", ], springProvidedWithFlux : [ - "org.springframework:spring-core:$spring", - "org.springframework:spring-web:$spring", - "org.springframework:spring-webflux:$spring", - "org.springframework:spring-context:$spring", + "org.springframework:spring-core:$springWeb", + "org.springframework:spring-web:$springWeb", + "org.springframework:spring-webflux:$springWeb", + "org.springframework:spring-context:$springWeb", ], springProvidedWithSpringIntegration: [ "org.springframework.integration:spring-integration-http:$springIntegration", diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 622ab64a3cb..41dfb87909a 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-6.5-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.4-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/oas-contract-tests/build.gradle b/oas-contract-tests/build.gradle index e7947d308f1..ee5a7b99b24 100644 --- a/oas-contract-tests/build.gradle +++ b/oas-contract-tests/build.gradle @@ -1,6 +1,6 @@ buildscript { ext { - springBootVersion = '2.3.1.RELEASE' + springBootVersion = '3.0.0' } repositories { mavenCentral() @@ -22,7 +22,7 @@ dependencies { implementation "org.springframework.boot:spring-boot-starter-web" implementation "org.springframework.boot:spring-boot-starter-webflux" implementation "org.springframework.boot:spring-boot-starter-data-rest" - implementation "org.codehaus.groovy:groovy-all:$groovy" + implementation "org.apache.groovy:groovy-all:$groovy" implementation 'org.slf4j:slf4j-simple:1.7.30' implementation "javax.validation:validation-api:$validationApiVersion" diff --git a/springfox-boot-starter/build.gradle b/springfox-boot-starter/build.gradle index b81ce6ec849..1e2b0b15cd0 100644 --- a/springfox-boot-starter/build.gradle +++ b/springfox-boot-starter/build.gradle @@ -14,10 +14,10 @@ dependencies { api libs.spring compileOnly libs.springProvidedWithMvc - compileOnly "org.springframework:spring-webflux:$spring" + compileOnly "org.springframework:spring-webflux:$springWeb" compileOnly libs.springBootProvided compileOnly libs.clientProvided - compileOnly "javax.servlet:javax.servlet-api:$servlet" - annotationProcessor "org.springframework.boot:spring-boot-configuration-processor:2.3.1.RELEASE" + compileOnly "jakarta.servlet:jakarta.servlet-api:$servlet" + annotationProcessor "org.springframework.boot:spring-boot-configuration-processor:3.0.0" } diff --git a/springfox-core/build.gradle b/springfox-core/build.gradle index ccf7ca9933b..d3a44b59741 100644 --- a/springfox-core/build.gradle +++ b/springfox-core/build.gradle @@ -19,7 +19,7 @@ dependencies { testImplementation libs.test testImplementation libs.clientProvided - testImplementation "javax.servlet:javax.servlet-api:$servlet" + testImplementation "jakarta.servlet:jakarta.servlet-api:$servlet" testImplementation libs.springProvidedWithMvc } \ No newline at end of file diff --git a/springfox-data-rest/build.gradle b/springfox-data-rest/build.gradle index 9d42b06886e..e1f60ffccfc 100644 --- a/springfox-data-rest/build.gradle +++ b/springfox-data-rest/build.gradle @@ -21,7 +21,7 @@ dependencies { compileOnly libs.springBootProvided compileOnly libs.springProvidedWithMvc - compileOnly "javax.servlet:javax.servlet-api:$servlet" + compileOnly "jakarta.servlet:jakarta.servlet-api:$servlet" testImplementation libs.test } diff --git a/springfox-oas/build.gradle b/springfox-oas/build.gradle index 9a8f4e098f4..d2e9d1f15d7 100644 --- a/springfox-oas/build.gradle +++ b/springfox-oas/build.gradle @@ -1,6 +1,6 @@ -plugins { - id "net.ltgt.apt-idea" version "0.21" -} +//plugins { +// id "net.ltgt.apt-idea" version "0.21" +//} ext { limits = [ @@ -14,7 +14,6 @@ ext { } dependencies { - api libs.oasCore api project(':springfox-spi') api project(':springfox-schema') api project(':springfox-core') @@ -24,14 +23,15 @@ dependencies { api project(':springfox-swagger-common') api libs.core api libs.spring + api libs.oasCore implementation "org.mapstruct:mapstruct:$mapstruct" annotationProcessor "org.mapstruct:mapstruct-processor:$mapstruct" compileOnly libs.springProvidedWithMvc - compileOnly "org.springframework:spring-webflux:$spring" + compileOnly "org.springframework:spring-webflux:$springWeb" compileOnly "org.springframework.boot:spring-boot-autoconfigure:$springBoot" - compileOnly "javax.servlet:javax.servlet-api:$servlet" + compileOnly "jakarta.servlet:jakarta.servlet-api:$servlet" compileOnly libs.clientProvided testImplementation project(':springfox-core').sourceSets.test.output @@ -48,4 +48,5 @@ compileJava { "-Amapstruct.defaultComponentModel=spring", "-Amapstruct.unmappedTargetPolicy=ERROR" ] + } \ No newline at end of file diff --git a/springfox-petstore-webflux/build.gradle b/springfox-petstore-webflux/build.gradle index c8df03a5149..c5a02bdee3b 100644 --- a/springfox-petstore-webflux/build.gradle +++ b/springfox-petstore-webflux/build.gradle @@ -2,7 +2,7 @@ dependencies { implementation libs.core implementation libs.spring implementation libs.springProvidedWithMvc - compileOnly "org.springframework:spring-webflux:$spring" + compileOnly "org.springframework:spring-webflux:$springWeb" implementation libs.swagger2Core diff --git a/springfox-spring-integration-webmvc/build.gradle b/springfox-spring-integration-webmvc/build.gradle index 30f94f0ad32..06e8c80914c 100644 --- a/springfox-spring-integration-webmvc/build.gradle +++ b/springfox-spring-integration-webmvc/build.gradle @@ -20,7 +20,7 @@ dependencies { compileOnly libs.clientProvided compileOnly libs.springProvidedWithSpringIntegration - compileOnly "javax.servlet:javax.servlet-api:$servlet" + compileOnly "jakarta.servlet:jakarta.servlet-api:$servlet" testImplementation "javax.validation:validation-api:$validationApiVersion" testImplementation project(':springfox-core') @@ -30,6 +30,6 @@ dependencies { testImplementation libs.swagger2Core testImplementation project(':springfox-core').sourceSets.test.output testImplementation project(':springfox-schema').sourceSets.test.output - testImplementation "javax.servlet:javax.servlet-api:$servlet" + testImplementation "jakarta.servlet:jakarta.servlet-api:$servlet" implementation libs.clientProvided } diff --git a/springfox-spring-web/build.gradle b/springfox-spring-web/build.gradle index 4e208d6fdae..b6fe30e4cf2 100644 --- a/springfox-spring-web/build.gradle +++ b/springfox-spring-web/build.gradle @@ -17,6 +17,7 @@ dependencies { api "io.github.classgraph:classgraph:$classGraph" api libs.core api libs.spring + api libs.springProvided compileOnly libs.springProvided compileOnly libs.clientProvided @@ -27,7 +28,7 @@ dependencies { testImplementation project(':springfox-core').sourceSets.test.output testImplementation project(':springfox-schema').sourceSets.test.output testImplementation "javax.validation:validation-api:$validationApiVersion" - testImplementation "javax.servlet:javax.servlet-api:$servlet" + testImplementation "jakarta.servlet:jakarta.servlet-api:$servlet" testImplementation libs.clientProvided } diff --git a/springfox-spring-webmvc/build.gradle b/springfox-spring-webmvc/build.gradle index e7b46c8599e..423a5aa1299 100644 --- a/springfox-spring-webmvc/build.gradle +++ b/springfox-spring-webmvc/build.gradle @@ -21,7 +21,7 @@ dependencies { compileOnly libs.springProvidedWithMvc compileOnly libs.clientProvided compileOnly libs.springBootProvided - compileOnly "javax.servlet:javax.servlet-api:$servlet" + compileOnly "jakarta.servlet:jakarta.servlet-api:$servlet" testImplementation libs.test testImplementation libs.swagger2Core @@ -29,7 +29,7 @@ dependencies { testImplementation project(':springfox-core').sourceSets.test.output testImplementation project(':springfox-schema').sourceSets.test.output testImplementation "javax.validation:validation-api:$validationApiVersion" - testImplementation "javax.servlet:javax.servlet-api:$servlet" + testImplementation "jakarta.servlet:jakarta.servlet-api:$servlet" testImplementation libs.springProvidedWithMvc testImplementation libs.clientProvided testImplementation libs.springBootProvided diff --git a/springfox-swagger-common/build.gradle b/springfox-swagger-common/build.gradle index 2a7e1e9728a..7f9204006e6 100644 --- a/springfox-swagger-common/build.gradle +++ b/springfox-swagger-common/build.gradle @@ -22,7 +22,7 @@ dependencies { compileOnly libs.clientProvided compileOnly libs.springProvidedWithMvc - compileOnly "javax.servlet:javax.servlet-api:$servlet" + compileOnly "jakarta.servlet:jakarta.servlet-api:$servlet" testImplementation project(':springfox-core') @@ -33,7 +33,7 @@ dependencies { testImplementation libs.test testImplementation "org.skyscreamer:jsonassert:${jsonAssert}" - testImplementation "javax.servlet:javax.servlet-api:$servlet" + testImplementation "jakarta.servlet:jakarta.servlet-api:$servlet" testImplementation libs.clientProvided testImplementation libs.springProvidedWithMvc } \ No newline at end of file diff --git a/springfox-swagger-ui/build.gradle b/springfox-swagger-ui/build.gradle index 88cfcd27073..29cad9524ce 100644 --- a/springfox-swagger-ui/build.gradle +++ b/springfox-swagger-ui/build.gradle @@ -17,7 +17,7 @@ import org.apache.tools.ant.filters.ReplaceTokens */ plugins { id "de.undercouch.download" version "4.1.0" - id "com.github.node-gradle.node" version "2.2.4" + id "com.github.node-gradle.node" version "3.5.0" } ext { diff --git a/springfox-swagger1/build.gradle b/springfox-swagger1/build.gradle index 50e964cc49f..66895da3abc 100644 --- a/springfox-swagger1/build.gradle +++ b/springfox-swagger1/build.gradle @@ -1,6 +1,6 @@ -plugins { - id "net.ltgt.apt-idea" version "0.21" -} +//plugins { +// id "net.ltgt.apt-idea" version "0.21" +//} ext { limits = [ @@ -42,7 +42,7 @@ dependencies { api libs.swagger2Core compileOnly libs.springProvidedWithMvc compileOnly libs.clientProvided - compileOnly "javax.servlet:javax.servlet-api:$servlet" + compileOnly "jakarta.servlet:jakarta.servlet-api:$servlet" implementation "org.mapstruct:mapstruct:$mapstruct" annotationProcessor "org.mapstruct:mapstruct-processor:$mapstruct" @@ -55,12 +55,12 @@ dependencies { testImplementation libs.test testImplementation libs.springProvidedWithMvc testImplementation libs.clientProvided - testImplementation "javax.servlet:javax.servlet-api:$servlet" + testImplementation "jakarta.servlet:jakarta.servlet-api:$servlet" - integrationTestCompile sourceSets.main.output - integrationTestCompile sourceSets.test.output - integrationTestCompile configurations.testImplementation - integrationTestRuntime configurations.testRuntime + integrationTestImplementation sourceSets.main.output + integrationTestImplementation sourceSets.test.output +// integrationTestImplementation configurations.testImplementation +// integrationTestImplementation configurations.testRuntime } compileJava { diff --git a/springfox-swagger2/build.gradle b/springfox-swagger2/build.gradle index 2db7716a230..20f9b0de680 100644 --- a/springfox-swagger2/build.gradle +++ b/springfox-swagger2/build.gradle @@ -1,6 +1,6 @@ -plugins { - id "net.ltgt.apt-idea" version "0.21" -} +//plugins { +// id "net.ltgt.apt-idea" version "0.21" +//} ext { limits = [ @@ -25,11 +25,11 @@ dependencies { api libs.spring api libs.swagger2Core - compileOnly "org.springframework:spring-webflux:$spring" + compileOnly "org.springframework:spring-webflux:$springWeb" compileOnly libs.springBootProvided compileOnly libs.springProvidedWithMvc compileOnly libs.clientProvided - compileOnly "javax.servlet:javax.servlet-api:$servlet" + compileOnly "jakarta.servlet:jakarta.servlet-api:$servlet" implementation "org.mapstruct:mapstruct:$mapstruct" @@ -41,8 +41,8 @@ dependencies { testImplementation project(':springfox-swagger-common').sourceSets.test.output testImplementation project(':springfox-spring-web').sourceSets.test.output testImplementation project(':springfox-spring-webmvc').sourceSets.test.output - testImplementation "javax.servlet:javax.servlet-api:$servlet" - testImplementation "org.springframework:spring-webflux:$spring" + testImplementation "jakarta.servlet:jakarta.servlet-api:$servlet" + testImplementation "org.springframework:spring-webflux:$springWeb" testImplementation libs.springProvidedWithMvc testImplementation libs.clientProvided diff --git a/swagger-contract-tests-webflux/build.gradle b/swagger-contract-tests-webflux/build.gradle index 534c43d402f..f241af0c417 100644 --- a/swagger-contract-tests-webflux/build.gradle +++ b/swagger-contract-tests-webflux/build.gradle @@ -1,6 +1,6 @@ buildscript { ext { - springBootVersion = '2.3.1.RELEASE' + springBootVersion = '3.0.0' } repositories { mavenCentral() diff --git a/swagger-contract-tests/build.gradle b/swagger-contract-tests/build.gradle index 5e03d1225a9..70aa28fd962 100644 --- a/swagger-contract-tests/build.gradle +++ b/swagger-contract-tests/build.gradle @@ -1,6 +1,6 @@ buildscript { ext { - springBootVersion = '2.3.1.RELEASE' + springBootVersion = '3.0.0' } repositories { mavenCentral() @@ -23,7 +23,7 @@ dependencies { implementation "org.springframework.boot:spring-boot-starter-data-rest" implementation "org.springframework.boot:spring-boot-starter-data-jpa" implementation "com.h2database:h2" - implementation "org.codehaus.groovy:groovy-all:$groovy" + implementation "org.apache.groovy:groovy-all:$groovy" implementation libs.clientProvided implementation "javax.validation:validation-api:$validationApiVersion" implementation 'org.slf4j:slf4j-simple:1.7.30' From 1edf74cf7a084d6ab030374d126157125278e690 Mon Sep 17 00:00:00 2001 From: Mawmanager Date: Mon, 19 Dec 2022 16:34:20 +0800 Subject: [PATCH 05/19] =?UTF-8?q?javax.servlet=E5=8D=87=E7=BA=A7=E4=B8=BAj?= =?UTF-8?q?akarta.servlet?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../springfox/test/contract/oas/api/ApiUtil.java | 3 ++- .../test/contract/oas/api/ExceptionTranslator.java | 2 +- .../test/contract/oas/api/PetApiController.java | 2 +- .../test/contract/oas/api/PetApiDelegate.java | 2 +- .../springfox/test/contract/oas/api/StoreApi.java | 2 +- .../test/contract/oas/api/StoreApiController.java | 2 +- .../test/contract/oas/api/StoreApiDelegate.java | 2 +- .../springfox/test/contract/oas/api/UserApi.java | 2 +- .../test/contract/oas/api/UserApiController.java | 2 +- .../test/contract/oas/api/UserApiDelegate.java | 2 +- .../test/contract/oas/bugs/BugsController.java | 4 ++-- .../springfox/test/contract/oas/model/Category.java | 2 +- .../test/contract/oas/model/ModelApiResponse.java | 2 +- .../springfox/test/contract/oas/model/Order.java | 2 +- .../java/springfox/test/contract/oas/model/Tag.java | 2 +- .../java/springfox/test/contract/oas/model/User.java | 2 +- .../data/rest/BasePathAwareServicesProvider.java | 2 +- .../spring/data/rest/EntityServicesProvider.java | 2 +- .../oas/web/ForwardedHeaderExtractingRequest.java | 2 +- .../oas/web/ForwardedPrefixExtractor.java | 2 +- .../oas/web/OpenApiControllerWebMvc.java | 5 ++++- ...ebMvcBasePathAndHostnameTransformationFilter.java | 2 +- .../oas/web/WebMvcOpenApiTransformationFilter.java | 2 +- .../documentation/spi/service/contexts/Defaults.java | 10 +++++----- ...pringIntegrationWebMvcRequestHandlerProvider.java | 2 +- .../SpringIntegrationWebMvcRequestHandlerSpec.groovy | 4 ++-- ...ntegrationWebMvcRequestHandlerProviderSpec.groovy | 4 ++-- .../documentation/spring/web/dummy/DummyClass.java | 4 ++-- .../spring/web/dummy/controllers/BugsController.java | 2 +- .../web/plugins/WebMvcRequestHandlerProvider.java | 2 +- .../spring/web/mixins/RequestMappingSupport.groovy | 2 +- .../spring/web/paths/DefaultPathProviderSpec.groovy | 2 +- .../web/paths/RelativeSwaggerPathProviderSpec.groovy | 2 +- .../spring/web/plugins/DocketSpec.groovy | 2 +- .../spring/web/readers/ApiModelReaderSpec.groovy | 2 +- .../parameter/OperationParameterReaderSpec.groovy | 10 +++++----- .../swagger/common/HostNameProvider.java | 6 +++--- .../swagger/common/HostNameProviderSpec.groovy | 2 +- .../common/XForwardPrefixPathAdjusterSpec.groovy | 2 +- .../documentation/swagger1/mappers/Mappers.java | 4 ++-- .../swagger1/web/Swagger1Controller.java | 2 +- .../web/scanners/SwaggerApiModelReaderSpec.groovy | 2 +- .../swagger1/integration/DocketSpec.groovy | 2 +- .../parameter/OperationParameterReaderSpec.groovy | 10 +++++----- .../swagger1/web/Swagger1ControllerSpec.groovy | 4 ++-- .../swagger2/web/Swagger2ControllerWebMvc.java | 2 +- ...ebMvcBasePathAndHostnameTransformationFilter.java | 7 ++++--- .../web/WebMvcSwaggerTransformationFilter.java | 2 +- .../swagger2/web/Swagger2ControllerSpec.groovy | 4 ++-- .../test/contract/swagger/BugsController.java | 4 ++-- .../test/contract/swagger/CrossOriginFilter.java | 12 ++++++------ 51 files changed, 85 insertions(+), 80 deletions(-) diff --git a/oas-contract-tests/src/main/java/springfox/test/contract/oas/api/ApiUtil.java b/oas-contract-tests/src/main/java/springfox/test/contract/oas/api/ApiUtil.java index 89649caa121..fcd066d78e9 100644 --- a/oas-contract-tests/src/main/java/springfox/test/contract/oas/api/ApiUtil.java +++ b/oas-contract-tests/src/main/java/springfox/test/contract/oas/api/ApiUtil.java @@ -18,11 +18,12 @@ package springfox.test.contract.oas.api; +import jakarta.servlet.http.HttpServletResponse; import org.springframework.http.HttpStatus; import org.springframework.web.context.request.NativeWebRequest; import org.springframework.web.server.ResponseStatusException; -import javax.servlet.http.HttpServletResponse; + import java.io.IOException; public class ApiUtil { diff --git a/oas-contract-tests/src/main/java/springfox/test/contract/oas/api/ExceptionTranslator.java b/oas-contract-tests/src/main/java/springfox/test/contract/oas/api/ExceptionTranslator.java index 961a91ea4e7..39dc27f299c 100644 --- a/oas-contract-tests/src/main/java/springfox/test/contract/oas/api/ExceptionTranslator.java +++ b/oas-contract-tests/src/main/java/springfox/test/contract/oas/api/ExceptionTranslator.java @@ -40,7 +40,7 @@ public ExceptionTranslator(org.springframework.boot.web.servlet.error.ErrorAttri @ResponseStatus(HttpStatus.BAD_REQUEST) public java.util.Map processConstraintViolationException(WebRequest request) { request.setAttribute( - "javax.servlet.error.status_code", + "jakarta.servlet.error.status_code", HttpStatus.BAD_REQUEST.value(), org.springframework.web.context.request.RequestAttributes.SCOPE_REQUEST); return errorAttributes.getErrorAttributes(request, ErrorAttributeOptions.defaults()); diff --git a/oas-contract-tests/src/main/java/springfox/test/contract/oas/api/PetApiController.java b/oas-contract-tests/src/main/java/springfox/test/contract/oas/api/PetApiController.java index 3dce9f4f318..da4b00c8d55 100644 --- a/oas-contract-tests/src/main/java/springfox/test/contract/oas/api/PetApiController.java +++ b/oas-contract-tests/src/main/java/springfox/test/contract/oas/api/PetApiController.java @@ -24,7 +24,7 @@ import java.util.Optional; -@javax.annotation.Generated(value = "org.springdoc.demo.app2.codegen.languages.SpringCodegen", +@javax.annotation.processing.Generated(value = "org.springdoc.demo.app2.codegen.languages.SpringCodegen", date = "2019-07-11T00:09:29.839+02:00[Europe/Paris]") @RestController diff --git a/oas-contract-tests/src/main/java/springfox/test/contract/oas/api/PetApiDelegate.java b/oas-contract-tests/src/main/java/springfox/test/contract/oas/api/PetApiDelegate.java index 4afa6b1dccf..927302a45dc 100644 --- a/oas-contract-tests/src/main/java/springfox/test/contract/oas/api/PetApiDelegate.java +++ b/oas-contract-tests/src/main/java/springfox/test/contract/oas/api/PetApiDelegate.java @@ -34,7 +34,7 @@ * A delegate to be called by the {@link PetApiController}}. * Implement this interface with a {@link org.springframework.stereotype.Service} annotated class. */ -@javax.annotation.Generated(value = "org.springdoc.demo.app2.codegen.languages.SpringCodegen", +@javax.annotation.processing.Generated(value = "org.springdoc.demo.app2.codegen.languages.SpringCodegen", date = "2019-07-11T00:09:29.839+02:00[Europe/Paris]") public interface PetApiDelegate { diff --git a/oas-contract-tests/src/main/java/springfox/test/contract/oas/api/StoreApi.java b/oas-contract-tests/src/main/java/springfox/test/contract/oas/api/StoreApi.java index 8956700a839..5bec4734c58 100644 --- a/oas-contract-tests/src/main/java/springfox/test/contract/oas/api/StoreApi.java +++ b/oas-contract-tests/src/main/java/springfox/test/contract/oas/api/StoreApi.java @@ -42,7 +42,7 @@ import javax.validation.Valid; import javax.validation.constraints.Max; -@javax.annotation.Generated(value = "org.springdoc.demo.app2.codegen.languages.SpringCodegen", +@javax.annotation.processing.Generated(value = "org.springdoc.demo.app2.codegen.languages.SpringCodegen", date = "2019-07-11T00:09:29.839+02:00[Europe/Paris]") @Tag(name = "store", description = "the store API") diff --git a/oas-contract-tests/src/main/java/springfox/test/contract/oas/api/StoreApiController.java b/oas-contract-tests/src/main/java/springfox/test/contract/oas/api/StoreApiController.java index 98baba7a985..465c08c88bc 100644 --- a/oas-contract-tests/src/main/java/springfox/test/contract/oas/api/StoreApiController.java +++ b/oas-contract-tests/src/main/java/springfox/test/contract/oas/api/StoreApiController.java @@ -24,7 +24,7 @@ import java.util.Optional; -@javax.annotation.Generated(value = "org.springdoc.demo.app2.codegen.languages.SpringCodegen", +@javax.annotation.processing.Generated(value = "org.springdoc.demo.app2.codegen.languages.SpringCodegen", date = "2019-07-11T00:09:29.839+02:00[Europe/Paris]") @RestController diff --git a/oas-contract-tests/src/main/java/springfox/test/contract/oas/api/StoreApiDelegate.java b/oas-contract-tests/src/main/java/springfox/test/contract/oas/api/StoreApiDelegate.java index 9ed9bd59e3e..31648ff8629 100644 --- a/oas-contract-tests/src/main/java/springfox/test/contract/oas/api/StoreApiDelegate.java +++ b/oas-contract-tests/src/main/java/springfox/test/contract/oas/api/StoreApiDelegate.java @@ -29,7 +29,7 @@ * A delegate to be called by the {@link StoreApiController}}. * Implement this interface with a {@link org.springframework.stereotype.Service} annotated class. */ -@javax.annotation.Generated(value = "org.springdoc.demo.app2.codegen.languages.SpringCodegen", +@javax.annotation.processing.Generated(value = "org.springdoc.demo.app2.codegen.languages.SpringCodegen", date = "2019-07-11T00:09:29.839+02:00[Europe/Paris]") public interface StoreApiDelegate { diff --git a/oas-contract-tests/src/main/java/springfox/test/contract/oas/api/UserApi.java b/oas-contract-tests/src/main/java/springfox/test/contract/oas/api/UserApi.java index 2c971b2dae1..f0097056318 100644 --- a/oas-contract-tests/src/main/java/springfox/test/contract/oas/api/UserApi.java +++ b/oas-contract-tests/src/main/java/springfox/test/contract/oas/api/UserApi.java @@ -46,7 +46,7 @@ import javax.validation.constraints.NotNull; -@javax.annotation.Generated(value = "org.springdoc.demo.app2.codegen.languages.SpringCodegen", +@javax.annotation.processing.Generated(value = "org.springdoc.demo.app2.codegen.languages.SpringCodegen", date = "2019-07-11T00:09:29.839+02:00[Europe/Paris]") @Tag(name = "user", description = "the user API") diff --git a/oas-contract-tests/src/main/java/springfox/test/contract/oas/api/UserApiController.java b/oas-contract-tests/src/main/java/springfox/test/contract/oas/api/UserApiController.java index 67c299a35e2..18b8f16f221 100644 --- a/oas-contract-tests/src/main/java/springfox/test/contract/oas/api/UserApiController.java +++ b/oas-contract-tests/src/main/java/springfox/test/contract/oas/api/UserApiController.java @@ -24,7 +24,7 @@ import java.util.Optional; -@javax.annotation.Generated(value = "org.springdoc.demo.app2.codegen.languages.SpringCodegen", +@javax.annotation.processing.Generated(value = "org.springdoc.demo.app2.codegen.languages.SpringCodegen", date = "2019-07-11T00:09:29.839+02:00[Europe/Paris]") @RestController diff --git a/oas-contract-tests/src/main/java/springfox/test/contract/oas/api/UserApiDelegate.java b/oas-contract-tests/src/main/java/springfox/test/contract/oas/api/UserApiDelegate.java index 0ef1a11a89c..af94ecbe573 100644 --- a/oas-contract-tests/src/main/java/springfox/test/contract/oas/api/UserApiDelegate.java +++ b/oas-contract-tests/src/main/java/springfox/test/contract/oas/api/UserApiDelegate.java @@ -29,7 +29,7 @@ * A delegate to be called by the {@link UserApiController}}. * Implement this interface with a {@link org.springframework.stereotype.Service} annotated class. */ -@javax.annotation.Generated(value = "org.springdoc.demo.app2.codegen.languages.SpringCodegen", +@javax.annotation.processing.Generated(value = "org.springdoc.demo.app2.codegen.languages.SpringCodegen", date = "2019-07-11T00:09:29.839+02:00[Europe/Paris]") public interface UserApiDelegate { diff --git a/oas-contract-tests/src/main/java/springfox/test/contract/oas/bugs/BugsController.java b/oas-contract-tests/src/main/java/springfox/test/contract/oas/bugs/BugsController.java index 140e2a11890..27a7416dca7 100644 --- a/oas-contract-tests/src/main/java/springfox/test/contract/oas/bugs/BugsController.java +++ b/oas-contract-tests/src/main/java/springfox/test/contract/oas/bugs/BugsController.java @@ -30,8 +30,8 @@ import springfox.documentation.annotations.ApiIgnore; import springfox.test.contract.oas.model.Pet; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import javax.validation.Valid; import javax.validation.constraints.NotNull; import javax.validation.constraints.Size; diff --git a/oas-contract-tests/src/main/java/springfox/test/contract/oas/model/Category.java b/oas-contract-tests/src/main/java/springfox/test/contract/oas/model/Category.java index e38c4e39fea..a55f6330a82 100644 --- a/oas-contract-tests/src/main/java/springfox/test/contract/oas/model/Category.java +++ b/oas-contract-tests/src/main/java/springfox/test/contract/oas/model/Category.java @@ -26,7 +26,7 @@ * Category */ -@javax.annotation.Generated(value = "org.openapitools.codegen.languages.SpringCodegen", +@javax.annotation.processing.Generated(value = "org.openapitools.codegen.languages.SpringCodegen", date = "2019-11-30T09:49:26.034469-01:00[Atlantic/Azores]") diff --git a/oas-contract-tests/src/main/java/springfox/test/contract/oas/model/ModelApiResponse.java b/oas-contract-tests/src/main/java/springfox/test/contract/oas/model/ModelApiResponse.java index 3a59473543b..85ef7c33a00 100644 --- a/oas-contract-tests/src/main/java/springfox/test/contract/oas/model/ModelApiResponse.java +++ b/oas-contract-tests/src/main/java/springfox/test/contract/oas/model/ModelApiResponse.java @@ -26,7 +26,7 @@ * ModelApiResponse */ -@javax.annotation.Generated(value = "org.openapitools.codegen.languages.SpringCodegen", +@javax.annotation.processing.Generated(value = "org.openapitools.codegen.languages.SpringCodegen", date = "2019-11-30T09:49:26.034469-01:00[Atlantic/Azores]") diff --git a/oas-contract-tests/src/main/java/springfox/test/contract/oas/model/Order.java b/oas-contract-tests/src/main/java/springfox/test/contract/oas/model/Order.java index 578c9f01e1b..e889c6932a3 100644 --- a/oas-contract-tests/src/main/java/springfox/test/contract/oas/model/Order.java +++ b/oas-contract-tests/src/main/java/springfox/test/contract/oas/model/Order.java @@ -29,7 +29,7 @@ * Order */ -@javax.annotation.Generated(value = "org.openapitools.codegen.languages.SpringCodegen", +@javax.annotation.processing.Generated(value = "org.openapitools.codegen.languages.SpringCodegen", date = "2019-11-30T09:49:26.034469-01:00[Atlantic/Azores]") diff --git a/oas-contract-tests/src/main/java/springfox/test/contract/oas/model/Tag.java b/oas-contract-tests/src/main/java/springfox/test/contract/oas/model/Tag.java index 80371d14c0e..d0a012338bc 100644 --- a/oas-contract-tests/src/main/java/springfox/test/contract/oas/model/Tag.java +++ b/oas-contract-tests/src/main/java/springfox/test/contract/oas/model/Tag.java @@ -26,7 +26,7 @@ * Tag */ -@javax.annotation.Generated(value = "org.openapitools.codegen.languages.SpringCodegen", +@javax.annotation.processing.Generated(value = "org.openapitools.codegen.languages.SpringCodegen", date = "2019-11-30T09:49:26.034469-01:00[Atlantic/Azores]") diff --git a/oas-contract-tests/src/main/java/springfox/test/contract/oas/model/User.java b/oas-contract-tests/src/main/java/springfox/test/contract/oas/model/User.java index f70883736ab..67fd04873e0 100644 --- a/oas-contract-tests/src/main/java/springfox/test/contract/oas/model/User.java +++ b/oas-contract-tests/src/main/java/springfox/test/contract/oas/model/User.java @@ -26,7 +26,7 @@ * User */ -@javax.annotation.Generated(value = "org.openapitools.codegen.languages.SpringCodegen", +@javax.annotation.processing.Generated(value = "org.openapitools.codegen.languages.SpringCodegen", date = "2019-11-30T09:49:26.034469-01:00[Atlantic/Azores]") diff --git a/springfox-data-rest/src/main/java/springfox/documentation/spring/data/rest/BasePathAwareServicesProvider.java b/springfox-data-rest/src/main/java/springfox/documentation/spring/data/rest/BasePathAwareServicesProvider.java index dbcbf65f43a..e62204bee6f 100644 --- a/springfox-data-rest/src/main/java/springfox/documentation/spring/data/rest/BasePathAwareServicesProvider.java +++ b/springfox-data-rest/src/main/java/springfox/documentation/spring/data/rest/BasePathAwareServicesProvider.java @@ -31,7 +31,7 @@ import springfox.documentation.spring.web.WebMvcRequestHandler; import springfox.documentation.spring.web.readers.operation.HandlerMethodResolver; -import javax.servlet.ServletContext; +import jakarta.servlet.ServletContext; import java.util.ArrayList; import java.util.List; import java.util.Map; diff --git a/springfox-data-rest/src/main/java/springfox/documentation/spring/data/rest/EntityServicesProvider.java b/springfox-data-rest/src/main/java/springfox/documentation/spring/data/rest/EntityServicesProvider.java index deef78b84b2..a32c9d3b5b1 100644 --- a/springfox-data-rest/src/main/java/springfox/documentation/spring/data/rest/EntityServicesProvider.java +++ b/springfox-data-rest/src/main/java/springfox/documentation/spring/data/rest/EntityServicesProvider.java @@ -30,7 +30,7 @@ import springfox.documentation.RequestHandler; import springfox.documentation.spi.service.RequestHandlerProvider; -import javax.servlet.ServletContext; +import jakarta.servlet.ServletContext; import java.util.ArrayList; import java.util.Collection; import java.util.List; diff --git a/springfox-oas/src/main/java/springfox/documentation/oas/web/ForwardedHeaderExtractingRequest.java b/springfox-oas/src/main/java/springfox/documentation/oas/web/ForwardedHeaderExtractingRequest.java index cf11a6afed9..5c82cfadf4a 100644 --- a/springfox-oas/src/main/java/springfox/documentation/oas/web/ForwardedHeaderExtractingRequest.java +++ b/springfox-oas/src/main/java/springfox/documentation/oas/web/ForwardedHeaderExtractingRequest.java @@ -22,13 +22,13 @@ */ package springfox.documentation.oas.web; +import jakarta.servlet.http.HttpServletRequest; import org.springframework.http.HttpRequest; import org.springframework.http.server.ServletServerHttpRequest; import org.springframework.web.util.UriComponents; import org.springframework.web.util.UriComponentsBuilder; import org.springframework.web.util.UrlPathHelper; -import javax.servlet.http.HttpServletRequest; import java.util.function.Supplier; class ForwardedHeaderExtractingRequest { diff --git a/springfox-oas/src/main/java/springfox/documentation/oas/web/ForwardedPrefixExtractor.java b/springfox-oas/src/main/java/springfox/documentation/oas/web/ForwardedPrefixExtractor.java index 1846add8376..bfcfd356659 100644 --- a/springfox-oas/src/main/java/springfox/documentation/oas/web/ForwardedPrefixExtractor.java +++ b/springfox-oas/src/main/java/springfox/documentation/oas/web/ForwardedPrefixExtractor.java @@ -24,7 +24,7 @@ import org.springframework.web.util.UrlPathHelper; -import javax.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletRequest; import java.util.Enumeration; import java.util.function.Supplier; diff --git a/springfox-oas/src/main/java/springfox/documentation/oas/web/OpenApiControllerWebMvc.java b/springfox-oas/src/main/java/springfox/documentation/oas/web/OpenApiControllerWebMvc.java index 10cc5e9222c..bce0c018ec9 100644 --- a/springfox-oas/src/main/java/springfox/documentation/oas/web/OpenApiControllerWebMvc.java +++ b/springfox-oas/src/main/java/springfox/documentation/oas/web/OpenApiControllerWebMvc.java @@ -24,6 +24,8 @@ import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication; import org.springframework.context.annotation.Conditional; +import org.springframework.core.Ordered; +import org.springframework.core.annotation.Order; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.plugin.core.PluginRegistry; @@ -41,7 +43,7 @@ import springfox.documentation.spring.web.json.JsonSerializer; import springfox.documentation.spring.web.plugins.Docket; -import javax.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletRequest; import java.util.List; import java.util.Optional; @@ -53,6 +55,7 @@ @RequestMapping(OPEN_API_SPECIFICATION_PATH) @ConditionalOnWebApplication(type = ConditionalOnWebApplication.Type.SERVLET) @Conditional(OnServletBasedWebApplication.class) +@Order(Ordered.HIGHEST_PRECEDENCE) public class OpenApiControllerWebMvc { private final DocumentationCache documentationCache; diff --git a/springfox-oas/src/main/java/springfox/documentation/oas/web/WebMvcBasePathAndHostnameTransformationFilter.java b/springfox-oas/src/main/java/springfox/documentation/oas/web/WebMvcBasePathAndHostnameTransformationFilter.java index 5884c2ce35d..25010afac9f 100644 --- a/springfox-oas/src/main/java/springfox/documentation/oas/web/WebMvcBasePathAndHostnameTransformationFilter.java +++ b/springfox-oas/src/main/java/springfox/documentation/oas/web/WebMvcBasePathAndHostnameTransformationFilter.java @@ -9,7 +9,7 @@ import org.springframework.web.util.UrlPathHelper; import springfox.documentation.spi.DocumentationType; -import javax.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletRequest; import java.util.Collections; diff --git a/springfox-oas/src/main/java/springfox/documentation/oas/web/WebMvcOpenApiTransformationFilter.java b/springfox-oas/src/main/java/springfox/documentation/oas/web/WebMvcOpenApiTransformationFilter.java index dbdec08148a..838e36ee58b 100644 --- a/springfox-oas/src/main/java/springfox/documentation/oas/web/WebMvcOpenApiTransformationFilter.java +++ b/springfox-oas/src/main/java/springfox/documentation/oas/web/WebMvcOpenApiTransformationFilter.java @@ -1,6 +1,6 @@ package springfox.documentation.oas.web; -import javax.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletRequest; public interface WebMvcOpenApiTransformationFilter extends OpenApiTransformationFilter { } diff --git a/springfox-spi/src/main/java/springfox/documentation/spi/service/contexts/Defaults.java b/springfox-spi/src/main/java/springfox/documentation/spi/service/contexts/Defaults.java index 70375147b92..113351b6e41 100644 --- a/springfox-spi/src/main/java/springfox/documentation/spi/service/contexts/Defaults.java +++ b/springfox-spi/src/main/java/springfox/documentation/spi/service/contexts/Defaults.java @@ -317,11 +317,11 @@ private void initIgnorableTypes() { ignored.add(UriComponentsBuilder.class); ignored.add(ApiIgnore.class); //Used to ignore parameters - classFor("javax.servlet.ServletRequest").ifPresent(it -> ignored.add(it)); - classFor("javax.servlet.ServletResponse").ifPresent(it -> ignored.add(it)); - classFor("javax.servlet.http.HttpServletRequest").ifPresent(it -> ignored.add(it)); - classFor("javax.servlet.http.HttpServletResponse").ifPresent(it -> ignored.add(it)); - classFor("javax.servlet.ServletContext").ifPresent(it -> ignored.add(it)); + classFor("jakarta.servlet.ServletRequest").ifPresent(it -> ignored.add(it)); + classFor("jakarta.servlet.ServletResponse").ifPresent(it -> ignored.add(it)); + classFor("jakarta.servlet.http.HttpServletRequest").ifPresent(it -> ignored.add(it)); + classFor("jakarta.servlet.http.HttpServletResponse").ifPresent(it -> ignored.add(it)); + classFor("jakarta.servlet.ServletContext").ifPresent(it -> ignored.add(it)); } Optional classFor(String className) { diff --git a/springfox-spring-integration-webmvc/src/main/java/springfox/documentation/spring/web/plugins/SpringIntegrationWebMvcRequestHandlerProvider.java b/springfox-spring-integration-webmvc/src/main/java/springfox/documentation/spring/web/plugins/SpringIntegrationWebMvcRequestHandlerProvider.java index dc1882562a8..a6b6f04d8ae 100644 --- a/springfox-spring-integration-webmvc/src/main/java/springfox/documentation/spring/web/plugins/SpringIntegrationWebMvcRequestHandlerProvider.java +++ b/springfox-spring-integration-webmvc/src/main/java/springfox/documentation/spring/web/plugins/SpringIntegrationWebMvcRequestHandlerProvider.java @@ -29,7 +29,7 @@ import springfox.documentation.spring.web.SpringIntegrationWebMvcRequestHandler; import springfox.documentation.spring.web.readers.operation.HandlerMethodResolver; -import javax.servlet.ServletContext; +import jakarta.servlet.ServletContext; import java.util.Collection; import java.util.List; import java.util.Map; diff --git a/springfox-spring-integration-webmvc/src/test/groovy/springfox/documentation/spring/web/SpringIntegrationWebMvcRequestHandlerSpec.groovy b/springfox-spring-integration-webmvc/src/test/groovy/springfox/documentation/spring/web/SpringIntegrationWebMvcRequestHandlerSpec.groovy index a2d5b187100..1d473340b42 100644 --- a/springfox-spring-integration-webmvc/src/test/groovy/springfox/documentation/spring/web/SpringIntegrationWebMvcRequestHandlerSpec.groovy +++ b/springfox-spring-integration-webmvc/src/test/groovy/springfox/documentation/spring/web/SpringIntegrationWebMvcRequestHandlerSpec.groovy @@ -32,8 +32,8 @@ import springfox.documentation.service.ResolvedMethodParameter import springfox.documentation.spring.web.plugins.SpringIntegrationParametersProvider import springfox.documentation.spring.web.readers.operation.HandlerMethodResolver -import javax.servlet.http.HttpServletRequest -import javax.servlet.http.HttpServletResponse +import jakarta.servlet.http.HttpServletRequest +import jakarta.servlet.http.HttpServletResponse class SpringIntegrationWebMvcRequestHandlerSpec extends Specification { diff --git a/springfox-spring-integration-webmvc/src/test/groovy/springfox/documentation/spring/web/plugins/SpringIntegrationWebMvcRequestHandlerProviderSpec.groovy b/springfox-spring-integration-webmvc/src/test/groovy/springfox/documentation/spring/web/plugins/SpringIntegrationWebMvcRequestHandlerProviderSpec.groovy index faf74939fa9..1c26fc32a52 100644 --- a/springfox-spring-integration-webmvc/src/test/groovy/springfox/documentation/spring/web/plugins/SpringIntegrationWebMvcRequestHandlerProviderSpec.groovy +++ b/springfox-spring-integration-webmvc/src/test/groovy/springfox/documentation/spring/web/plugins/SpringIntegrationWebMvcRequestHandlerProviderSpec.groovy @@ -28,8 +28,8 @@ import spock.lang.Specification import springfox.documentation.spring.web.SpringIntegrationWebMvcRequestHandler import springfox.documentation.spring.web.readers.operation.HandlerMethodResolver -import javax.servlet.http.HttpServletRequest -import javax.servlet.http.HttpServletResponse +import jakarta.servlet.http.HttpServletRequest +import jakarta.servlet.http.HttpServletResponse class SpringIntegrationWebMvcRequestHandlerProviderSpec extends Specification { def methodResolver = Mock(HandlerMethodResolver) diff --git a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/DummyClass.java b/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/DummyClass.java index 73bfb9e0c04..aff1e3f704f 100644 --- a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/DummyClass.java +++ b/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/DummyClass.java @@ -68,8 +68,8 @@ import springfox.documentation.spring.web.dummy.models.Treeish; import springfox.documentation.spring.web.dummy.models.Wrapper; -import javax.servlet.ServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.ServletRequest; +import jakarta.servlet.http.HttpServletResponse; import java.net.URI; import java.util.Date; import java.util.List; diff --git a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/controllers/BugsController.java b/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/controllers/BugsController.java index 7e89e9698ff..3d7ee74648e 100644 --- a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/controllers/BugsController.java +++ b/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/controllers/BugsController.java @@ -55,7 +55,7 @@ import springfox.documentation.spring.web.dummy.models.LanguageResponse; import springfox.documentation.spring.web.dummy.models.Response; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.http.HttpServletResponse; import javax.validation.Valid; import javax.validation.constraints.NotNull; import javax.validation.constraints.Pattern; diff --git a/springfox-spring-webmvc/src/main/java/springfox/documentation/spring/web/plugins/WebMvcRequestHandlerProvider.java b/springfox-spring-webmvc/src/main/java/springfox/documentation/spring/web/plugins/WebMvcRequestHandlerProvider.java index 605b86928d0..148e3618e86 100644 --- a/springfox-spring-webmvc/src/main/java/springfox/documentation/spring/web/plugins/WebMvcRequestHandlerProvider.java +++ b/springfox-spring-webmvc/src/main/java/springfox/documentation/spring/web/plugins/WebMvcRequestHandlerProvider.java @@ -34,7 +34,7 @@ import springfox.documentation.spring.web.WebMvcRequestHandler; import springfox.documentation.spring.web.readers.operation.HandlerMethodResolver; -import javax.servlet.ServletContext; +import jakarta.servlet.ServletContext; import java.util.List; import java.util.Map; import java.util.Optional; diff --git a/springfox-spring-webmvc/src/test/groovy/springfox/documentation/spring/web/mixins/RequestMappingSupport.groovy b/springfox-spring-webmvc/src/test/groovy/springfox/documentation/spring/web/mixins/RequestMappingSupport.groovy index f3fa88f200f..7d92f836829 100644 --- a/springfox-spring-webmvc/src/test/groovy/springfox/documentation/spring/web/mixins/RequestMappingSupport.groovy +++ b/springfox-spring-webmvc/src/test/groovy/springfox/documentation/spring/web/mixins/RequestMappingSupport.groovy @@ -48,7 +48,7 @@ import springfox.documentation.spring.web.paths.Paths import springfox.documentation.spring.web.readers.operation.CachingOperationNameGenerator import springfox.documentation.spring.web.readers.operation.HandlerMethodResolver -import javax.servlet.ServletContext +import jakarta.servlet.ServletContext trait RequestMappingSupport { diff --git a/springfox-spring-webmvc/src/test/groovy/springfox/documentation/spring/web/paths/DefaultPathProviderSpec.groovy b/springfox-spring-webmvc/src/test/groovy/springfox/documentation/spring/web/paths/DefaultPathProviderSpec.groovy index 1d0463e10ec..750d71b93e1 100644 --- a/springfox-spring-webmvc/src/test/groovy/springfox/documentation/spring/web/paths/DefaultPathProviderSpec.groovy +++ b/springfox-spring-webmvc/src/test/groovy/springfox/documentation/spring/web/paths/DefaultPathProviderSpec.groovy @@ -22,7 +22,7 @@ package springfox.documentation.spring.web.paths import spock.lang.Specification import springfox.documentation.spring.web.mixins.RequestMappingSupport -import javax.servlet.ServletContext +import jakarta.servlet.ServletContext class DefaultPathProviderSpec extends Specification implements RequestMappingSupport { diff --git a/springfox-spring-webmvc/src/test/groovy/springfox/documentation/spring/web/paths/RelativeSwaggerPathProviderSpec.groovy b/springfox-spring-webmvc/src/test/groovy/springfox/documentation/spring/web/paths/RelativeSwaggerPathProviderSpec.groovy index 341329e4983..2afdfb65e8f 100644 --- a/springfox-spring-webmvc/src/test/groovy/springfox/documentation/spring/web/paths/RelativeSwaggerPathProviderSpec.groovy +++ b/springfox-spring-webmvc/src/test/groovy/springfox/documentation/spring/web/paths/RelativeSwaggerPathProviderSpec.groovy @@ -22,7 +22,7 @@ package springfox.documentation.spring.web.paths import spock.lang.Specification import springfox.documentation.spring.web.mixins.RequestMappingSupport -import javax.servlet.ServletContext +import jakarta.servlet.ServletContext class RelativeSwaggerPathProviderSpec extends Specification implements RequestMappingSupport { diff --git a/springfox-spring-webmvc/src/test/groovy/springfox/documentation/spring/web/plugins/DocketSpec.groovy b/springfox-spring-webmvc/src/test/groovy/springfox/documentation/spring/web/plugins/DocketSpec.groovy index 4c32755e2ac..5a747f72503 100644 --- a/springfox-spring-webmvc/src/test/groovy/springfox/documentation/spring/web/plugins/DocketSpec.groovy +++ b/springfox-spring-webmvc/src/test/groovy/springfox/documentation/spring/web/plugins/DocketSpec.groovy @@ -43,7 +43,7 @@ import springfox.documentation.spi.service.contexts.Defaults import springfox.documentation.spi.service.contexts.SecurityContext import springfox.documentation.spring.web.paths.DefaultPathProvider -import javax.servlet.ServletRequest +import jakarta.servlet.ServletRequest import static java.util.Collections.* import static java.util.Optional.* diff --git a/springfox-spring-webmvc/src/test/groovy/springfox/documentation/spring/web/readers/ApiModelReaderSpec.groovy b/springfox-spring-webmvc/src/test/groovy/springfox/documentation/spring/web/readers/ApiModelReaderSpec.groovy index 55a5dd522c5..1ab4ac028ca 100755 --- a/springfox-spring-webmvc/src/test/groovy/springfox/documentation/spring/web/readers/ApiModelReaderSpec.groovy +++ b/springfox-spring-webmvc/src/test/groovy/springfox/documentation/spring/web/readers/ApiModelReaderSpec.groovy @@ -62,7 +62,7 @@ import springfox.documentation.spring.web.plugins.DocumentationPluginsManager import springfox.documentation.spring.web.readers.operation.HandlerMethodResolver import springfox.documentation.spring.web.scanners.ApiModelReader -import javax.servlet.http.HttpServletResponse +import jakarta.servlet.http.HttpServletResponse import java.util.function.Function import java.util.stream.Collectors diff --git a/springfox-spring-webmvc/src/test/groovy/springfox/documentation/spring/web/readers/parameter/OperationParameterReaderSpec.groovy b/springfox-spring-webmvc/src/test/groovy/springfox/documentation/spring/web/readers/parameter/OperationParameterReaderSpec.groovy index ec4f3bbb8ad..4b757254394 100644 --- a/springfox-spring-webmvc/src/test/groovy/springfox/documentation/spring/web/readers/parameter/OperationParameterReaderSpec.groovy +++ b/springfox-spring-webmvc/src/test/groovy/springfox/documentation/spring/web/readers/parameter/OperationParameterReaderSpec.groovy @@ -42,11 +42,11 @@ import springfox.documentation.spring.web.plugins.DocumentationContextSpec import springfox.documentation.spring.web.readers.operation.ContentParameterAggregator import springfox.documentation.spring.web.readers.operation.OperationParameterReader -import javax.servlet.ServletContext -import javax.servlet.ServletRequest -import javax.servlet.ServletResponse -import javax.servlet.http.HttpServletRequest -import javax.servlet.http.HttpServletResponse +import jakarta.servlet.ServletContext +import jakarta.servlet.ServletRequest +import jakarta.servlet.ServletResponse +import jakarta.servlet.http.HttpServletRequest +import jakarta.servlet.http.HttpServletResponse import static springfox.documentation.schema.AlternateTypeRules.* diff --git a/springfox-swagger-common/src/main/java/springfox/documentation/swagger/common/HostNameProvider.java b/springfox-swagger-common/src/main/java/springfox/documentation/swagger/common/HostNameProvider.java index f3d698a9240..234bb48c9f1 100644 --- a/springfox-swagger-common/src/main/java/springfox/documentation/swagger/common/HostNameProvider.java +++ b/springfox-swagger-common/src/main/java/springfox/documentation/swagger/common/HostNameProvider.java @@ -24,10 +24,10 @@ import org.springframework.web.util.UriComponentsBuilder; import org.springframework.web.util.UrlPathHelper; -import javax.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletRequest; -import static org.springframework.util.StringUtils.*; -import static org.springframework.web.servlet.support.ServletUriComponentsBuilder.*; +import static org.springframework.util.StringUtils.hasText; +import static org.springframework.web.servlet.support.ServletUriComponentsBuilder.fromContextPath; public class HostNameProvider { diff --git a/springfox-swagger-common/src/test/groovy/springfox/documentation/swagger/common/HostNameProviderSpec.groovy b/springfox-swagger-common/src/test/groovy/springfox/documentation/swagger/common/HostNameProviderSpec.groovy index e58cbbf0af0..e6f141f7ce0 100644 --- a/springfox-swagger-common/src/test/groovy/springfox/documentation/swagger/common/HostNameProviderSpec.groovy +++ b/springfox-swagger-common/src/test/groovy/springfox/documentation/swagger/common/HostNameProviderSpec.groovy @@ -3,7 +3,7 @@ package springfox.documentation.swagger.common import org.springframework.http.HttpHeaders import spock.lang.Specification -import javax.servlet.http.HttpServletRequest +import jakarta.servlet.http.HttpServletRequest import static java.util.Collections.* import static springfox.documentation.swagger.common.HostNameProvider.* diff --git a/springfox-swagger-common/src/test/groovy/springfox/documentation/swagger/common/XForwardPrefixPathAdjusterSpec.groovy b/springfox-swagger-common/src/test/groovy/springfox/documentation/swagger/common/XForwardPrefixPathAdjusterSpec.groovy index addc26c84a1..e3c481e71e6 100644 --- a/springfox-swagger-common/src/test/groovy/springfox/documentation/swagger/common/XForwardPrefixPathAdjusterSpec.groovy +++ b/springfox-swagger-common/src/test/groovy/springfox/documentation/swagger/common/XForwardPrefixPathAdjusterSpec.groovy @@ -5,7 +5,7 @@ import spock.lang.Unroll import springfox.documentation.common.SpringVersion import springfox.documentation.common.Version -import javax.servlet.http.HttpServletRequest +import jakarta.servlet.http.HttpServletRequest class XForwardPrefixPathAdjusterSpec extends Specification { diff --git a/springfox-swagger1/src/main/java/springfox/documentation/swagger1/mappers/Mappers.java b/springfox-swagger1/src/main/java/springfox/documentation/swagger1/mappers/Mappers.java index dcf5be538a5..609dfbb880b 100644 --- a/springfox-swagger1/src/main/java/springfox/documentation/swagger1/mappers/Mappers.java +++ b/springfox-swagger1/src/main/java/springfox/documentation/swagger1/mappers/Mappers.java @@ -22,7 +22,7 @@ import org.springframework.web.util.UriComponents; import springfox.documentation.swagger1.dto.ApiListing; -import javax.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletRequest; import java.util.AbstractMap; import java.util.List; import java.util.Map; @@ -61,7 +61,7 @@ private static String adjustedBasePath( UriComponents uriComponents, String hostNameOverride, String basePath) { - if (!isEmpty(hostNameOverride)) { + if (hasLength(hostNameOverride)) { int port = uriComponents.getPort(); if (port > -1) { return String.format("%s://%s:%d%s", uriComponents.getScheme(), hostNameOverride, port, basePath); diff --git a/springfox-swagger1/src/main/java/springfox/documentation/swagger1/web/Swagger1Controller.java b/springfox-swagger1/src/main/java/springfox/documentation/swagger1/web/Swagger1Controller.java index 86d4328ac6a..8567eb0968a 100644 --- a/springfox-swagger1/src/main/java/springfox/documentation/swagger1/web/Swagger1Controller.java +++ b/springfox-swagger1/src/main/java/springfox/documentation/swagger1/web/Swagger1Controller.java @@ -37,7 +37,7 @@ import springfox.documentation.swagger1.dto.ResourceListing; import springfox.documentation.swagger1.mappers.ServiceModelToSwaggerMapper; -import javax.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletRequest; import java.util.Collection; import java.util.List; import java.util.Map; diff --git a/springfox-swagger1/src/test/groovy/springfox/documentation/spring/web/scanners/SwaggerApiModelReaderSpec.groovy b/springfox-swagger1/src/test/groovy/springfox/documentation/spring/web/scanners/SwaggerApiModelReaderSpec.groovy index 979c0ec32ad..ef6723aec50 100755 --- a/springfox-swagger1/src/test/groovy/springfox/documentation/spring/web/scanners/SwaggerApiModelReaderSpec.groovy +++ b/springfox-swagger1/src/test/groovy/springfox/documentation/spring/web/scanners/SwaggerApiModelReaderSpec.groovy @@ -49,7 +49,7 @@ import springfox.documentation.spring.web.readers.operation.HandlerMethodResolve import springfox.documentation.swagger.mixins.SwaggerPluginsSupport import springfox.documentation.swagger1.web.SwaggerDefaultConfiguration -import javax.servlet.http.HttpServletResponse +import jakarta.servlet.http.HttpServletResponse import java.util.function.Function import java.util.stream.Collectors diff --git a/springfox-swagger1/src/test/groovy/springfox/documentation/swagger1/integration/DocketSpec.groovy b/springfox-swagger1/src/test/groovy/springfox/documentation/swagger1/integration/DocketSpec.groovy index fdb24f33610..805076e7858 100644 --- a/springfox-swagger1/src/test/groovy/springfox/documentation/swagger1/integration/DocketSpec.groovy +++ b/springfox-swagger1/src/test/groovy/springfox/documentation/swagger1/integration/DocketSpec.groovy @@ -35,7 +35,7 @@ import springfox.documentation.spring.web.plugins.Docket import springfox.documentation.spring.web.plugins.DocumentationContextSpec import springfox.documentation.swagger1.web.SwaggerDefaultConfiguration -import javax.servlet.ServletRequest +import jakarta.servlet.ServletRequest import static java.util.Collections.* import static org.springframework.http.HttpStatus.* diff --git a/springfox-swagger1/src/test/groovy/springfox/documentation/swagger1/readers/parameter/OperationParameterReaderSpec.groovy b/springfox-swagger1/src/test/groovy/springfox/documentation/swagger1/readers/parameter/OperationParameterReaderSpec.groovy index 20bc2c3e927..2ba65728c1f 100644 --- a/springfox-swagger1/src/test/groovy/springfox/documentation/swagger1/readers/parameter/OperationParameterReaderSpec.groovy +++ b/springfox-swagger1/src/test/groovy/springfox/documentation/swagger1/readers/parameter/OperationParameterReaderSpec.groovy @@ -49,11 +49,11 @@ import springfox.documentation.spring.web.readers.parameter.ModelAttributeParame import springfox.documentation.swagger.mixins.SwaggerPluginsSupport import springfox.documentation.swagger1.web.SwaggerDefaultConfiguration -import javax.servlet.ServletContext -import javax.servlet.ServletRequest -import javax.servlet.ServletResponse -import javax.servlet.http.HttpServletRequest -import javax.servlet.http.HttpServletResponse +import jakarta.servlet.ServletContext +import jakarta.servlet.ServletRequest +import jakarta.servlet.ServletResponse +import jakarta.servlet.http.HttpServletRequest +import jakarta.servlet.http.HttpServletResponse import static springfox.documentation.schema.AlternateTypeRules.* diff --git a/springfox-swagger1/src/test/groovy/springfox/documentation/swagger1/web/Swagger1ControllerSpec.groovy b/springfox-swagger1/src/test/groovy/springfox/documentation/swagger1/web/Swagger1ControllerSpec.groovy index 283daf7c5dc..bcf730477c6 100644 --- a/springfox-swagger1/src/test/groovy/springfox/documentation/swagger1/web/Swagger1ControllerSpec.groovy +++ b/springfox-swagger1/src/test/groovy/springfox/documentation/swagger1/web/Swagger1ControllerSpec.groovy @@ -40,8 +40,8 @@ import springfox.documentation.spring.web.scanners.ApiListingScanner import springfox.documentation.swagger1.configuration.SwaggerJacksonModule import springfox.documentation.swagger1.mixins.MapperSupport -import javax.servlet.ServletContext -import javax.servlet.http.HttpServletRequest +import jakarta.servlet.ServletContext +import jakarta.servlet.http.HttpServletRequest class Swagger1ControllerSpec extends DocumentationContextSpec implements MapperSupport, diff --git a/springfox-swagger2/src/main/java/springfox/documentation/swagger2/web/Swagger2ControllerWebMvc.java b/springfox-swagger2/src/main/java/springfox/documentation/swagger2/web/Swagger2ControllerWebMvc.java index 12cc615f753..22cf3f0737f 100644 --- a/springfox-swagger2/src/main/java/springfox/documentation/swagger2/web/Swagger2ControllerWebMvc.java +++ b/springfox-swagger2/src/main/java/springfox/documentation/swagger2/web/Swagger2ControllerWebMvc.java @@ -45,7 +45,7 @@ import springfox.documentation.spring.web.plugins.Docket; import springfox.documentation.swagger2.mappers.ServiceModelToSwagger2Mapper; -import javax.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletRequest; import java.util.List; diff --git a/springfox-swagger2/src/main/java/springfox/documentation/swagger2/web/WebMvcBasePathAndHostnameTransformationFilter.java b/springfox-swagger2/src/main/java/springfox/documentation/swagger2/web/WebMvcBasePathAndHostnameTransformationFilter.java index 083b8709d5b..3414cb331df 100644 --- a/springfox-swagger2/src/main/java/springfox/documentation/swagger2/web/WebMvcBasePathAndHostnameTransformationFilter.java +++ b/springfox-swagger2/src/main/java/springfox/documentation/swagger2/web/WebMvcBasePathAndHostnameTransformationFilter.java @@ -4,10 +4,11 @@ import org.springframework.core.Ordered; import org.springframework.core.annotation.Order; import org.springframework.core.env.Environment; +import org.springframework.util.ObjectUtils; import org.springframework.web.util.UriComponents; import springfox.documentation.spi.DocumentationType; -import javax.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletRequest; import static org.springframework.util.StringUtils.*; import static springfox.documentation.swagger.common.HostNameProvider.*; @@ -29,9 +30,9 @@ public Swagger transform(SwaggerTransformationContext contex "DEFAULT"); context.request().ifPresent(servletRequest -> { UriComponents uriComponents = componentsFrom(servletRequest, swagger.getBasePath()); - String basePath = isEmpty(uriComponents.getPath()) ? "/" : uriComponents.getPath(); + String basePath = ObjectUtils.isEmpty(uriComponents.getPath()) ? "/" : uriComponents.getPath(); swagger.basePath(basePath.replace(servletRequest.getContextPath(), "")); - if (isEmpty(swagger.getHost())) { + if (!hasLength(swagger.getHost())) { swagger.host(hostName(uriComponents, hostNameOverride)); } }); diff --git a/springfox-swagger2/src/main/java/springfox/documentation/swagger2/web/WebMvcSwaggerTransformationFilter.java b/springfox-swagger2/src/main/java/springfox/documentation/swagger2/web/WebMvcSwaggerTransformationFilter.java index 19385f7b9f1..34f9dffbae4 100644 --- a/springfox-swagger2/src/main/java/springfox/documentation/swagger2/web/WebMvcSwaggerTransformationFilter.java +++ b/springfox-swagger2/src/main/java/springfox/documentation/swagger2/web/WebMvcSwaggerTransformationFilter.java @@ -1,6 +1,6 @@ package springfox.documentation.swagger2.web; -import javax.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletRequest; public interface WebMvcSwaggerTransformationFilter extends SwaggerTransformationFilter { } diff --git a/springfox-swagger2/src/test/groovy/springfox/documentation/swagger2/web/Swagger2ControllerSpec.groovy b/springfox-swagger2/src/test/groovy/springfox/documentation/swagger2/web/Swagger2ControllerSpec.groovy index 7e2df141660..f556eaf523a 100644 --- a/springfox-swagger2/src/test/groovy/springfox/documentation/swagger2/web/Swagger2ControllerSpec.groovy +++ b/springfox-swagger2/src/test/groovy/springfox/documentation/swagger2/web/Swagger2ControllerSpec.groovy @@ -22,8 +22,8 @@ import springfox.documentation.spring.web.scanners.ApiListingScanner import springfox.documentation.swagger2.configuration.Swagger2JacksonModule import springfox.documentation.swagger2.mappers.MapperSupport -import javax.servlet.ServletContext -import javax.servlet.http.HttpServletRequest +import jakarta.servlet.ServletContext +import jakarta.servlet.http.HttpServletRequest import static java.util.Collections.* import static springfox.documentation.spi.service.contexts.Orderings.* diff --git a/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/BugsController.java b/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/BugsController.java index 8829de413b2..755d17a2939 100644 --- a/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/BugsController.java +++ b/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/BugsController.java @@ -64,8 +64,8 @@ import springfox.test.contract.swagger.models.LanguageResponse; import springfox.test.contract.swagger.models.Pet; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import javax.validation.Valid; import javax.validation.constraints.NotNull; import javax.validation.constraints.Pattern; diff --git a/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/CrossOriginFilter.java b/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/CrossOriginFilter.java index 3b7ffc10876..0d4d80b6c6c 100644 --- a/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/CrossOriginFilter.java +++ b/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/CrossOriginFilter.java @@ -23,12 +23,12 @@ import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; -import javax.servlet.Filter; -import javax.servlet.FilterChain; -import javax.servlet.ServletException; -import javax.servlet.ServletRequest; -import javax.servlet.ServletResponse; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.Filter; +import jakarta.servlet.FilterChain; +import jakarta.servlet.ServletException; +import jakarta.servlet.ServletRequest; +import jakarta.servlet.ServletResponse; +import jakarta.servlet.http.HttpServletResponse; import java.io.IOException; /** From eff0b7c6d9c9c0871947bc0ff365bf38b03670de Mon Sep 17 00:00:00 2001 From: Mawmanager Date: Mon, 19 Dec 2022 16:38:45 +0800 Subject: [PATCH 06/19] =?UTF-8?q?[BugFix]=E4=B8=BAspringfox.documentation.?= =?UTF-8?q?swagger.web.ApiResourceController=E7=9A=84API=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?T=E7=B1=BB=E5=9E=8B=E5=8F=82=E6=95=B0=EF=BC=8C=E6=AD=A4?= =?UTF-8?q?=E5=89=8D=E4=BC=9A=E5=AF=BC=E8=87=B4=E5=9C=A8SpringBoot3?= =?UTF-8?q?=E4=B8=AD=E5=90=AF=E5=8A=A8=E5=8F=91=E7=94=9F=E6=8A=A5=E9=94=99?= =?UTF-8?q?=20-----=20[BugFix]=20Adding=20T=20method=20parameters=20to=20t?= =?UTF-8?q?he=20API=20of=20springfox.documentation.swagger.web.ApiResource?= =?UTF-8?q?Controller,=20which=20previously=20caused=20an=20error=20when?= =?UTF-8?q?=20starting=20in=20SpringBoot3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../documentation/swagger/web/ApiResourceController.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/springfox-swagger-common/src/main/java/springfox/documentation/swagger/web/ApiResourceController.java b/springfox-swagger-common/src/main/java/springfox/documentation/swagger/web/ApiResourceController.java index 4f434999e05..e4b4c665ae7 100644 --- a/springfox-swagger-common/src/main/java/springfox/documentation/swagger/web/ApiResourceController.java +++ b/springfox-swagger-common/src/main/java/springfox/documentation/swagger/web/ApiResourceController.java @@ -61,16 +61,16 @@ public ApiResourceController( @GetMapping(value = "/configuration/security", produces = MediaType.APPLICATION_JSON_VALUE) public ResponseEntity securityConfiguration() { - return new ResponseEntity<>(securityConfiguration, HttpStatus.OK); + return new ResponseEntity(securityConfiguration, HttpStatus.OK); } @GetMapping(value = "/configuration/ui", produces = MediaType.APPLICATION_JSON_VALUE) public ResponseEntity uiConfiguration() { - return new ResponseEntity<>(uiConfiguration, HttpStatus.OK); + return new ResponseEntity(uiConfiguration, HttpStatus.OK); } @GetMapping(produces = MediaType.APPLICATION_JSON_VALUE) public ResponseEntity> swaggerResources() { - return new ResponseEntity<>(swaggerResources.get(), HttpStatus.OK); + return new ResponseEntity>(swaggerResources.get(), HttpStatus.OK); } } From dd94f31db113b2104a3bf6d8f5c5667ccae76860 Mon Sep 17 00:00:00 2001 From: Mawmanager Date: Mon, 19 Dec 2022 17:01:36 +0800 Subject: [PATCH 07/19] =?UTF-8?q?=E4=BD=BF=E7=94=A8!Stringutils.hasLength?= =?UTF-8?q?=E4=BB=A3=E6=9B=BFStringutils.isEmpty=20=E4=BD=BF=E7=94=A8Objec?= =?UTF-8?q?tUtils.isEmpty=E4=BB=A3=E6=9B=BFStringutils.isEmpty=20=E4=B8=BA?= =?UTF-8?q?springfox.test.contract.oas.repository.*<=3F=20extends=20HashMa?= =?UTF-8?q?pRepository>=E5=AE=9E=E7=8E=B0=E6=96=B9=E6=B3=95deleteAllById?= =?UTF-8?q?=20-----?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Use !Stringutils.hasLength instead of Stringutils.isEmpty Use ObjectUtils.isEmpty instead of Stringutils.isEmpty Implements method deleteAllById for springfox.test.contract.oas.repository.* --- .../test/contract/oas/api/PetApiDelegateImpl.java | 4 ++-- .../springfox/test/contract/oas/bugs/Bug3353.java | 4 ++-- .../test/contract/oas/repository/OrderRepository.java | 7 +++++++ .../test/contract/oas/repository/PetRepository.java | 7 +++++++ .../test/contract/oas/repository/UserRepository.java | 7 +++++++ .../documentation/builders/OAuth2SchemeValidator.java | 2 +- .../documentation/builders/ParameterBuilder.java | 2 +- .../builders/PropertySpecificationBuilder.java | 3 ++- .../builders/RequestParameterBuilder.java | 2 +- .../builders/RequestParameterBuilderValidator.java | 5 +++-- .../java/springfox/documentation/schema/Enums.java | 2 +- .../java/springfox/documentation/service/Tags.java | 2 +- .../oas/mappers/VendorExtensionsMapper.java | 2 +- .../documentation/schema/property/bean/Accessors.java | 4 ++-- .../documentation/schema/GenericTypeSpec.groovy | 2 +- .../documentation/spring/web/DescriptionResolver.java | 2 +- .../documentation/spring/web/paths/Paths.java | 10 +++++----- .../web/paths/QueryStringUriTemplateDecorator.java | 4 ++-- ...tractOperationParameterRequestConditionReader.java | 4 ++-- .../parameter/ModelAttributeParameterExpander.java | 2 +- .../web/readers/parameter/ParameterNameReader.java | 2 +- .../spring/web/scanners/ApiModelReader.java | 2 +- .../swagger/common/XForwardPrefixPathAdjuster.java | 8 ++++---- .../readers/operation/OpenApiOperationAuthReader.java | 4 ++-- .../readers/operation/OpenApiResponseReader.java | 2 +- .../readers/operation/OperationAuthReader.java | 4 ++-- .../swagger/readers/operation/ResponseHeaders.java | 11 ++++++----- .../operation/SwaggerResponseMessageReader.java | 2 +- .../readers/operation/VendorExtensionsReader.java | 4 ++-- .../readers/parameter/ApiParamParameterBuilder.java | 2 +- .../swagger/readers/parameter/Examples.java | 8 ++++---- .../parameter/SwaggerExpandedParameterBuilder.java | 2 +- .../swagger/schema/ApiModelProperties.java | 6 +++--- .../swagger/schema/OpenApiSchemaPropertyBuilder.java | 2 +- .../swagger/web/InMemorySwaggerResourcesProvider.java | 2 +- .../swagger/web/SecurityConfiguration.java | 1 + .../parameter/ParameterAnnotationReaderSpec.groovy | 2 +- .../swagger1/mappers/ServiceModelToSwaggerMapper.java | 2 +- .../swagger2/annotations/EnableSwagger2WebMvc.java | 5 +++-- .../swagger2/mappers/VendorExtensionsMapper.java | 2 +- ...ebFluxBasePathAndHostnameTransformationFilter.java | 4 ++-- .../test/contract/swagger/models/Bug3353.java | 4 ++-- 42 files changed, 92 insertions(+), 66 deletions(-) diff --git a/oas-contract-tests/src/main/java/springfox/test/contract/oas/api/PetApiDelegateImpl.java b/oas-contract-tests/src/main/java/springfox/test/contract/oas/api/PetApiDelegateImpl.java index 877a93a096c..c1901f06690 100644 --- a/oas-contract-tests/src/main/java/springfox/test/contract/oas/api/PetApiDelegateImpl.java +++ b/oas-contract-tests/src/main/java/springfox/test/contract/oas/api/PetApiDelegateImpl.java @@ -247,10 +247,10 @@ public ResponseEntity updatePetWithForm( String name, String status) { Pet pet = petRepository.findById(petId).orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_FOUND)); - if (!StringUtils.isEmpty(name)) { + if (StringUtils.hasLength(name)) { pet.name(name); } - if (!StringUtils.isEmpty(name)) { + if (StringUtils.hasLength(name)) { pet.setStatus(Pet.StatusEnum.fromValue(status)); } // return addPet(pet); diff --git a/oas-contract-tests/src/main/java/springfox/test/contract/oas/bugs/Bug3353.java b/oas-contract-tests/src/main/java/springfox/test/contract/oas/bugs/Bug3353.java index 2b0c87838bb..82797ed5bdc 100644 --- a/oas-contract-tests/src/main/java/springfox/test/contract/oas/bugs/Bug3353.java +++ b/oas-contract-tests/src/main/java/springfox/test/contract/oas/bugs/Bug3353.java @@ -144,7 +144,7 @@ public KeyHintBuilder() { public void addProperty( String name, Object property) { - if (!StringUtils.isEmpty(property)) { + if (StringUtils.hasLength(property)) { this.builder.append(property); } } @@ -190,7 +190,7 @@ public QueryParamsBuilder() { public void addToUri( String name, Object property) { - if (!StringUtils.isEmpty(property)) { + if (StringUtils.hasLength(property)) { if (this.builder.length() > 0) { this.builder.append("&"); } diff --git a/oas-contract-tests/src/main/java/springfox/test/contract/oas/repository/OrderRepository.java b/oas-contract-tests/src/main/java/springfox/test/contract/oas/repository/OrderRepository.java index c0aa299ba25..9c38b3edab2 100644 --- a/oas-contract-tests/src/main/java/springfox/test/contract/oas/repository/OrderRepository.java +++ b/oas-contract-tests/src/main/java/springfox/test/contract/oas/repository/OrderRepository.java @@ -32,4 +32,11 @@ public OrderRepository() { Long getEntityId(S order) { return order.getId(); } + + @Override + public void deleteAllById(Iterable longs) { + for (Long aLong : longs) { + entities.remove(aLong); + } + } } diff --git a/oas-contract-tests/src/main/java/springfox/test/contract/oas/repository/PetRepository.java b/oas-contract-tests/src/main/java/springfox/test/contract/oas/repository/PetRepository.java index 20997ea6648..45aad77bac6 100644 --- a/oas-contract-tests/src/main/java/springfox/test/contract/oas/repository/PetRepository.java +++ b/oas-contract-tests/src/main/java/springfox/test/contract/oas/repository/PetRepository.java @@ -66,4 +66,11 @@ public java.util.List findPetsByTags(java.util.List tags) { ) .collect(Collectors.toList()); } + + @Override + public void deleteAllById(Iterable longs) { + for (Long aLong : longs) { + entities.remove(aLong); + } + } } diff --git a/oas-contract-tests/src/main/java/springfox/test/contract/oas/repository/UserRepository.java b/oas-contract-tests/src/main/java/springfox/test/contract/oas/repository/UserRepository.java index c9e4164c59c..a3f53af2a15 100644 --- a/oas-contract-tests/src/main/java/springfox/test/contract/oas/repository/UserRepository.java +++ b/oas-contract-tests/src/main/java/springfox/test/contract/oas/repository/UserRepository.java @@ -32,4 +32,11 @@ public UserRepository() { String getEntityId(S user) { return user.getUsername(); } + + @Override + public void deleteAllById(Iterable strings) { + for (String string : strings) { + entities.remove(string); + } + } } diff --git a/springfox-core/src/main/java/springfox/documentation/builders/OAuth2SchemeValidator.java b/springfox-core/src/main/java/springfox/documentation/builders/OAuth2SchemeValidator.java index 3167ec058de..8c056264501 100644 --- a/springfox-core/src/main/java/springfox/documentation/builders/OAuth2SchemeValidator.java +++ b/springfox-core/src/main/java/springfox/documentation/builders/OAuth2SchemeValidator.java @@ -53,7 +53,7 @@ private void requiredAttribute( List results, String name, String value) { - if (StringUtils.isEmpty(value)) { + if (!StringUtils.hasLength(value)) { results.add(new ValidationResult( "OAuth2Scheme", "name", diff --git a/springfox-core/src/main/java/springfox/documentation/builders/ParameterBuilder.java b/springfox-core/src/main/java/springfox/documentation/builders/ParameterBuilder.java index d53bafc1322..9c8291c36e9 100644 --- a/springfox-core/src/main/java/springfox/documentation/builders/ParameterBuilder.java +++ b/springfox-core/src/main/java/springfox/documentation/builders/ParameterBuilder.java @@ -166,7 +166,7 @@ public ParameterBuilder allowableValues(AllowableValues allowableValues) { */ @Deprecated public ParameterBuilder parameterType(String paramType) { - if (!StringUtils.isEmpty(paramType)) { + if (StringUtils.hasLength(paramType)) { this.paramType = defaultIfAbsent(ParameterType.valueOf(paramType.toUpperCase()), this.paramType); } return this; diff --git a/springfox-core/src/main/java/springfox/documentation/builders/PropertySpecificationBuilder.java b/springfox-core/src/main/java/springfox/documentation/builders/PropertySpecificationBuilder.java index 22631f10549..0df78a242be 100644 --- a/springfox-core/src/main/java/springfox/documentation/builders/PropertySpecificationBuilder.java +++ b/springfox-core/src/main/java/springfox/documentation/builders/PropertySpecificationBuilder.java @@ -1,6 +1,7 @@ package springfox.documentation.builders; import org.springframework.lang.NonNull; +import org.springframework.util.ObjectUtils; import springfox.documentation.schema.ElementFacet; import springfox.documentation.schema.ModelSpecification; import springfox.documentation.schema.NumericElementFacetBuilder; @@ -152,7 +153,7 @@ public PropertySpecification build() { .map(ElementFacetBuilder::build) .filter(Objects::nonNull) .collect(Collectors.toList()); - if (xml != null && isEmpty(xml.getName())) { + if (xml != null && ObjectUtils.isEmpty(xml.getName())) { xml.setName(name); } diff --git a/springfox-core/src/main/java/springfox/documentation/builders/RequestParameterBuilder.java b/springfox-core/src/main/java/springfox/documentation/builders/RequestParameterBuilder.java index d915f89339e..da8de3062fa 100644 --- a/springfox-core/src/main/java/springfox/documentation/builders/RequestParameterBuilder.java +++ b/springfox-core/src/main/java/springfox/documentation/builders/RequestParameterBuilder.java @@ -61,7 +61,7 @@ public RequestParameterBuilder in(ParameterType in) { } public RequestParameterBuilder in(String in) { - if (!StringUtils.isEmpty(in)) { + if (StringUtils.hasLength(in)) { this.in = ParameterType.from(in); } return this; diff --git a/springfox-core/src/main/java/springfox/documentation/builders/RequestParameterBuilderValidator.java b/springfox-core/src/main/java/springfox/documentation/builders/RequestParameterBuilderValidator.java index 7dc8c302d2b..541b30f9487 100644 --- a/springfox-core/src/main/java/springfox/documentation/builders/RequestParameterBuilderValidator.java +++ b/springfox-core/src/main/java/springfox/documentation/builders/RequestParameterBuilderValidator.java @@ -1,5 +1,6 @@ package springfox.documentation.builders; +import org.springframework.util.ObjectUtils; import org.springframework.util.StringUtils; import java.util.ArrayList; @@ -9,14 +10,14 @@ public class RequestParameterBuilderValidator implements Validator validate(RequestParameterBuilder builder) { List results = new ArrayList<>(); - if (StringUtils.isEmpty(builder.name)) { + if (!StringUtils.hasLength(builder.name)) { results.add( new ValidationResult( "RequestParameter", "name", "Parameter name is required")); } - if (StringUtils.isEmpty(builder.in)) { + if (!ObjectUtils.isEmpty(builder.in)) { results.add(new ValidationResult( "RequestParameter", "in", diff --git a/springfox-core/src/main/java/springfox/documentation/schema/Enums.java b/springfox-core/src/main/java/springfox/documentation/schema/Enums.java index 99f8817673e..4568cbb172e 100644 --- a/springfox-core/src/main/java/springfox/documentation/schema/Enums.java +++ b/springfox-core/src/main/java/springfox/documentation/schema/Enums.java @@ -52,7 +52,7 @@ static List getEnumValues(final Class subject) { return transformUnique(subject.getEnumConstants(), (Function) input -> { Optional jsonValue = findJsonValueAnnotatedMethod(input) .map(evaluateJsonValue(input)); - if (jsonValue.isPresent() && !isEmpty(jsonValue.get())) { + if (jsonValue.isPresent() && hasLength(jsonValue.get())) { return jsonValue.get(); } return ((Enum) input).name(); diff --git a/springfox-core/src/main/java/springfox/documentation/service/Tags.java b/springfox-core/src/main/java/springfox/documentation/service/Tags.java index 8ef8aee3325..5a65be0b2bf 100644 --- a/springfox-core/src/main/java/springfox/documentation/service/Tags.java +++ b/springfox-core/src/main/java/springfox/documentation/service/Tags.java @@ -79,6 +79,6 @@ public static Function descriptor( } public static Predicate emptyTags() { - return input -> !isEmpty(input); + return input -> hasLength(input); } } diff --git a/springfox-oas/src/main/java/springfox/documentation/oas/mappers/VendorExtensionsMapper.java b/springfox-oas/src/main/java/springfox/documentation/oas/mappers/VendorExtensionsMapper.java index 8c5d665be6f..25bbd8ced6a 100644 --- a/springfox-oas/src/main/java/springfox/documentation/oas/mappers/VendorExtensionsMapper.java +++ b/springfox-oas/src/main/java/springfox/documentation/oas/mappers/VendorExtensionsMapper.java @@ -71,7 +71,7 @@ public Map mapExtensions(Collection from) { private Function> toExtensionMap() { return input -> { - if (!isEmpty(input.getName())) { + if (!hasLength(input.getName())) { Map map = new HashMap<>(); map.put( input.getName(), diff --git a/springfox-schema/src/main/java/springfox/documentation/schema/property/bean/Accessors.java b/springfox-schema/src/main/java/springfox/documentation/schema/property/bean/Accessors.java index d7df67d6889..e74ecb093e1 100644 --- a/springfox-schema/src/main/java/springfox/documentation/schema/property/bean/Accessors.java +++ b/springfox-schema/src/main/java/springfox/documentation/schema/property/bean/Accessors.java @@ -62,11 +62,11 @@ public static String toCamelCase(String s) { @SuppressWarnings({"CyclomaticComplexity", "NPathComplexity"}) public static String propertyName(Method method) { Optional jsonGetterAnnotation = getterAnnotation(method); - if (jsonGetterAnnotation.isPresent() && !isEmpty(jsonGetterAnnotation.get().value())) { + if (jsonGetterAnnotation.isPresent() && hasLength(jsonGetterAnnotation.get().value())) { return jsonGetterAnnotation.get().value(); } Optional jsonSetterAnnotation = setterAnnotation(method); - if (jsonSetterAnnotation.isPresent() && !isEmpty(jsonSetterAnnotation.get().value())) { + if (jsonSetterAnnotation.isPresent() && hasLength(jsonSetterAnnotation.get().value())) { return jsonSetterAnnotation.get().value(); } Matcher matcher = getter.matcher(method.getName()); diff --git a/springfox-schema/src/test/groovy/springfox/documentation/schema/GenericTypeSpec.groovy b/springfox-schema/src/test/groovy/springfox/documentation/schema/GenericTypeSpec.groovy index b7974bda725..60eda5c8f0a 100644 --- a/springfox-schema/src/test/groovy/springfox/documentation/schema/GenericTypeSpec.groovy +++ b/springfox-schema/src/test/groovy/springfox/documentation/schema/GenericTypeSpec.groovy @@ -166,7 +166,7 @@ class GenericTypeSpec extends SchemaSpecification { } def expectedModelName(String modelName, String hostType = "GenericType") { - if (!isEmpty(modelName)) { + if (hasLength(modelName)) { "$hostType«$modelName»" } else { hostType diff --git a/springfox-spring-web/src/main/java/springfox/documentation/spring/web/DescriptionResolver.java b/springfox-spring-web/src/main/java/springfox/documentation/spring/web/DescriptionResolver.java index 61d9ae01904..94939724c3a 100644 --- a/springfox-spring-web/src/main/java/springfox/documentation/spring/web/DescriptionResolver.java +++ b/springfox-spring-web/src/main/java/springfox/documentation/spring/web/DescriptionResolver.java @@ -41,7 +41,7 @@ public DescriptionResolver(Environment environment) { //Thanks to http://stackoverflow.com/a/37962230/19219 public String resolve(String expression) { - if (isEmpty(expression)) { + if (!hasLength(expression)) { return expression; } diff --git a/springfox-spring-web/src/main/java/springfox/documentation/spring/web/paths/Paths.java b/springfox-spring-web/src/main/java/springfox/documentation/spring/web/paths/Paths.java index 363e658cd68..4c10d93dc9d 100644 --- a/springfox-spring-web/src/main/java/springfox/documentation/spring/web/paths/Paths.java +++ b/springfox-spring-web/src/main/java/springfox/documentation/spring/web/paths/Paths.java @@ -36,7 +36,7 @@ private Paths() { public static String splitCamelCase( String s, String separator) { - if (isEmpty(s)) { + if (!hasLength(s)) { return ""; } return s.replaceAll( @@ -54,14 +54,14 @@ public static String stripSlashes(String stringWithSlashes) { } public static String maybeChompLeadingSlash(String path) { - if (isEmpty(path) || !path.startsWith("/")) { + if (!hasLength(path) || !path.startsWith("/")) { return path; } return path.replaceFirst("^/", ""); } public static String maybeChompTrailingSlash(String path) { - if (isEmpty(path) || !path.endsWith("/")) { + if (!hasLength(path) || !path.endsWith("/")) { return path; } return path.replaceFirst("/$", ""); @@ -69,7 +69,7 @@ public static String maybeChompTrailingSlash(String path) { public static String firstPathSegment(String path) { - if (isEmpty(path)) { + if (!hasLength(path)) { return path; } Matcher matcher = FIRST_PATH_FRAGMENT_REGEX.matcher(path); @@ -106,6 +106,6 @@ public static String contextPath(String contextPath) { } public static String rootPathWhenEmpty(String path) { - return !isEmpty(path) ? path : ROOT; + return hasLength(path) ? path : ROOT; } } diff --git a/springfox-spring-web/src/main/java/springfox/documentation/spring/web/paths/QueryStringUriTemplateDecorator.java b/springfox-spring-web/src/main/java/springfox/documentation/spring/web/paths/QueryStringUriTemplateDecorator.java index 9024e2a37cc..5168481b313 100644 --- a/springfox-spring-web/src/main/java/springfox/documentation/spring/web/paths/QueryStringUriTemplateDecorator.java +++ b/springfox-spring-web/src/main/java/springfox/documentation/spring/web/paths/QueryStringUriTemplateDecorator.java @@ -48,7 +48,7 @@ public Function decorator(final PathContext context) { return input -> { StringBuilder sb = new StringBuilder(input); String prefilled = prefilledQueryParams(context); - if (!isEmpty(prefilled)) { + if (hasLength(prefilled)) { sb.append(requiresContinuation(input) ? "&" : "?"); sb.append(prefilled); } @@ -67,7 +67,7 @@ private String queryTemplatePrefix( String input, String prefilled) { String prefix; - if (isEmpty(prefilled)) { + if (!hasLength(prefilled)) { if (requiresContinuation(input)) { prefix = "{&"; } else { diff --git a/springfox-spring-web/src/main/java/springfox/documentation/spring/web/readers/operation/AbstractOperationParameterRequestConditionReader.java b/springfox-spring-web/src/main/java/springfox/documentation/spring/web/readers/operation/AbstractOperationParameterRequestConditionReader.java index ef8d3ef5b28..9791a7631e1 100644 --- a/springfox-spring-web/src/main/java/springfox/documentation/spring/web/readers/operation/AbstractOperationParameterRequestConditionReader.java +++ b/springfox-spring-web/src/main/java/springfox/documentation/spring/web/readers/operation/AbstractOperationParameterRequestConditionReader.java @@ -59,7 +59,7 @@ public List getParameters( String paramValue = expression.getValue(); AllowableListValues allowableValues = null; - if (!isEmpty(paramValue)) { + if (hasLength(paramValue)) { allowableValues = new AllowableListValues(singletonList(paramValue), "string"); } springfox.documentation.service.Parameter parameter = new springfox.documentation.builders.ParameterBuilder() @@ -91,7 +91,7 @@ protected Set getRequestParameters( String paramValue = expression.getValue(); AllowableListValues allowableValues = null; - if (!isEmpty(paramValue)) { + if (hasLength(paramValue)) { allowableValues = new AllowableListValues(singletonList(paramValue), "string"); } AllowableListValues finalAllowableValues = allowableValues; diff --git a/springfox-spring-web/src/main/java/springfox/documentation/spring/web/readers/parameter/ModelAttributeParameterExpander.java b/springfox-spring-web/src/main/java/springfox/documentation/spring/web/readers/parameter/ModelAttributeParameterExpander.java index 888284056cb..36c9648b380 100644 --- a/springfox-spring-web/src/main/java/springfox/documentation/spring/web/readers/parameter/ModelAttributeParameterExpander.java +++ b/springfox-spring-web/src/main/java/springfox/documentation/spring/web/readers/parameter/ModelAttributeParameterExpander.java @@ -308,7 +308,7 @@ private String nestedParentName( name += "[0]"; } - if (isEmpty(parentName)) { + if (!hasLength(parentName)) { return name; } return String.format("%s.%s", parentName, name); diff --git a/springfox-spring-web/src/main/java/springfox/documentation/spring/web/readers/parameter/ParameterNameReader.java b/springfox-spring-web/src/main/java/springfox/documentation/spring/web/readers/parameter/ParameterNameReader.java index 4be238c965c..0f530df1add 100644 --- a/springfox-spring-web/src/main/java/springfox/documentation/spring/web/readers/parameter/ParameterNameReader.java +++ b/springfox-spring-web/src/main/java/springfox/documentation/spring/web/readers/parameter/ParameterNameReader.java @@ -46,7 +46,7 @@ public class ParameterNameReader implements ParameterBuilderPlugin { @Override public void apply(ParameterContext context) { String name = findParameterNameFromAnnotations(context.resolvedMethodParameter()); - if (isEmpty(name)) { + if (!hasLength(name)) { Optional discoveredName = context.resolvedMethodParameter().defaultName(); name = discoveredName .orElseGet(() -> format("param%s", context.resolvedMethodParameter().getParameterIndex())); diff --git a/springfox-spring-web/src/main/java/springfox/documentation/spring/web/scanners/ApiModelReader.java b/springfox-spring-web/src/main/java/springfox/documentation/spring/web/scanners/ApiModelReader.java index b2e4f404978..7ef12f1186c 100755 --- a/springfox-spring-web/src/main/java/springfox/documentation/spring/web/scanners/ApiModelReader.java +++ b/springfox-spring-web/src/main/java/springfox/documentation/spring/web/scanners/ApiModelReader.java @@ -347,7 +347,7 @@ private Set findSameModels( modelsToCompare.stream() .filter( - m -> StringUtils.isEmpty(parameter) + m -> !StringUtils.hasLength(parameter) || parameter.equals(mergingContext.getModelParameter(m.getId()))) .filter(m -> m.equalsIgnoringName(modelToCompare)) .map(springfox.documentation.schema.Model::getId) diff --git a/springfox-swagger-common/src/main/java/springfox/documentation/swagger/common/XForwardPrefixPathAdjuster.java b/springfox-swagger-common/src/main/java/springfox/documentation/swagger/common/XForwardPrefixPathAdjuster.java index 7a29a7b6388..bb7a709660b 100644 --- a/springfox-swagger-common/src/main/java/springfox/documentation/swagger/common/XForwardPrefixPathAdjuster.java +++ b/springfox-swagger-common/src/main/java/springfox/documentation/swagger/common/XForwardPrefixPathAdjuster.java @@ -18,13 +18,13 @@ */ package springfox.documentation.swagger.common; +import org.springframework.util.ObjectUtils; import springfox.documentation.common.SpringVersion; import springfox.documentation.service.PathAdjuster; -import javax.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletRequest; -import static org.springframework.util.StringUtils.*; -import static springfox.documentation.common.SpringVersionCapability.*; +import static springfox.documentation.common.SpringVersionCapability.supportsXForwardPrefixHeader; public class XForwardPrefixPathAdjuster implements PathAdjuster { static final String X_FORWARDED_PREFIX = "X-Forwarded-Prefix"; @@ -45,7 +45,7 @@ public XForwardPrefixPathAdjuster(HttpServletRequest request) { public String adjustedPath(String path) { String prefix = request.getHeader(X_FORWARDED_PREFIX); if (prefix != null) { - prefix = isEmpty(prefix) ? "/" : prefix; + prefix = ObjectUtils.isEmpty(prefix) ? "/" : prefix; if (!supportsXForwardPrefixHeader(springVersion.getVersion())) { return prefix + path; } else { diff --git a/springfox-swagger-common/src/main/java/springfox/documentation/swagger/readers/operation/OpenApiOperationAuthReader.java b/springfox-swagger-common/src/main/java/springfox/documentation/swagger/readers/operation/OpenApiOperationAuthReader.java index 95ee29a46ed..015849329ab 100644 --- a/springfox-swagger-common/src/main/java/springfox/documentation/swagger/readers/operation/OpenApiOperationAuthReader.java +++ b/springfox-swagger-common/src/main/java/springfox/documentation/swagger/readers/operation/OpenApiOperationAuthReader.java @@ -84,7 +84,7 @@ private void maybeAddOperationAnnotation( for (String eachScope : scopes) { // @Authorization has a default blank each scope, which we need to // ignore in the case of api keys. - if (!isEmpty(eachScope)) { + if (hasLength(eachScope)) { authorizationScopeList.add( new AuthorizationScopeBuilder() .scope(eachScope) @@ -114,7 +114,7 @@ private Function byReferenceName() { private Collection securityRequirements(Operation operation) { return Stream.of(operation.security()) - .filter(input -> !isEmpty(input.name())) + .filter(input -> hasLength(input.name())) .collect(toList()); } diff --git a/springfox-swagger-common/src/main/java/springfox/documentation/swagger/readers/operation/OpenApiResponseReader.java b/springfox-swagger-common/src/main/java/springfox/documentation/swagger/readers/operation/OpenApiResponseReader.java index 97b74cd6a43..9bb2cf85b17 100644 --- a/springfox-swagger-common/src/main/java/springfox/documentation/swagger/readers/operation/OpenApiResponseReader.java +++ b/springfox-swagger-common/src/main/java/springfox/documentation/swagger/readers/operation/OpenApiResponseReader.java @@ -128,7 +128,7 @@ protected Set read(OperationContext context) { typeResolver.resolve(each.schema().implementation()), Optional.empty()); for (ExampleObject eachExample : each.examples()) { - if (!isEmpty(eachExample.value())) { + if (hasLength(eachExample.value())) { examples.add(new ExampleBuilder() .mediaType(each.mediaType()) .description(eachExample.description()) diff --git a/springfox-swagger-common/src/main/java/springfox/documentation/swagger/readers/operation/OperationAuthReader.java b/springfox-swagger-common/src/main/java/springfox/documentation/swagger/readers/operation/OperationAuthReader.java index a1318c71e85..2dc2deca44c 100644 --- a/springfox-swagger-common/src/main/java/springfox/documentation/swagger/readers/operation/OperationAuthReader.java +++ b/springfox-swagger-common/src/main/java/springfox/documentation/swagger/readers/operation/OperationAuthReader.java @@ -85,7 +85,7 @@ private void maybeProcessApiOperation( String scope = authorizationScope.scope(); // @Authorization has a default blank authorization scope, which we need to // ignore in the case of api keys. - if (!isEmpty(scope)) { + if (hasLength(scope)) { authorizationScopeList.add( new AuthorizationScopeBuilder() .scope(scope) @@ -114,7 +114,7 @@ private Function byReferenceName() { private Iterable authorizationReferences(ApiOperation apiOperationAnnotation) { return Stream.of(apiOperationAnnotation.authorizations()) - .filter(input -> !isEmpty(input.value())).collect(toList()); + .filter(input -> hasLength(input.value())).collect(toList()); } @Override diff --git a/springfox-swagger-common/src/main/java/springfox/documentation/swagger/readers/operation/ResponseHeaders.java b/springfox-swagger-common/src/main/java/springfox/documentation/swagger/readers/operation/ResponseHeaders.java index 96f291d7ce8..6d009d94460 100644 --- a/springfox-swagger-common/src/main/java/springfox/documentation/swagger/readers/operation/ResponseHeaders.java +++ b/springfox-swagger-common/src/main/java/springfox/documentation/swagger/readers/operation/ResponseHeaders.java @@ -20,6 +20,7 @@ import io.swagger.annotations.ResponseHeader; import io.swagger.v3.oas.annotations.media.Schema; +import org.springframework.util.ObjectUtils; import org.springframework.util.StringUtils; import springfox.documentation.builders.ModelSpecificationBuilder; import springfox.documentation.schema.CollectionType; @@ -110,8 +111,8 @@ private static CollectionType collectionTypeFromEnum(String type) { } private static Predicate emptyOrVoidHeader() { - return input -> isEmpty(input.name()) || - (isVoidImplementation(input) && StringUtils.isEmpty(input.schema().type())); + return input -> !hasLength(input.name()) || + (isVoidImplementation(input) && !hasLength(input.schema().type())); } private static boolean isVoidImplementation(io.swagger.v3.oas.annotations.headers.Header input) { @@ -119,7 +120,7 @@ private static boolean isVoidImplementation(io.swagger.v3.oas.annotations.header } private static Predicate emptyOrVoid() { - return input -> isEmpty(input.name()) || Void.class.equals(input.response()); + return input -> ObjectUtils.isEmpty(input.name()) || Void.class.equals(input.response()); } @SuppressWarnings("deprecation") @@ -127,7 +128,7 @@ private static springfox.documentation.schema.ModelReference headerModel(Respons springfox.documentation.schema.ModelReference modelReference; String typeName = ofNullable(springfox.documentation.schema.Types.typeNameFor(each.response())) .orElse("string"); - if (isEmpty(each.responseContainer())) { + if (!hasLength(each.responseContainer())) { modelReference = new springfox.documentation.schema.ModelRef(typeName); } else { modelReference = new springfox.documentation.schema.ModelRef(each.responseContainer(), @@ -174,7 +175,7 @@ private static ModelSpecification headerModelSpecification(io.swagger.v3.oas.ann } private static Optional scalarType(Schema schema) { - if (StringUtils.isEmpty(schema.type())) { + if (!StringUtils.hasLength(schema.type())) { return Optional.empty(); } return ScalarType.from(schema.type(), schema.format()); diff --git a/springfox-swagger-common/src/main/java/springfox/documentation/swagger/readers/operation/SwaggerResponseMessageReader.java b/springfox-swagger-common/src/main/java/springfox/documentation/swagger/readers/operation/SwaggerResponseMessageReader.java index ee8a980b27c..4931cd00ace 100644 --- a/springfox-swagger-common/src/main/java/springfox/documentation/swagger/readers/operation/SwaggerResponseMessageReader.java +++ b/springfox-swagger-common/src/main/java/springfox/documentation/swagger/readers/operation/SwaggerResponseMessageReader.java @@ -163,7 +163,7 @@ Set> read(OperationContext context) { List examples = new ArrayList<>(); int index = 0; for (ExampleProperty exampleProperty : apiResponse.examples().value()) { - if (!isEmpty(exampleProperty.value())) { + if (hasLength(exampleProperty.value())) { String mediaType = isEmpty(exampleProperty.mediaType()) ? null : exampleProperty.mediaType(); examples.add(new ExampleBuilder() .mediaType(mediaType) diff --git a/springfox-swagger-common/src/main/java/springfox/documentation/swagger/readers/operation/VendorExtensionsReader.java b/springfox-swagger-common/src/main/java/springfox/documentation/swagger/readers/operation/VendorExtensionsReader.java index 522f196a449..88008ea4887 100644 --- a/springfox-swagger-common/src/main/java/springfox/documentation/swagger/readers/operation/VendorExtensionsReader.java +++ b/springfox-swagger-common/src/main/java/springfox/documentation/swagger/readers/operation/VendorExtensionsReader.java @@ -77,7 +77,7 @@ private Function toVendorExtension() { private VendorExtension objectExtension(Extension each) { ObjectVendorExtension extension = new ObjectVendorExtension(ensurePrefixed(ofNullable(each.name()).orElse(""))); for (ExtensionProperty property : each.properties()) { - if (!isEmpty(property.name()) && !isEmpty(property.value())) { + if (hasLength(property.name()) && hasLength(property.value())) { extension.addProperty(new StringVendorExtension(property.name(), property.value())); } } @@ -95,7 +95,7 @@ private Function propertyExtension(final Extension anno } private String ensurePrefixed(String name) { - if (!isEmpty(name) && !name.startsWith("x-")) { + if (hasLength(name) && !name.startsWith("x-")) { return "x-" + name; } return name; diff --git a/springfox-swagger-common/src/main/java/springfox/documentation/swagger/readers/parameter/ApiParamParameterBuilder.java b/springfox-swagger-common/src/main/java/springfox/documentation/swagger/readers/parameter/ApiParamParameterBuilder.java index 20de7b6b47c..082a32a9e57 100644 --- a/springfox-swagger-common/src/main/java/springfox/documentation/swagger/readers/parameter/ApiParamParameterBuilder.java +++ b/springfox-swagger-common/src/main/java/springfox/documentation/swagger/readers/parameter/ApiParamParameterBuilder.java @@ -123,7 +123,7 @@ private AllowableValues allowableValues( ResolvedType parameterType, String allowableValueString) { AllowableValues allowableValues = null; - if (!isEmpty(allowableValueString)) { + if (hasLength(allowableValueString)) { allowableValues = ApiModelProperties.allowableValueFromString(allowableValueString); } else { if (enumTypeDeterminer.isEnum(parameterType.getErasedType())) { diff --git a/springfox-swagger-common/src/main/java/springfox/documentation/swagger/readers/parameter/Examples.java b/springfox-swagger-common/src/main/java/springfox/documentation/swagger/readers/parameter/Examples.java index 9a782fcd6fb..8db14aff5f5 100644 --- a/springfox-swagger-common/src/main/java/springfox/documentation/swagger/readers/parameter/Examples.java +++ b/springfox-swagger-common/src/main/java/springfox/documentation/swagger/readers/parameter/Examples.java @@ -40,7 +40,7 @@ private Examples() { public static Map> examples(io.swagger.annotations.Example example) { Map> examples = new HashMap<>(); for (ExampleProperty each : example.value()) { - if (!isEmpty(each.value())) { + if (hasLength(each.value())) { examples.putIfAbsent(each.mediaType(), new LinkedList<>()); examples.get(each.mediaType()).add(new ExampleBuilder() .mediaType(each.mediaType()) @@ -54,7 +54,7 @@ public static Map> examples(io.swagger.annotations.Example public static List allExamples(io.swagger.annotations.Example example) { List examples = new ArrayList<>(); for (ExampleProperty each : example.value()) { - if (!isEmpty(each.value())) { + if (hasLength(each.value())) { examples.add(new ExampleBuilder() .mediaType(each.mediaType()) .value(each.value()) @@ -67,7 +67,7 @@ public static List allExamples(io.swagger.annotations.Example example) public static Map> examples(String mediaType, ExampleObject[] exampleObjects) { Map> examples = new HashMap<>(); for (ExampleObject each : exampleObjects) { - if (!isEmpty(each.value())) { + if (hasLength(each.value())) { examples.putIfAbsent(mediaType, new LinkedList<>()); examples.get(mediaType).add(new ExampleBuilder() .mediaType(mediaType) @@ -81,7 +81,7 @@ public static Map> examples(String mediaType, ExampleObjec public static List allExamples(String mediaType, ExampleObject[] exampleObjects) { List examples = new ArrayList<>(); for (ExampleObject each : exampleObjects) { - if (!isEmpty(each.value())) { + if (hasLength(each.value())) { examples.add(new ExampleBuilder() .mediaType(mediaType) .value(each.value()) diff --git a/springfox-swagger-common/src/main/java/springfox/documentation/swagger/readers/parameter/SwaggerExpandedParameterBuilder.java b/springfox-swagger-common/src/main/java/springfox/documentation/swagger/readers/parameter/SwaggerExpandedParameterBuilder.java index b9b4c9cf096..4b279dc6778 100644 --- a/springfox-swagger-common/src/main/java/springfox/documentation/swagger/readers/parameter/SwaggerExpandedParameterBuilder.java +++ b/springfox-swagger-common/src/main/java/springfox/documentation/swagger/readers/parameter/SwaggerExpandedParameterBuilder.java @@ -140,7 +140,7 @@ private void fromApiModelProperty( private void maybeSetParameterName( ParameterExpansionContext context, String parameterName) { - if (!isEmpty(parameterName)) { + if (hasLength(parameterName)) { context.getParameterBuilder().name(parameterName); context.getRequestParameterBuilder().name(parameterName); } diff --git a/springfox-swagger-common/src/main/java/springfox/documentation/swagger/schema/ApiModelProperties.java b/springfox-swagger-common/src/main/java/springfox/documentation/swagger/schema/ApiModelProperties.java index 53b3fb9ff70..7fbe6bddc0e 100644 --- a/springfox-swagger-common/src/main/java/springfox/documentation/swagger/schema/ApiModelProperties.java +++ b/springfox-swagger-common/src/main/java/springfox/documentation/swagger/schema/ApiModelProperties.java @@ -88,9 +88,9 @@ static Function toDescription( return annotation -> { String description = ""; - if (!isEmpty(annotation.value())) { + if (hasLength(annotation.value())) { description = annotation.value(); - } else if (!isEmpty(annotation.notes())) { + } else if (hasLength(annotation.notes())) { description = annotation.notes(); } return descriptions.resolve(description); @@ -123,7 +123,7 @@ public static Optional findApiModePropertyAnnotation(Annotated static Function toExample() { return annotation -> { String example = ""; - if (!isEmpty(annotation.example())) { + if (hasLength(annotation.example())) { example = annotation.example(); } return example; diff --git a/springfox-swagger-common/src/main/java/springfox/documentation/swagger/schema/OpenApiSchemaPropertyBuilder.java b/springfox-swagger-common/src/main/java/springfox/documentation/swagger/schema/OpenApiSchemaPropertyBuilder.java index bfb3d1733ba..09c0c640c80 100644 --- a/springfox-swagger-common/src/main/java/springfox/documentation/swagger/schema/OpenApiSchemaPropertyBuilder.java +++ b/springfox-swagger-common/src/main/java/springfox/documentation/swagger/schema/OpenApiSchemaPropertyBuilder.java @@ -98,7 +98,7 @@ static Function toDescription( return annotation -> { String description = ""; - if (!isEmpty(annotation.description())) { + if (hasLength(annotation.description())) { description = annotation.description(); } return descriptions.resolve(description); diff --git a/springfox-swagger-common/src/main/java/springfox/documentation/swagger/web/InMemorySwaggerResourcesProvider.java b/springfox-swagger-common/src/main/java/springfox/documentation/swagger/web/InMemorySwaggerResourcesProvider.java index 19843fcc71b..6c04ef91b6c 100644 --- a/springfox-swagger-common/src/main/java/springfox/documentation/swagger/web/InMemorySwaggerResourcesProvider.java +++ b/springfox-swagger-common/src/main/java/springfox/documentation/swagger/web/InMemorySwaggerResourcesProvider.java @@ -74,7 +74,7 @@ public InMemorySwaggerResourcesProvider( } private String fixup(String path) { - if (StringUtils.isEmpty(path) + if (!StringUtils.hasLength(path) || "/".equals(path) || "//".equals(path)) { return "/"; diff --git a/springfox-swagger-common/src/main/java/springfox/documentation/swagger/web/SecurityConfiguration.java b/springfox-swagger-common/src/main/java/springfox/documentation/swagger/web/SecurityConfiguration.java index f93469f9c84..e5eb076a491 100644 --- a/springfox-swagger-common/src/main/java/springfox/documentation/swagger/web/SecurityConfiguration.java +++ b/springfox-swagger-common/src/main/java/springfox/documentation/swagger/web/SecurityConfiguration.java @@ -67,6 +67,7 @@ public class SecurityConfiguration { /** * @deprecated @since 2.8.0. Use the {@link SecurityConfigurationBuilder} instead */ + @Deprecated private SecurityConfiguration() { this( null, diff --git a/springfox-swagger-common/src/test/groovy/springfox/documentation/swagger/readers/parameter/ParameterAnnotationReaderSpec.groovy b/springfox-swagger-common/src/test/groovy/springfox/documentation/swagger/readers/parameter/ParameterAnnotationReaderSpec.groovy index 90985800359..106421366e3 100644 --- a/springfox-swagger-common/src/test/groovy/springfox/documentation/swagger/readers/parameter/ParameterAnnotationReaderSpec.groovy +++ b/springfox-swagger-common/src/test/groovy/springfox/documentation/swagger/readers/parameter/ParameterAnnotationReaderSpec.groovy @@ -63,7 +63,7 @@ class ParameterAnnotationReaderSpec extends Specification { when: Optional annotation = ParameterAnnotationReader.fromHierarchy(methodParameter, ApiParam.class) then: - annotation.isPresent() == !isEmpty(expected) + annotation.isPresent() == hasLength(expected) !annotation.isPresent() || annotation.get().name() == expected where: methodName | expected diff --git a/springfox-swagger1/src/main/java/springfox/documentation/swagger1/mappers/ServiceModelToSwaggerMapper.java b/springfox-swagger1/src/main/java/springfox/documentation/swagger1/mappers/ServiceModelToSwaggerMapper.java index 1ab85ac6863..96d84b82ad1 100644 --- a/springfox-swagger1/src/main/java/springfox/documentation/swagger1/mappers/ServiceModelToSwaggerMapper.java +++ b/springfox-swagger1/src/main/java/springfox/documentation/swagger1/mappers/ServiceModelToSwaggerMapper.java @@ -42,7 +42,6 @@ }) @SuppressWarnings("deprecation") public interface ServiceModelToSwaggerMapper { - //Api related ApiDescription toSwaggerApiDescription(springfox.documentation.service.ApiDescription from); @Mappings({ @@ -81,6 +80,7 @@ public interface ServiceModelToSwaggerMapper { @Mappings({ @Mapping(target = "dataType", source = "responseModel", qualifiedBy = DataTypeMapper.OperationType.class), @Mapping(target = "nickname", source = "uniqueId"), + @Mapping(target = "method", expression = "java(from.getMethod()!=null? from.getMethod().name():\"\")"), @Mapping(target = "authorizations", source = "securityReferences") }) Operation toSwaggerOperation(springfox.documentation.service.Operation from); diff --git a/springfox-swagger2/src/main/java/springfox/documentation/swagger2/annotations/EnableSwagger2WebMvc.java b/springfox-swagger2/src/main/java/springfox/documentation/swagger2/annotations/EnableSwagger2WebMvc.java index e4b8ca4eafe..491dac5354e 100644 --- a/springfox-swagger2/src/main/java/springfox/documentation/swagger2/annotations/EnableSwagger2WebMvc.java +++ b/springfox-swagger2/src/main/java/springfox/documentation/swagger2/annotations/EnableSwagger2WebMvc.java @@ -19,6 +19,7 @@ package springfox.documentation.swagger2.annotations; +import org.springframework.boot.autoconfigure.ImportAutoConfiguration; import org.springframework.context.annotation.Import; import springfox.documentation.swagger2.configuration.Swagger2DocumentationConfiguration; @@ -33,14 +34,14 @@ *

* Loads all required beans defined in @see SpringSwaggerConfig * - * @see springfox.documentation.spring.web.plugins.Docket * Use {@link EnableSwagger2} instead * @deprecated @since 3.0.0 */ @Retention(value = java.lang.annotation.RetentionPolicy.RUNTIME) @Target(value = {java.lang.annotation.ElementType.TYPE}) @Documented -@Import(Swagger2DocumentationConfiguration.class) +@ImportAutoConfiguration(Swagger2DocumentationConfiguration.class) @Deprecated public @interface EnableSwagger2WebMvc { + } diff --git a/springfox-swagger2/src/main/java/springfox/documentation/swagger2/mappers/VendorExtensionsMapper.java b/springfox-swagger2/src/main/java/springfox/documentation/swagger2/mappers/VendorExtensionsMapper.java index b20e4f7ed66..914e22b345d 100644 --- a/springfox-swagger2/src/main/java/springfox/documentation/swagger2/mappers/VendorExtensionsMapper.java +++ b/springfox-swagger2/src/main/java/springfox/documentation/swagger2/mappers/VendorExtensionsMapper.java @@ -59,7 +59,7 @@ public Map mapExtensions(List from) { private Function> toExtensionMap() { return input -> { - if (!isEmpty(input.getName())) { + if (hasLength(input.getName())) { Map map = new HashMap<>(); map.put( input.getName(), diff --git a/springfox-swagger2/src/main/java/springfox/documentation/swagger2/web/WebFluxBasePathAndHostnameTransformationFilter.java b/springfox-swagger2/src/main/java/springfox/documentation/swagger2/web/WebFluxBasePathAndHostnameTransformationFilter.java index efcfa902f36..3dd1870cfdd 100644 --- a/springfox-swagger2/src/main/java/springfox/documentation/swagger2/web/WebFluxBasePathAndHostnameTransformationFilter.java +++ b/springfox-swagger2/src/main/java/springfox/documentation/swagger2/web/WebFluxBasePathAndHostnameTransformationFilter.java @@ -15,10 +15,10 @@ public class WebFluxBasePathAndHostnameTransformationFilter implements WebFluxSw public Swagger transform(SwaggerTransformationContext context) { Swagger swagger = context.getSpecification(); context.request().ifPresent(request -> { - swagger.basePath(isEmpty(request.getPath().contextPath().value()) + swagger.basePath(!hasLength(request.getPath().contextPath().value()) ? "/" : request.getPath().contextPath().value()); - if (isEmpty(swagger.getHost())) { + if (!hasLength(swagger.getHost())) { swagger.host(request.getURI().getAuthority()); } }); diff --git a/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/models/Bug3353.java b/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/models/Bug3353.java index 7051fb39cd7..445807a1eb9 100644 --- a/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/models/Bug3353.java +++ b/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/models/Bug3353.java @@ -144,7 +144,7 @@ public KeyHintBuilder() { public void addProperty( String name, Object property) { - if (!StringUtils.isEmpty(property)) { + if (StringUtils.hasLength(property)) { this.builder.append(property); } } @@ -190,7 +190,7 @@ public QueryParamsBuilder() { public void addToUri( String name, Object property) { - if (!StringUtils.isEmpty(property)) { + if (StringUtils.hasLength(property)) { if (this.builder.length() > 0) { this.builder.append("&"); } From 3b3982543c22a6c784a91382d32c56798c09629d Mon Sep 17 00:00:00 2001 From: Mawmanager Date: Mon, 19 Dec 2022 17:16:08 +0800 Subject: [PATCH 08/19] =?UTF-8?q?[BugFix]=E4=B8=BAspringfox.documentation.?= =?UTF-8?q?swagger1.dto.Operation=E6=9B=B4=E6=96=B0Mapper=E6=96=B9?= =?UTF-8?q?=E6=B3=95=EF=BC=8C=E4=BD=BF=E5=85=B6=E8=83=BD=E5=A4=9F=E4=BB=8E?= =?UTF-8?q?SpringBoot3=E7=9A=84=E6=96=B0=E7=89=88HttpMethod=E5=AF=B9?= =?UTF-8?q?=E8=B1=A1=E8=BD=AC=E5=8C=96=E4=B8=BAString=20-----=20[BugFix]?= =?UTF-8?q?=20Update=20the=20Mapper=20method=20for=20springfox.documentati?= =?UTF-8?q?on.swagger1.dto.Operation=20so=20that=20it=20can=20be=20convert?= =?UTF-8?q?ed=20from=20SpringBoot3's=20new=20'HttpMethod'=20object=20to=20?= =?UTF-8?q?String=20property=20'method'?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../documentation/builders/ModelPropertyBuilder.java | 2 +- .../oas/mappers/ServiceModelToOpenApiMapper.java | 4 +++- .../springfox/documentation/spring/web/plugins/Docket.java | 2 +- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/springfox-core/src/main/java/springfox/documentation/builders/ModelPropertyBuilder.java b/springfox-core/src/main/java/springfox/documentation/builders/ModelPropertyBuilder.java index ded7f713fb7..1084b2dfead 100644 --- a/springfox-core/src/main/java/springfox/documentation/builders/ModelPropertyBuilder.java +++ b/springfox-core/src/main/java/springfox/documentation/builders/ModelPropertyBuilder.java @@ -27,7 +27,7 @@ import java.util.ArrayList; import java.util.List; -import static org.springframework.util.StringUtils.*; +import static org.springframework.util.StringUtils.isEmpty; import static springfox.documentation.builders.BuilderDefaults.*; diff --git a/springfox-oas/src/main/java/springfox/documentation/oas/mappers/ServiceModelToOpenApiMapper.java b/springfox-oas/src/main/java/springfox/documentation/oas/mappers/ServiceModelToOpenApiMapper.java index eae73e13fcc..a92ec2ae591 100644 --- a/springfox-oas/src/main/java/springfox/documentation/oas/mappers/ServiceModelToOpenApiMapper.java +++ b/springfox-oas/src/main/java/springfox/documentation/oas/mappers/ServiceModelToOpenApiMapper.java @@ -288,7 +288,9 @@ private PathItem mapOperations( return path; } - abstract PathItem.HttpMethod mapHttpMethod(HttpMethod method); + private PathItem.HttpMethod mapHttpMethod(HttpMethod method){ + return PathItem.HttpMethod.valueOf(method.name()); + } private Content map( SortedSet value, diff --git a/springfox-spring-web/src/main/java/springfox/documentation/spring/web/plugins/Docket.java b/springfox-spring-web/src/main/java/springfox/documentation/spring/web/plugins/Docket.java index f50c6da80ae..433bc750d16 100644 --- a/springfox-spring-web/src/main/java/springfox/documentation/spring/web/plugins/Docket.java +++ b/springfox-spring-web/src/main/java/springfox/documentation/spring/web/plugins/Docket.java @@ -197,7 +197,6 @@ public Docket pathProvider(PathProvider pathProvider) { * @return this Docket * {@code See swagger annotations @ApiResponse, @ApiResponses }. * @see springfox.documentation.spi.service.contexts.Defaults#defaultResponseMessages() - * Use {@link Docket#responses} instead * @deprecated @since 3.0.0 */ @Deprecated @@ -546,6 +545,7 @@ public DocumentationType getDocumentationType() { return documentationType; } + @Override public boolean supports(DocumentationType delimiter) { return documentationType.equals(delimiter); From f4aeeccd8f8f7f6ae9988eebd2905c3c24b1d46d Mon Sep 17 00:00:00 2001 From: Mawmanager Date: Mon, 19 Dec 2022 17:21:57 +0800 Subject: [PATCH 09/19] =?UTF-8?q?[BugFix]SpringBoot3=E4=B8=AD=E7=9A=84Requ?= =?UTF-8?q?estMapping=E7=9A=84condition=E5=AD=97=E6=AE=B5=E5=8F=AF?= =?UTF-8?q?=E8=83=BD=E4=B8=BA=E7=A9=BA=EF=BC=8C=E8=BF=99=E4=BC=9A=E5=AF=BC?= =?UTF-8?q?=E8=87=B4springfox=E8=AF=BB=E5=8F=96=E8=AF=A5=E5=AD=97=E6=AE=B5?= =?UTF-8?q?=E7=9A=84=E5=AD=90=E5=AD=97=E6=AE=B5=E6=97=B6=E4=BC=9A=E5=87=BA?= =?UTF-8?q?=E7=8E=B0NullPointException=20-----=20[BugFix]=20The=20conditio?= =?UTF-8?q?n=20field=20of=20RequestMapping=20in=20SpringBoot3=20may=20be?= =?UTF-8?q?=20empty,=20which=20will=20cause=20NullPointException=20when=20?= =?UTF-8?q?springfox=20reads=20the=20subfield=20of=20this=20field?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 57 ------------------- ...WebMvcPatternsRequestConditionWrapper.java | 16 +++++- .../spring/web/WebMvcRequestHandler.java | 8 +-- .../ApiModelPropertyPropertyBuilder.java | 3 + .../documentation/swagger1/dto/Operation.java | 19 ++----- .../annotations/EnableSwagger2WebFlux.java | 1 - .../swagger2/mappers/ParameterMapper.java | 11 ++-- 7 files changed, 30 insertions(+), 85 deletions(-) diff --git a/README.md b/README.md index fd6ee0fdca5..0a8262802a1 100644 --- a/README.md +++ b/README.md @@ -1,27 +1,5 @@ # Springfox -[![Join the chat at https://gitter.im/springfox/springfox](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/springfox/springfox?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) -[![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Fspringfox%2Fspringfox.svg?type=shield)](https://app.fossa.io/projects/git%2Bgithub.com%2Fspringfox%2Fspringfox?ref=badge_shield) -[ ![Download](https://api.bintray.com/packages/springfox/maven-repo/springfox/images/download.svg) ](https://bintray.com/springfox/maven-repo/springfox/_latestVersion) -[![Project Stats](https://www.openhub.net/p/springfox/widgets/project_thin_badge.gif)](https://www.openhub.net/p/springfox) - -| Build Status | Coverage | Code Analysis | -|---|---|---| -|[![Circle CI](https://circleci.com/gh/springfox/springfox/tree/master.svg?style=svg)](https://circleci.com/gh/springfox/springfox/tree/master)|[![codecov](https://codecov.io/gh/springfox/springfox/branch/master/graph/badge.svg)](https://codecov.io/gh/springfox/springfox) |[![Quality Gate Status](https://sonarcloud.io/api/project_badges/measure?project=springfox_springfox&metric=alert_status)](https://sonarcloud.io/dashboard?id=springfox_springfox)| - -| Sonar Cloud | -|------------ | -|[![Security Rating](https://sonarcloud.io/api/project_badges/measure?project=springfox_springfox&metric=security_rating)](https://sonarcloud.io/dashboard?id=springfox_springfox)| -|[![Vulnerabilities](https://sonarcloud.io/api/project_badges/measure?project=springfox_springfox&metric=vulnerabilities)](https://sonarcloud.io/dashboard?id=springfox_springfox)| -|[![Maintainability Rating](https://sonarcloud.io/api/project_badges/measure?project=springfox_springfox&metric=sqale_rating)](https://sonarcloud.io/dashboard?id=springfox_springfox)| -|[![Reliability Rating](https://sonarcloud.io/api/project_badges/measure?project=springfox_springfox&metric=reliability_rating)](https://sonarcloud.io/dashboard?id=springfox_springfox)| -|[![Technical Debt](https://sonarcloud.io/api/project_badges/measure?project=springfox_springfox&metric=sqale_index)](https://sonarcloud.io/dashboard?id=springfox_springfox)| -|[![Coverage](https://sonarcloud.io/api/project_badges/measure?project=springfox_springfox&metric=coverage)](https://sonarcloud.io/dashboard?id=springfox_springfox)| - -### About -For more information on this project visit the [Springfox Website](http://springfox.io) or - [http://springfox.github.io/springfox/](http://springfox.github.io/springfox/) - ### Useful links - [Reference Documentation](http://springfox.io) - [Examples repository](https://github.com/springfox/springfox-demos) @@ -45,40 +23,6 @@ For Maven ``` -For Gradle -```gradle - implementation "io.springfox:springfox-boot-starter:" -``` -#### Migrating from earlier snapshot -#### Spring Boot Applications -NOTE: Would love feedback to make this better -1. Remove explicit dependencies on `springfox-swagger2` -2. Remove any `@EnableSwagger2...` annotations -3. Add the `springfox-boot-starter` dependency -4. Springfox 3.x removes dependencies on guava and other 3rd party libraries (not zero dep yet! depends on spring plugin -and open api libraries for annotations and models) so if you used guava predicates/functions those will need to -transition to java 8 function interfaces. - -#### Migrating from existing 2.x version -#### Spring Boot Applications -NOTE: Would love feedback to make this better -1. Remove explicit dependencies on `springfox-swagger2` -2. Remove the `@EnableSwagger2` annotations -3. Add the `springfox-boot-starter` dependency -4. Springfox 3.x removes dependencies on guava and other 3rd party libraries (not zero dep yet! depends on spring plugin -and open api libraries for annotations and models) so if you used guava predicates/functions those will need to -transition to java 8 function interfaces -5. If you are using WebMvc but you don't use the [`@EnableWebMvc`](https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/web/servlet/config/annotation/EnableWebMvc.html) annotation yet, add this annotation. - -#### Regular spring mvc -NOTE: Would love feedback to make this experience better -1. Remove explicit dependencies on `springfox-swagger2` -2. Add `@EnableOpenApi` for open API (and `@EnableSwagger2WebMvc` or `@EnableSwagger2WebFlux` for older versions) -3. Added the `springfox-oas` library -4. Springfox 3.x removes dependencies on guava and other 3rd party libraries (not zero dep yet! depends on spring plugin -and open api libraries for annotations and models) so if you used guava predicates/functions those will need to -transition to java 8 function interfaces - License ------- @@ -96,6 +40,5 @@ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - ## License [![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Fspringfox%2Fspringfox.svg?type=large)](https://app.fossa.io/projects/git%2Bgithub.com%2Fspringfox%2Fspringfox?ref=badge_large) diff --git a/springfox-spring-webmvc/src/main/java/springfox/documentation/spring/web/WebMvcPatternsRequestConditionWrapper.java b/springfox-spring-webmvc/src/main/java/springfox/documentation/spring/web/WebMvcPatternsRequestConditionWrapper.java index 9d9966327ab..485fcb5b60d 100644 --- a/springfox-spring-webmvc/src/main/java/springfox/documentation/spring/web/WebMvcPatternsRequestConditionWrapper.java +++ b/springfox-spring-webmvc/src/main/java/springfox/documentation/spring/web/WebMvcPatternsRequestConditionWrapper.java @@ -21,6 +21,9 @@ import org.springframework.web.servlet.mvc.condition.PatternsRequestCondition; +import java.util.Collections; +import java.util.HashSet; +import java.util.Objects; import java.util.Set; import java.util.stream.Collectors; @@ -53,6 +56,9 @@ public springfox.documentation.spring.wrapper.PatternsRequestCondition combine( @Override public Set getPatterns() { + if(null == this.condition){ + return new HashSet<>(); + } return this.condition.getPatterns().stream() .map(p -> String.format("%s/%s", maybeChompTrailingSlash(contextPath), maybeChompLeadingSlash(p))) .collect(Collectors.toSet()); @@ -62,20 +68,24 @@ public Set getPatterns() { @Override public boolean equals(Object o) { if (o instanceof WebMvcPatternsRequestConditionWrapper) { - return this.condition.equals(((WebMvcPatternsRequestConditionWrapper) o).condition); + WebMvcPatternsRequestConditionWrapper oo = (WebMvcPatternsRequestConditionWrapper) o; + if(this.condition == null) { + return oo.condition == null; + } + return this.condition.equals(oo.condition); } return false; } @Override public int hashCode() { - return this.condition.hashCode(); + return Objects.hashCode(this.condition); } @Override public String toString() { - return this.condition.toString(); + return String.valueOf(this.condition); } } diff --git a/springfox-spring-webmvc/src/main/java/springfox/documentation/spring/web/WebMvcRequestHandler.java b/springfox-spring-webmvc/src/main/java/springfox/documentation/spring/web/WebMvcRequestHandler.java index 237259c9bba..da464650ce7 100644 --- a/springfox-spring-webmvc/src/main/java/springfox/documentation/spring/web/WebMvcRequestHandler.java +++ b/springfox-spring-webmvc/src/main/java/springfox/documentation/spring/web/WebMvcRequestHandler.java @@ -32,10 +32,7 @@ import springfox.documentation.spring.wrapper.PatternsRequestCondition; import java.lang.annotation.Annotation; -import java.util.List; -import java.util.Optional; -import java.util.Set; -import java.util.StringJoiner; +import java.util.*; import static java.util.Optional.*; @@ -125,8 +122,9 @@ public Optional findAnnotation(Class annotation) { @Override public RequestHandlerKey key() { + org.springframework.web.servlet.mvc.condition.PatternsRequestCondition sets = requestMapping.getPatternsCondition(); return new RequestHandlerKey( - requestMapping.getPatternsCondition().getPatterns(), + sets!=null?sets.getPatterns():new HashSet<>(), requestMapping.getMethodsCondition().getMethods(), requestMapping.getConsumesCondition().getConsumableMediaTypes(), requestMapping.getProducesCondition().getProducibleMediaTypes()); diff --git a/springfox-swagger-common/src/main/java/springfox/documentation/swagger/schema/ApiModelPropertyPropertyBuilder.java b/springfox-swagger-common/src/main/java/springfox/documentation/swagger/schema/ApiModelPropertyPropertyBuilder.java index 9e184ad973e..52deae271b6 100644 --- a/springfox-swagger-common/src/main/java/springfox/documentation/swagger/schema/ApiModelPropertyPropertyBuilder.java +++ b/springfox-swagger-common/src/main/java/springfox/documentation/swagger/schema/ApiModelPropertyPropertyBuilder.java @@ -19,6 +19,7 @@ package springfox.documentation.swagger.schema; +import com.fasterxml.classmate.ResolvedType; import io.swagger.annotations.ApiModelProperty; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.annotation.Order; @@ -77,6 +78,8 @@ public void apply(ModelPropertyContext context) { }) .orElse(null); Optional finalAnnotation = annotation; + + context.getSpecificationBuilder() .description(annotation.map(toDescription(descriptions)).orElse(null)) .readOnly(annotation.map(ApiModelProperty::readOnly).orElse(false)) diff --git a/springfox-swagger1/src/main/java/springfox/documentation/swagger1/dto/Operation.java b/springfox-swagger1/src/main/java/springfox/documentation/swagger1/dto/Operation.java index b7e5b6873f5..f8b2ffea0f2 100644 --- a/springfox-swagger1/src/main/java/springfox/documentation/swagger1/dto/Operation.java +++ b/springfox-swagger1/src/main/java/springfox/documentation/swagger1/dto/Operation.java @@ -19,22 +19,13 @@ package springfox.documentation.swagger1.dto; -import com.fasterxml.jackson.annotation.JsonIgnore; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.JsonPropertyOrder; -import com.fasterxml.jackson.annotation.JsonUnwrapped; - -import java.util.ArrayList; -import java.util.Comparator; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.SortedSet; -import java.util.TreeSet; +import com.fasterxml.jackson.annotation.*; + +import java.util.*; import java.util.stream.Collectors; -import static java.util.stream.Collectors.*; +import static java.util.stream.Collectors.toList; +import static java.util.stream.Collectors.toMap; @JsonPropertyOrder({ "method", "summary", "notes", "type", "nickname", "produces", diff --git a/springfox-swagger2/src/main/java/springfox/documentation/swagger2/annotations/EnableSwagger2WebFlux.java b/springfox-swagger2/src/main/java/springfox/documentation/swagger2/annotations/EnableSwagger2WebFlux.java index 6e8c2dc9a0e..a3b718ee82d 100644 --- a/springfox-swagger2/src/main/java/springfox/documentation/swagger2/annotations/EnableSwagger2WebFlux.java +++ b/springfox-swagger2/src/main/java/springfox/documentation/swagger2/annotations/EnableSwagger2WebFlux.java @@ -33,7 +33,6 @@ *

* Loads all required beans defined in @see SpringSwaggerConfig * - * @see springfox.documentation.spring.web.plugins.Docket * Use {@link EnableSwagger2} instead * @deprecated @since 3.0.0 */ diff --git a/springfox-swagger2/src/main/java/springfox/documentation/swagger2/mappers/ParameterMapper.java b/springfox-swagger2/src/main/java/springfox/documentation/swagger2/mappers/ParameterMapper.java index e16846a2314..a36bf9ad27f 100644 --- a/springfox-swagger2/src/main/java/springfox/documentation/swagger2/mappers/ParameterMapper.java +++ b/springfox-swagger2/src/main/java/springfox/documentation/swagger2/mappers/ParameterMapper.java @@ -30,7 +30,7 @@ import io.swagger.models.properties.FileProperty; import io.swagger.models.properties.Property; import org.mapstruct.Mapper; -import org.springframework.util.StringUtils; +import org.springframework.util.ObjectUtils; import springfox.documentation.schema.Example; import java.util.List; @@ -39,8 +39,9 @@ import java.util.Set; import java.util.stream.Stream; -import static java.util.stream.Collectors.*; -import static springfox.documentation.swagger2.mappers.EnumMapper.*; +import static java.util.stream.Collectors.toSet; +import static springfox.documentation.swagger2.mappers.EnumMapper.maybeAddAllowableValues; +import static springfox.documentation.swagger2.mappers.EnumMapper.maybeAddAllowableValuesToParameter; /** * Use {@link RequestParameterMapper} instead @@ -128,7 +129,7 @@ private Parameter bodyParameter(springfox.documentation.service.Parameter source private Model toSchema(springfox.documentation.service.Parameter source) { Model schema = fromModelRef(source.getModelRef()); - if (!StringUtils.isEmpty(source.getScalarExample()) && !isEmptyExample(source.getScalarExample())) { + if (!ObjectUtils.isEmpty(source.getScalarExample()) && !isEmptyExample(source.getScalarExample())) { schema.setExample(source.getScalarExample()); } @@ -136,7 +137,7 @@ private Model toSchema(springfox.documentation.service.Parameter source) { } private boolean isEmptyExample(Object object) { - return object instanceof Example && StringUtils.isEmpty(((Example) object).getValue()); + return object instanceof Example && ObjectUtils.isEmpty(((Example) object).getValue()); } Model fromModelRef(springfox.documentation.schema.ModelReference modelRef) { From d585cc225682482d5e8ea8acad2dac3937aa3c7d Mon Sep 17 00:00:00 2001 From: XSComSoft Date: Mon, 19 Dec 2022 21:11:41 +0800 Subject: [PATCH 10/19] =?UTF-8?q?=E6=9B=B4=E6=96=B0jitpack=20-----=20updat?= =?UTF-8?q?e=20jitpack?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- jitpack.yml | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 jitpack.yml diff --git a/jitpack.yml b/jitpack.yml new file mode 100644 index 00000000000..e69de29bb2d From d9dbd94cbbd45e7fa275f09a788d21284bdb53dd Mon Sep 17 00:00:00 2001 From: XSComSoft Date: Mon, 19 Dec 2022 21:29:39 +0800 Subject: [PATCH 11/19] JDK17 for jitpack --- .circleci/config.yml | 2 +- jitpack.yml | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index c7928e79dd1..1e64c69d9e2 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -3,7 +3,7 @@ jobs: build: working_directory: ~/code docker: - - image: circleci/openjdk:11-jdk-node-browsers + - image: circleci/openjdk:17-jdk-node-browsers environment: JVM_OPTIONS: -Xmx2G -XX:ReservedCodeCacheSize=1G GRADLE_OPTS: '-Dorg.gradle.daemon=false -Dorg.gradle.jvmargs="-Xms256m -Xmx3072m -XX:+HeapDumpOnOutOfMemoryError"' diff --git a/jitpack.yml b/jitpack.yml index e69de29bb2d..f29a6676c74 100644 --- a/jitpack.yml +++ b/jitpack.yml @@ -0,0 +1,5 @@ +jdk: + - openjdk17 +before_install: + - sdk install java 17.0.1-open + - sdk use java 17.0.1-open \ No newline at end of file From 31c760d60dda7c6befb30f0df19c23c0c9a0239a Mon Sep 17 00:00:00 2001 From: XSComSoft Date: Mon, 19 Dec 2022 21:32:31 +0800 Subject: [PATCH 12/19] Try change jitpack ENV --- jitpack.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/jitpack.yml b/jitpack.yml index f29a6676c74..d1101f5a818 100644 --- a/jitpack.yml +++ b/jitpack.yml @@ -2,4 +2,6 @@ jdk: - openjdk17 before_install: - sdk install java 17.0.1-open - - sdk use java 17.0.1-open \ No newline at end of file + - sdk use java 17.0.1-open +env: + VERSION: "1.0.0" \ No newline at end of file From b4686cdbdcd2a581d0a59509be2077b13783d512 Mon Sep 17 00:00:00 2001 From: XSComSoft Date: Tue, 20 Dec 2022 08:31:36 +0800 Subject: [PATCH 13/19] =?UTF-8?q?=E4=BF=AE=E5=BE=A9=E4=B8=80=E4=BA=9Bimpor?= =?UTF-8?q?t=E5=95=8F=E9=A1=8C=20-----=20Fix=20some=20problem=20from=20imp?= =?UTF-8?q?ort?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../springfox/test/contract/oas/api/PetApiDelegateImpl.java | 2 +- .../test/contract/oas/api/StoreApiDelegateImpl.java | 3 ++- .../springfox/test/contract/oas/api/UserApiDelegateImpl.java | 2 +- .../main/java/springfox/test/contract/oas/bugs/Bug3353.java | 5 +++-- 4 files changed, 7 insertions(+), 5 deletions(-) diff --git a/oas-contract-tests/src/main/java/springfox/test/contract/oas/api/PetApiDelegateImpl.java b/oas-contract-tests/src/main/java/springfox/test/contract/oas/api/PetApiDelegateImpl.java index c1901f06690..ab4d538594d 100644 --- a/oas-contract-tests/src/main/java/springfox/test/contract/oas/api/PetApiDelegateImpl.java +++ b/oas-contract-tests/src/main/java/springfox/test/contract/oas/api/PetApiDelegateImpl.java @@ -18,6 +18,7 @@ package springfox.test.contract.oas.api; +import jakarta.annotation.PostConstruct; import org.apache.tomcat.util.http.fileupload.IOUtils; import org.springframework.data.domain.Pageable; import org.springframework.http.HttpStatus; @@ -33,7 +34,6 @@ import springfox.test.contract.oas.model.Tag; import springfox.test.contract.oas.repository.PetRepository; -import javax.annotation.PostConstruct; import javax.validation.constraints.NotNull; import java.io.FileOutputStream; import java.util.Arrays; diff --git a/oas-contract-tests/src/main/java/springfox/test/contract/oas/api/StoreApiDelegateImpl.java b/oas-contract-tests/src/main/java/springfox/test/contract/oas/api/StoreApiDelegateImpl.java index a0ee957c377..5e3a1acc94f 100644 --- a/oas-contract-tests/src/main/java/springfox/test/contract/oas/api/StoreApiDelegateImpl.java +++ b/oas-contract-tests/src/main/java/springfox/test/contract/oas/api/StoreApiDelegateImpl.java @@ -18,6 +18,7 @@ package springfox.test.contract.oas.api; +import jakarta.annotation.PostConstruct; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Service; @@ -27,7 +28,7 @@ import springfox.test.contract.oas.repository.OrderRepository; import springfox.test.contract.oas.repository.PetRepository; -import javax.annotation.PostConstruct; + import java.util.Date; @Service diff --git a/oas-contract-tests/src/main/java/springfox/test/contract/oas/api/UserApiDelegateImpl.java b/oas-contract-tests/src/main/java/springfox/test/contract/oas/api/UserApiDelegateImpl.java index ee1312d4e54..8ad8e7aedc1 100644 --- a/oas-contract-tests/src/main/java/springfox/test/contract/oas/api/UserApiDelegateImpl.java +++ b/oas-contract-tests/src/main/java/springfox/test/contract/oas/api/UserApiDelegateImpl.java @@ -25,7 +25,7 @@ import springfox.test.contract.oas.model.User; import springfox.test.contract.oas.repository.UserRepository; -import javax.annotation.PostConstruct; +import jakarta.annotation.PostConstruct; import java.time.Instant; import java.time.temporal.ChronoUnit; import java.util.Date; diff --git a/oas-contract-tests/src/main/java/springfox/test/contract/oas/bugs/Bug3353.java b/oas-contract-tests/src/main/java/springfox/test/contract/oas/bugs/Bug3353.java index 82797ed5bdc..e6c13fcd7eb 100644 --- a/oas-contract-tests/src/main/java/springfox/test/contract/oas/bugs/Bug3353.java +++ b/oas-contract-tests/src/main/java/springfox/test/contract/oas/bugs/Bug3353.java @@ -8,6 +8,7 @@ import com.fasterxml.jackson.annotation.JsonPropertyOrder; import com.fasterxml.jackson.annotation.JsonView; import io.swagger.annotations.ApiParam; +import org.springframework.util.ObjectUtils; import org.springframework.util.StringUtils; import javax.validation.constraints.Digits; @@ -144,7 +145,7 @@ public KeyHintBuilder() { public void addProperty( String name, Object property) { - if (StringUtils.hasLength(property)) { + if (!ObjectUtils.isEmpty(property)) { this.builder.append(property); } } @@ -190,7 +191,7 @@ public QueryParamsBuilder() { public void addToUri( String name, Object property) { - if (StringUtils.hasLength(property)) { + if (!ObjectUtils.isEmpty(property)) { if (this.builder.length() > 0) { this.builder.append("&"); } From 1370bf384b14478610d4fcdf213087623ec0af24 Mon Sep 17 00:00:00 2001 From: XSComSoft Date: Tue, 20 Dec 2022 17:19:54 +0800 Subject: [PATCH 14/19] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E9=A1=B9=E7=9B=AE?= =?UTF-8?q?=E4=BD=BF=E5=85=B6=E6=94=AF=E6=8C=81MavenNexus=20publish?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 + .version | 2 +- gradle.properties | 6 --- gradle/publishing.gradle | 80 ++++++++-------------------------------- settings.gradle | 35 ------------------ 5 files changed, 17 insertions(+), 107 deletions(-) delete mode 100644 gradle.properties diff --git a/.gitignore b/.gitignore index c3b19ab593d..85596381f60 100644 --- a/.gitignore +++ b/.gitignore @@ -21,3 +21,4 @@ package-lock.json .eclipse/ bin/ .envrc +gradle.properties \ No newline at end of file diff --git a/.version b/.version index afa63656064..0c89fc927e3 100644 --- a/.version +++ b/.version @@ -1 +1 @@ -4.0.0-SNAPSHOT \ No newline at end of file +4.0.0 \ No newline at end of file diff --git a/gradle.properties b/gradle.properties deleted file mode 100644 index d73490c742b..00000000000 --- a/gradle.properties +++ /dev/null @@ -1,6 +0,0 @@ -org.gradle.jvmargs=-Xmx3G -XX:+HeapDumpOnOutOfMemoryError - -#systemProp.http.proxyHost=127.0.0.1 -#systemProp.https.proxyHost=127.0.0.1 -#systemProp.https.proxyPort=9998 -#systemProp.http.proxyPort=9998 diff --git a/gradle/publishing.gradle b/gradle/publishing.gradle index 6a98d05d30f..e0eac74794f 100644 --- a/gradle/publishing.gradle +++ b/gradle/publishing.gradle @@ -7,13 +7,10 @@ Date buildTimeAndDate = new Date() ext { buildDate = new SimpleDateFormat('yyyy-MM-dd').format(buildTimeAndDate) buildTime = new SimpleDateFormat('HH:mm:ss.SSSZ').format(buildTimeAndDate) - projectUrl = "https://github.com/springfox/springfox" - bintrayUser = project.hasProperty('bintrayUsername') ? - project.property('bintrayUsername') : - System.getenv('BINTRAY_USER_NAME') - bintrayApiKey = project.hasProperty('bintrayApiKey') ? - project.property('bintrayApiKey') : - System.getenv('BINTRAY_PASSWORD') + projectUrl = "https://github.com/XSComSoft/springfox-springboot3" + publishUrl = project.hasProperty('publishUrl') ? + project.property('publishUrl') : + System.getenv('PUBLISH_URL') passphrase = project.hasProperty('gpgPassphrase') ? project.property('gpgPassphrase') : System.getenv('GPG_PASSPHRASE') @@ -29,8 +26,6 @@ ext { } apply plugin: 'maven-publish' -apply plugin: 'com.jfrog.bintray' -apply plugin: "com.jfrog.artifactory" jar { manifest { @@ -76,6 +71,16 @@ javadoc { } publishing { + repositories { + maven { + name 'nexus' + url = project.publishUrl + credentials{ + username = project.ossUser + password = project.ossPassword + } + } + } publications { mavenJava(MavenPublication) { from components.java @@ -89,7 +94,7 @@ publishing { } pom { name = "${project.name}" - url = "https://github.com/springfox/springfox" + url = "https://github.com/XSComSoft/springfox-springboot3" description = "JSON API documentation for spring based applications" scm { @@ -131,59 +136,4 @@ publishing { } -artifactory { - contextUrl = 'https://oss.jfrog.org' - resolve { - repository { - repoKey = 'libs-release' - maven = true - } - } - publish { - repository { - repoKey = 'oss-snapshot-local' //The Artifactory repository key to publish to - //when using oss.jfrog.org the credentials are from Bintray. For local build we expect them to be found in - //~/.gradle/gradle.properties, otherwise to be set in the build server - username = project.bintrayUser - password = project.bintrayApiKey - } - defaults { - publications('mavenJava') - } - } -} - -bintray { - user = project.bintrayUser - key = project.bintrayApiKey - dryRun = MultiProjectReleasePlugin.dryRun(project) //Whether to run this as dry-run, without deploying - publish = true //If version should be auto published after an upload - publications = ['mavenJava'] - pkg { - repo = 'maven-repo' - name = "springfox" - userOrg = "springfox" - websiteUrl = "${project.projectUrl}" - issueTrackerUrl = "${project.projectUrl}/issues" - vcsUrl = "${project.projectUrl}.git" - desc = project.description - licenses = ['Apache-2.0'] - labels = ['spring', 'swagger', 'apis', 'oas', 'openapi', 'springfox'] - publicDownloadNumbers = true - version { - vcsTag = project.version - gpg { - sign = true //Determines whether to GPG sign the files. The default is false - //Optional. The passphrase for GPG signing' - passphrase = project.passphrase - } - mavenCentralSync { - sync = ("true" == project.shouldSyncWithMavenCentral) - user = project.sonatypeUser - password = project.sonatypePassword - close = '1' - } - } - } -} diff --git a/settings.gradle b/settings.gradle index 5901eac5144..d73a78481ad 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1,38 +1,3 @@ -import org.gradle.api.initialization.resolve.RepositoriesMode - -pluginManagement { - repositories { - mavenLocal() - //maven {url "https://plugins.gradle.org/m2/"} - maven{ url 'https://maven.aliyun.com/repository/public'} - maven{ url 'https://maven.aliyun.com/repository/central'} - maven {url 'https://maven.aliyun.com/repository/google'} - maven {url 'https://maven.aliyun.com/repository/spring'} - maven {url 'https://maven.aliyun.com/nexus/content/repositories/jcenter'} - maven {url 'https://maven.aliyun.com/repository/spring-plugin'} - maven { url 'https://jitpack.io' } - gradlePluginPortal() - } -} - -dependencyResolutionManagement { - repositoriesMode.set(RepositoriesMode.PREFER_PROJECT) - repositories { - //maven {url "https://plugins.gradle.org/m2/"} - maven {url 'https://maven.aliyun.com/repository/public'} - maven {url 'https://maven.aliyun.com/repository/central'} - maven {url 'https://maven.aliyun.com/repository/google'} - maven {url 'https://maven.aliyun.com/repository/spring'} - maven {url 'https://maven.aliyun.com/nexus/content/repositories/jcenter'} - maven {url 'https://maven.aliyun.com/repository/spring-plugin'} - maven { url 'https://jitpack.io' } - mavenCentral() - gradlePluginPortal() - } -} - - - rootProject.name = 'springfox' include 'springfox-core' include 'springfox-spi' From 4a19a7fda43c062953c5e6fd0ff6bca995a80d3f Mon Sep 17 00:00:00 2001 From: XSComSoft Date: Mon, 26 Dec 2022 00:49:48 +0800 Subject: [PATCH 15/19] =?UTF-8?q?=E6=9B=B4=E6=96=B0MD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 170 +++++++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 135 insertions(+), 35 deletions(-) diff --git a/README.md b/README.md index 0a8262802a1..237898aa3ca 100644 --- a/README.md +++ b/README.md @@ -1,44 +1,144 @@ -# Springfox - -### Useful links -- [Reference Documentation](http://springfox.io) -- [Examples repository](https://github.com/springfox/springfox-demos) -- [Contribution Guidelines](https://github.com/springfox/springfox/wiki/Contribution-guidelines) -- [Core contributors](http://springfox.github.io/springfox/contributors.html) -- [Development and contribution guidelines](https://github.com/martypitt/swagger-springmvc/wiki/Development) -- [Change log](docs/release-notes.md) -- [Development Environment](http://springfox.github.io/springfox/docs/current/#development-environment) -- [Release Instructions](http://springfox.github.io/springfox/docs/current/#releasing) - -### Getting Started - -#### For new projects -For Maven -```xml +# SpringFox Reload + +项目基于[springfox/springfox: Automated JSON API documentation for API's built with Spring (github.com)](https://github.com/springfox/springfox)进行的改动 + +The project is based on the changes made by [springfox/springfox: Automated JSON API documentation for API's built with Spring (github.com)](https://github.com/springfox/springfox) + +因为在SpringBoot3中直接使用springfox来启用文档会导致报错从而无法进行正常的使用,其原因是SpringBoot3中有一些Class被执行了重构,比如原本调用的Enum常量变成了String常量等等。 + +Because using springfox directly in SpringBoot3 to enable documents will result in an error and cannot be used normally. The reason is that some Classes in SpringBoot3 have been refactored, such as the originally called Enum constants become String constants and so on. + +您可以直接通过引用我的私人Repository来引用这份重构之后的SpringFox,这个源同时包含了springplugin、mavencentral、google、gradle、milestone等源的代理镜像 + +You can directly refer to this refactored SpringFox by citing my private Repository. This source also includes proxy images of sources such as springplugin, mavencentral, google, gradle, and milestone + +## 使用方法/Usage + +**Maven使用方法/Usage for maven** + +在你的项目中添加该节点 + +Add this repository in your project + +```xml + + + xssoft + https://xssoft.club:5678/repository/main + + true + + + true + + + +``` + +在你的maven项目依赖中添加 + +and add this to your project dependencies + +```xml - io.springfox - springfox-boot-starter - 3.0.0 + io.springfox + springfox-boot-starter + 4.0.0 - ``` +并且创建Spring Configuration + +and create this Spring Configuration + +```java +@Configuration +@EnableOpenApi +public class SpringFoxConfig implements WebMvcConfigurer { + private final SwaggerProperties swaggerProperties; + + public SpringFoxConfig(SwaggerProperties swaggerProperties) { + this.swaggerProperties = swaggerProperties; + } -License -------- + /** + * Swagger挂载点设置 + * @return + */ + @Bean + public Docket createRestApi() { + return new Docket(DocumentationType.OAS_30) + .enable(swaggerProperties.getEnable()) + .apiInfo(apiInfo()) + .host(swaggerProperties.getTryHost()) + .protocols(newHashSet("https", "http")) + .securitySchemes(securitySchemes()) + .securityContexts(securityContexts()); + } -Copyright 2015 Marty Pitt - [@martypitt](https://github.com/martypitt), Dilip Krishnan - [@dilipkrish](https://github.com/dilipkrish), -Adrian Kelly - [@adrianbk](https://github.com/adrianbk), + /** + * API 页面上半部分展示信息 + */ + private ApiInfo apiInfo() { + return new ApiInfoBuilder().title(swaggerProperties.getApplicationName() + " Api Doc") + .description(swaggerProperties.getApplicationDescription()) + .contact(new Contact("MawManager", null, "mawserver@foxmail.com")) + .version("程序版本号: " + swaggerProperties.getApplicationVersion() + ", Spring Boot框架版本号: " + SpringBootVersion.getVersion()) + .build(); + } -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at [apache.org/licenses/LICENSE-2.0](http://www.apache.org/licenses/LICENSE-2.0) + /** + * 设置授权信息 + */ + private List securitySchemes() { + ApiKey apiKey = new ApiKey("BASE_TOKEN", "token", In.HEADER.toValue()); + return Collections.singletonList(apiKey); + } + + /** + * 授权信息全局应用 + */ + private List securityContexts() { + return Collections.singletonList( + SecurityContext.builder() + .securityReferences(Collections.singletonList(new SecurityReference("BASE_TOKEN", new AuthorizationScope[]{new AuthorizationScope("global", "")}))) + .build() + ); + } + + /** + * 新的哈希数组 + * @param ts 参数 + * @return 新的哈希数组 + * @param 类型 + */ + @SafeVarargs + private Set newHashSet(T... ts) { + if (ts.length > 0) { + return new LinkedHashSet<>(Arrays.asList(ts)); + } + return null; + } + + @Override + public void addResourceHandlers(ResourceHandlerRegistry registry) { + registry.addResourceHandler("/swagger-ui/**").addResourceLocations("classpath:/META-INF/resources/webjars/springfox-swagger-ui/").resourceChain(false); + registry.addResourceHandler("/documentation/swagger-ui.html**").addResourceLocations("classpath:/META-INF/resources/swagger-ui.html"); + registry.addResourceHandler("/documentation/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/"); + + } + + @Override + public void addViewControllers(ViewControllerRegistry registry) { + registry.addViewController("/swagger-ui").setViewName("forward:/swagger-ui/index.html"); + registry.addRedirectViewController("/documentation/v3/api-docs", "/v3/api-docs?group=restful-api"); + registry.addRedirectViewController("/documentation/swagger-resources/configuration/ui", "/swagger-resources/configuration/ui"); + registry.addRedirectViewController("/documentation/swagger-resources/configuration/security", "/swagger-resources/configuration/security"); + registry.addRedirectViewController("/documentation/swagger-resources", "/swagger-resources"); + } +} +``` -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. +现在你可以在/swagger-ui/index.html访问你的OAS_30文档了 -## License -[![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Fspringfox%2Fspringfox.svg?type=large)](https://app.fossa.io/projects/git%2Bgithub.com%2Fspringfox%2Fspringfox?ref=badge_large) +Now you can access your OAS_30 documentation at /swagger-ui/index.html \ No newline at end of file From 8fc2cd61e901884bb25bfb50dfd7652660928bfd Mon Sep 17 00:00:00 2001 From: XSComSoft Date: Mon, 26 Dec 2022 03:51:13 +0800 Subject: [PATCH 16/19] =?UTF-8?q?=E4=BF=AE=E6=94=B9MD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 237898aa3ca..19c222da541 100644 --- a/README.md +++ b/README.md @@ -141,4 +141,7 @@ public class SpringFoxConfig implements WebMvcConfigurer { 现在你可以在/swagger-ui/index.html访问你的OAS_30文档了 -Now you can access your OAS_30 documentation at /swagger-ui/index.html \ No newline at end of file +Now you can access your OAS_30 documentation at /swagger-ui/index.html + + **mawserver@foxmail.com 连旭灿进行的修改,如果你有各种软件需求欢迎联系** + From 249bb4bb9323c1be97568ad9efc505f51b7879ee Mon Sep 17 00:00:00 2001 From: XSComSoft Date: Fri, 13 Jan 2023 08:54:40 +0800 Subject: [PATCH 17/19] =?UTF-8?q?[BugFix]SpringBoot3=E4=B8=AD=E7=9A=84Requ?= =?UTF-8?q?estMapping=E7=9A=84patternCondition=E5=AD=97=E6=AE=B5=E5=BA=94?= =?UTF-8?q?=E8=AF=A5=E6=9B=BF=E6=8D=A2=E4=B8=BApathPatterncondition=20----?= =?UTF-8?q?-=20[BugFix]=20The=20patternCondition=20field=20of=20RequestMap?= =?UTF-8?q?ping=20in=20SpringBoot3=20should=20be=20replaced=20with=20pathP?= =?UTF-8?q?atterncondition?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .version | 2 +- README.md | 2 +- .../java/springfox/documentation/RequestHandlerKey.java | 7 ++++--- .../spring/data/rest/SpringDataRestRequestHandler.java | 3 ++- .../documentation/spring/web/WebFluxRequestHandler.java | 4 +--- .../spring/web/WebMvcPatternsRequestConditionWrapper.java | 7 ++++--- .../documentation/spring/web/WebMvcRequestHandler.java | 4 ++-- 7 files changed, 15 insertions(+), 14 deletions(-) diff --git a/.version b/.version index 0c89fc927e3..aa31e71b033 100644 --- a/.version +++ b/.version @@ -1 +1 @@ -4.0.0 \ No newline at end of file +4.0.3 \ No newline at end of file diff --git a/README.md b/README.md index 19c222da541..5bd8fc0e850 100644 --- a/README.md +++ b/README.md @@ -43,7 +43,7 @@ and add this to your project dependencies io.springfox springfox-boot-starter - 4.0.0 + 4.0.3 ``` diff --git a/springfox-core/src/main/java/springfox/documentation/RequestHandlerKey.java b/springfox-core/src/main/java/springfox/documentation/RequestHandlerKey.java index 32a6586cab1..8adef13eb3c 100644 --- a/springfox-core/src/main/java/springfox/documentation/RequestHandlerKey.java +++ b/springfox-core/src/main/java/springfox/documentation/RequestHandlerKey.java @@ -21,19 +21,20 @@ import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.util.pattern.PathPattern; import java.util.Objects; import java.util.Set; public class RequestHandlerKey { - private final Set pathMappings; + private final Set pathMappings; private final Set supportedMethods; private final Set supportedMediaTypes; private final Set producibleMediaTypes; public RequestHandlerKey( - Set pathMappings, + Set pathMappings, Set supportedMethods, Set supportedMediaTypes, Set producibleMediaTypes) { @@ -44,7 +45,7 @@ public RequestHandlerKey( this.producibleMediaTypes = producibleMediaTypes; } - public Set getPathMappings() { + public Set getPathMappings() { return pathMappings; } diff --git a/springfox-data-rest/src/main/java/springfox/documentation/spring/data/rest/SpringDataRestRequestHandler.java b/springfox-data-rest/src/main/java/springfox/documentation/spring/data/rest/SpringDataRestRequestHandler.java index cddc6e39eac..47c2cae13c5 100644 --- a/springfox-data-rest/src/main/java/springfox/documentation/spring/data/rest/SpringDataRestRequestHandler.java +++ b/springfox-data-rest/src/main/java/springfox/documentation/spring/data/rest/SpringDataRestRequestHandler.java @@ -23,6 +23,7 @@ import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.method.HandlerMethod; +import org.springframework.web.util.pattern.PathPatternParser; import springfox.documentation.RequestHandler; import springfox.documentation.RequestHandlerKey; import springfox.documentation.service.ResolvedMethodParameter; @@ -72,7 +73,7 @@ public boolean isAnnotatedWith(Class annotation) { public PatternsRequestCondition getPatternsCondition() { return new WebMvcPatternsRequestConditionWrapper( contextPath, - new org.springframework.web.servlet.mvc.condition.PatternsRequestCondition(actionSpecification.getPath()) + new org.springframework.web.servlet.mvc.condition.PathPatternsRequestCondition(PathPatternParser.defaultInstance, actionSpecification.getPath()) ); } diff --git a/springfox-spring-webflux/src/main/java/springfox/documentation/spring/web/WebFluxRequestHandler.java b/springfox-spring-webflux/src/main/java/springfox/documentation/spring/web/WebFluxRequestHandler.java index 34e33ee30d0..a5d40300b14 100644 --- a/springfox-spring-webflux/src/main/java/springfox/documentation/spring/web/WebFluxRequestHandler.java +++ b/springfox-spring-webflux/src/main/java/springfox/documentation/spring/web/WebFluxRequestHandler.java @@ -121,9 +121,7 @@ public Optional findAnnotation(Class annotation) { @Override public RequestHandlerKey key() { return new RequestHandlerKey( - requestMapping.getPatternsCondition().getPatterns().stream() - .map(PathPattern::getPatternString) - .collect(Collectors.toSet()), + requestMapping.getPatternsCondition().getPatterns(), requestMapping.getMethodsCondition().getMethods(), requestMapping.getConsumesCondition().getConsumableMediaTypes(), requestMapping.getProducesCondition().getProducibleMediaTypes()); diff --git a/springfox-spring-webmvc/src/main/java/springfox/documentation/spring/web/WebMvcPatternsRequestConditionWrapper.java b/springfox-spring-webmvc/src/main/java/springfox/documentation/spring/web/WebMvcPatternsRequestConditionWrapper.java index 485fcb5b60d..80a6a31ffb7 100644 --- a/springfox-spring-webmvc/src/main/java/springfox/documentation/spring/web/WebMvcPatternsRequestConditionWrapper.java +++ b/springfox-spring-webmvc/src/main/java/springfox/documentation/spring/web/WebMvcPatternsRequestConditionWrapper.java @@ -19,6 +19,7 @@ package springfox.documentation.spring.web; +import org.springframework.web.servlet.mvc.condition.PathPatternsRequestCondition; import org.springframework.web.servlet.mvc.condition.PatternsRequestCondition; import java.util.Collections; @@ -33,11 +34,11 @@ public class WebMvcPatternsRequestConditionWrapper implements springfox.documentation.spring.wrapper.PatternsRequestCondition { private final String contextPath; - private final PatternsRequestCondition condition; + private final PathPatternsRequestCondition condition; public WebMvcPatternsRequestConditionWrapper( String contextPath, - PatternsRequestCondition condition) { + PathPatternsRequestCondition condition) { this.contextPath = contextPath; this.condition = condition; @@ -60,7 +61,7 @@ public Set getPatterns() { return new HashSet<>(); } return this.condition.getPatterns().stream() - .map(p -> String.format("%s/%s", maybeChompTrailingSlash(contextPath), maybeChompLeadingSlash(p))) + .map(p -> String.format("%s/%s", maybeChompTrailingSlash(contextPath), maybeChompLeadingSlash(p.getPatternString()))) .collect(Collectors.toSet()); } diff --git a/springfox-spring-webmvc/src/main/java/springfox/documentation/spring/web/WebMvcRequestHandler.java b/springfox-spring-webmvc/src/main/java/springfox/documentation/spring/web/WebMvcRequestHandler.java index da464650ce7..3230e85304c 100644 --- a/springfox-spring-webmvc/src/main/java/springfox/documentation/spring/web/WebMvcRequestHandler.java +++ b/springfox-spring-webmvc/src/main/java/springfox/documentation/spring/web/WebMvcRequestHandler.java @@ -77,7 +77,7 @@ public boolean isAnnotatedWith(Class annotation) { public PatternsRequestCondition getPatternsCondition() { return new WebMvcPatternsRequestConditionWrapper( contextPath, - requestMapping.getPatternsCondition()); + requestMapping.getPathPatternsCondition()); } @Override @@ -122,7 +122,7 @@ public Optional findAnnotation(Class annotation) { @Override public RequestHandlerKey key() { - org.springframework.web.servlet.mvc.condition.PatternsRequestCondition sets = requestMapping.getPatternsCondition(); + org.springframework.web.servlet.mvc.condition.PathPatternsRequestCondition sets = requestMapping.getPathPatternsCondition(); return new RequestHandlerKey( sets!=null?sets.getPatterns():new HashSet<>(), requestMapping.getMethodsCondition().getMethods(), From fac4a9f414691334610c790c89347fe2879d4c07 Mon Sep 17 00:00:00 2001 From: XSComSoft Date: Fri, 13 Jan 2023 09:08:21 +0800 Subject: [PATCH 18/19] =?UTF-8?q?=E6=9B=B4=E6=96=B0MD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 72 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 72 insertions(+) diff --git a/README.md b/README.md index 5bd8fc0e850..e7efd40039e 100644 --- a/README.md +++ b/README.md @@ -51,6 +51,41 @@ and add this to your project dependencies and create this Spring Configuration +### 简易版本 +### Simple Version +```java +@Configuration +@EnableOpenApi +public class SpringFoxConfig implements WebMvcConfigurer { + private final SwaggerProperties swaggerProperties; + + public SpringFoxConfig(SwaggerProperties swaggerProperties) { + this.swaggerProperties = swaggerProperties; + } + + /** + * Swagger挂载点设置 + * @return + */ + @Bean + public Docket createRestApi() { + return new Docket(DocumentationType.OAS_30) + .enable(swaggerProperties.getEnable()) + .apiInfo(apiInfo()) + .select() + .apis(e -> !e.getName().equals("error")) + .paths(e -> !e.equals("")) + .build() + .host(swaggerProperties.getTryHost()) + .protocols(newHashSet("https", "http")); + } +} +``` + +### SpringSecurity启用时复杂版本 +### Complex version when SpringSecurity enabled + + ```java @Configuration @EnableOpenApi @@ -143,5 +178,42 @@ public class SpringFoxConfig implements WebMvcConfigurer { Now you can access your OAS_30 documentation at /swagger-ui/index.html +其中SwaggerProperties的Demo + +And the SwaggerProperties Demo + +```java +@Data +@Configuration +@PropertySource(value = "classpath:swagger.properties", encoding = "UTF-8") +@ConfigurationProperties +public class SwaggerProperties { + /** + * 是否开启swagger,生产环境一般关闭,所以这里定义一个变量 + */ + private Boolean enable; + + /** + * 项目应用名 + */ + private String applicationName; + + /** + * 项目版本信息 + */ + private String applicationVersion; + + /** + * 项目描述信息 + */ + private String applicationDescription; + + /** + * 接口调试地址 + */ + private String tryHost; +} +``` + **mawserver@foxmail.com 连旭灿进行的修改,如果你有各种软件需求欢迎联系** From 809520394ce7b3e3216e5b424a951cf1b49e7468 Mon Sep 17 00:00:00 2001 From: Kyle Johnson <119340322+kylejPomelo@users.noreply.github.com> Date: Mon, 18 Mar 2024 12:15:03 -0600 Subject: [PATCH 19/19] getting maven build working --- build.gradle | 48 +- .../plugins/MultiProjectReleasePlugin.groovy | 2 +- .../utils/ProjectDefinitions.groovy | 2 +- codecov.yml | 2 +- config/checkstyle.xml | 5 +- gradle/dependencies.gradle | 1 - gradle/publishing.gradle | 9 +- gradle/wrapper/gradle-wrapper.jar | Bin 58910 -> 59821 bytes gradlew | 257 +- gradlew.bat | 21 +- oas-contract-tests/build.gradle | 4 +- .../gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 59821 bytes .../gradle/wrapper/gradle-wrapper.properties | 5 + oas-contract-tests/gradlew | 234 ++ oas-contract-tests/gradlew.bat | 89 + settings.gradle | 17 - .../gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 59821 bytes .../gradle/wrapper/gradle-wrapper.properties | 5 + springfox-bean-validators/gradlew | 234 ++ springfox-bean-validators/gradlew.bat | 89 + springfox-boot-starter/.gitignore | 32 - springfox-boot-starter/build.gradle | 23 - .../OpenApiAutoConfiguration.java | 32 - .../SpringfoxConfigurationProperties.java | 178 - .../SwaggerUiWebFluxConfiguration.java | 52 - .../SwaggerUiWebFluxConfigurer.java | 24 - .../SwaggerUiWebMvcConfiguration.java | 30 - .../SwaggerUiWebMvcConfigurer.java | 31 - .../main/resources/META-INF/spring.factories | 3 - springfox-core/build.gradle | 2 +- .../gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 59821 bytes .../gradle/wrapper/gradle-wrapper.properties | 5 + springfox-core/gradlew | 234 ++ springfox-core/gradlew.bat | 89 + .../documentation/schema/XmlTest.java | 44 - springfox-data-rest/build.gradle | 28 - .../spring/data/rest/ActionSpecification.java | 109 - .../rest/BasePathAwareServicesProvider.java | 86 - .../rest/DefaultExtractorConfiguration.java | 54 - .../data/rest/EntityAssociationContext.java | 52 - .../EntityAssociationDeleteExtractor.java | 63 - .../rest/EntityAssociationGetExtractor.java | 62 - .../EntityAssociationItemDeleteExtractor.java | 70 - .../EntityAssociationItemGetExtractor.java | 69 - .../EntityAssociationOperationsExtractor.java | 27 - .../rest/EntityAssociationSaveExtractor.java | 72 - .../rest/EntityAssociationsExtractor.java | 52 - .../spring/data/rest/EntityContext.java | 129 - .../data/rest/EntityDeleteExtractor.java | 54 - .../data/rest/EntityFindAllExtractor.java | 57 - .../data/rest/EntityFindOneExtractor.java | 54 - .../data/rest/EntityOperationsExtractor.java | 27 - .../spring/data/rest/EntitySaveExtractor.java | 63 - .../data/rest/EntitySearchExtractor.java | 55 - .../data/rest/EntityServicesProvider.java | 112 - .../spring/data/rest/OptionalDeferencer.java | 34 - .../data/rest/RequestExtractionUtils.java | 122 - .../RequestHandlerExtractorConfiguration.java | 27 - .../data/rest/SpecificationBuilder.java | 370 -- .../rest/SpringDataRestRequestHandler.java | 175 - .../data/rest/SynthesizedAnnotations.java | 111 - .../SpringDataRestConfiguration.java | 91 - .../data/rest/schema/EmbeddedCollection.java | 22 - .../EmbeddedCollectionModelProvider.java | 172 - .../rest/schema/ResourcesModelProvider.java | 213 - .../SpringDataRestSchemaExtensions.java | 52 - springfox-oas/build.gradle | 52 - .../oas/annotations/EnableOpenApi.java | 43 - .../OpenApiDocumentationConfiguration.java | 45 - .../configuration/OpenApiJacksonModule.java | 95 - .../OpenApiMappingConfiguration.java | 13 - .../OpenApiWebFluxConfiguration.java | 25 - .../OpenApiWebMvcConfiguration.java | 25 - ...lectionSpecificationToSchemaConverter.java | 35 - ...ompoundSpecificationToSchemaConverter.java | 36 - .../oas/mappers/ExamplesMapper.java | 38 - .../oas/mappers/LicenseMapper.java | 53 - .../documentation/oas/mappers/MapSchema.java | 67 - .../MapSpecificationToSchemaConverter.java | 23 - ...delSpecificationInheritanceDeterminer.java | 44 - ...ceModelSpecificationToSchemaConverter.java | 31 - .../mappers/ScalarModelToSchemaConverter.java | 54 - .../oas/mappers/SchemaMapper.java | 444 --- .../oas/mappers/SecurityMapper.java | 28 - .../oas/mappers/SecuritySchemeMapper.java | 91 - .../mappers/ServiceModelToOpenApiMapper.java | 406 -- .../oas/mappers/StyleEnumMapper.java | 41 - .../oas/mappers/VendorExtensionsMapper.java | 107 - .../web/ForwardedHeaderExtractingRequest.java | 95 - .../oas/web/ForwardedPrefixExtractor.java | 122 - .../oas/web/OpenApiControllerWebFlux.java | 98 - .../oas/web/OpenApiControllerWebMvc.java | 100 - .../oas/web/OpenApiTransformationContext.java | 27 - .../oas/web/OpenApiTransformationFilter.java | 9 - .../documentation/oas/web/SpecGeneration.java | 46 - ...sePathAndHostnameTransformationFilter.java | 49 - .../WebFluxOpenApiTransformationFilter.java | 6 - ...sePathAndHostnameTransformationFilter.java | 43 - .../WebMvcOpenApiTransformationFilter.java | 6 - .../documentation/oas/ComplexTypeSpec.groovy | 140 - .../oas/ContainerTypesSpec.groovy | 189 - .../oas/ModelRegistrySupport.groovy | 69 - .../documentation/oas/SimpleTypeSpec.groovy | 133 - springfox-petstore-webflux/build.gradle | 13 - .../webflux/PetStoreConfiguration.java | 83 - .../webflux/RecursiveAlternateTypeRule.java | 62 - .../springfox/petstore/webflux/Responses.java | 41 - .../webflux/controller/NotFoundException.java | 38 - .../webflux/controller/PetController.java | 212 - .../webflux/controller/PetStoreResource.java | 106 - .../webflux/controller/UserController.java | 153 - .../petstore/webflux/model/Category.java | 58 - .../petstore/webflux/model/Order.java | 88 - .../springfox/petstore/webflux/model/Pet.java | 93 - .../springfox/petstore/webflux/model/Tag.java | 41 - .../petstore/webflux/model/User.java | 104 - .../webflux/repository/Identifiable.java | 24 - .../repository/MapBackedRepository.java | 56 - .../webflux/repository/UserRepository.java | 25 - .../src/main/resources/.gitkeep | 0 .../groovy/springfox/documentation/.gitkeep | 0 .../java/springfox/documentation/.gitkeep | 0 .../src/test/resources/.gitkeep | 0 springfox-petstore/build.gradle | 9 - .../petstore/PetStoreConfiguration.java | 52 - .../java/springfox/petstore/Responses.java | 41 - .../controller/NotFoundException.java | 38 - .../petstore/controller/PetController.java | 206 - .../petstore/controller/PetStoreResource.java | 106 - .../petstore/controller/UserController.java | 150 - .../springfox/petstore/model/Category.java | 58 - .../java/springfox/petstore/model/Order.java | 88 - .../java/springfox/petstore/model/Pet.java | 93 - .../java/springfox/petstore/model/Pets.java | 56 - .../java/springfox/petstore/model/Tag.java | 41 - .../java/springfox/petstore/model/User.java | 104 - .../petstore/repository/Identifiable.java | 24 - .../repository/MapBackedRepository.java | 56 - .../petstore/repository/UserRepository.java | 25 - .../src/main/resources/.gitkeep | 0 .../groovy/springfox/documentation/.gitkeep | 0 .../java/springfox/documentation/.gitkeep | 0 .../src/test/resources/.gitkeep | 0 .../gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 59821 bytes .../gradle/wrapper/gradle-wrapper.properties | 5 + springfox-schema/gradlew | 234 ++ springfox-schema/gradlew.bat | 89 + .../schema/SimpleTypeEntityModel.java | 3 +- .../gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 59821 bytes .../gradle/wrapper/gradle-wrapper.properties | 5 + springfox-spi/gradlew | 234 ++ springfox-spi/gradlew.bat | 89 + .../spi/service/contexts/DefaultsSpec.groovy | 78 - .../contexts/SecurityContextSpec.groovy | 71 - springfox-spring-config/build.gradle | 7 - .../springconfig/AdditionalModel.java | 22 - .../springconfig/Swagger2SpringBoot.java | 176 - .../springfox/springconfig/VersionApi.java | 29 - .../springconfig/VersionApiReader.java | 67 - .../springconfig/VersionedController.java | 37 - .../src/test/groovy/springfox/.gitkeep | 0 .../src/test/java/springfox/.gitkeep | 0 .../src/test/resources/.gitkeep | 0 .../README.md | 166 - .../build.gradle | 34 - ...pringIntegrationWebFluxRequestHandler.java | 86 - .../spring/web/package-info.java | 46 - ...egrationWebFluxRequestHandlerProvider.java | 84 - .../src/main/resources/.gitkeep | 0 ...ntegrationWebFluxRequestHandlerSpec.groovy | 108 - ...onWebFluxRequestHandlerProviderSpec.groovy | 52 - springfox-spring-integration-webmvc/README.md | 164 - .../build.gradle | 35 - ...SpringIntegrationWebMvcRequestHandler.java | 89 - .../spring/web/package-info.java | 46 - ...tegrationWebMvcRequestHandlerProvider.java | 93 - .../src/main/resources/.gitkeep | 0 ...IntegrationWebMvcRequestHandlerSpec.groovy | 112 - ...ionWebMvcRequestHandlerProviderSpec.groovy | 62 - springfox-spring-integration/README.md | 24 - springfox-spring-integration/build.gradle | 33 - .../spring/web/SpringfoxTemplateFormat.java | 39 - .../spring/web/package-info.java | 52 - ...ationDocumentationPluginsBootstrapper.java | 84 - .../SpringIntegrationParametersProvider.java | 142 - .../SpringRestDocsOperationBuilderPlugin.java | 183 - .../src/main/resources/.gitkeep | 0 .../springfox/default-curl-request.snippet | 1 - .../springfox/default-http-request.snippet | 5 - .../springfox/default-http-response.snippet | 5 - .../springfox/default-httpie-request.snippet | 1 - .../templates/springfox/default-links.snippet | 7 - .../springfox/default-path-parameters.snippet | 10 - .../springfox/default-request-body.snippet | 1 - .../springfox/default-request-fields.snippet | 10 - .../springfox/default-request-headers.snippet | 7 - .../default-request-parameters.snippet | 7 - .../default-request-part-body.snippet | 1 - .../default-request-part-fields.snippet | 8 - .../springfox/default-request-parts.snippet | 7 - .../springfox/default-response-body.snippet | 1 - .../springfox/default-response-fields.snippet | 8 - .../default-response-headers.snippet | 7 - ...ngIntegrationParametersProviderSpec.groovy | 63 - ...gRestDocsOperationBuilderPluginSpec.groovy | 63 - .../http-response.springfox | 5 - .../http-response.springfox | 5 - springfox-spring-web/build.gradle | 6 +- .../gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 59821 bytes .../gradle/wrapper/gradle-wrapper.properties | 5 + springfox-spring-web/gradlew | 234 ++ springfox-spring-web/gradlew.bat | 89 + .../spi/service/contexts/OrderingsSpec.groovy | 182 - .../web/ControllerNamingUtilsSpec.groovy | 72 - .../spring/web/DescriptionResolverSpec.groovy | 34 - .../spring/web/DocumentationCacheSpec.groovy | 57 - .../web/HandlerMethodReturnTypesSpec.groovy | 71 - .../web/SpringfoxWebConfigurationSpec.groovy | 16 - .../AuthSerializationSpec.groovy | 61 - .../AuthorizationContextSpec.groovy | 60 - .../spring/web/json/JsonSerializerTest.groovy | 52 - .../spring/web/json/JsonTest.groovy | 30 - .../web/mixins/AccessorAssertions.groovy | 35 - .../web/mixins/ApiDescriptionSupport.groovy | 33 - .../web/mixins/ApiListingSupport.groovy | 68 - .../spring/web/mixins/AuthSupport.groovy | 88 - .../web/mixins/HandlerMethodsSupport.groovy | 70 - .../ModelProviderForServiceSupport.groovy | 148 - .../web/mixins/ServicePluginsSupport.groovy | 110 - .../paths/OperationPathDecoratorSpec.groovy | 36 - .../web/paths/PathMappingDecoratorSpec.groovy | 31 - .../spring/web/paths/PathSanitizerSpec.groovy | 38 - .../spring/web/paths/PathsSpec.groovy | 94 - ...QueryStringUriTemplateDecoratorSpec.groovy | 85 - .../plugins/DocumentationContextSpec.groovy | 66 - ...ocumentationPluginsBootstrapperSpec.groovy | 157 - .../DuplicateGroupsDetectorSpec.groovy | 93 - .../JacksonSerializerConventionSpec.groovy | 80 - .../plugins/OperationModelsBuilderSpec.groovy | 57 - ...olvedMethodParameterEquivalenceSpec.groovy | 28 - .../CachingOperationNameGeneratorSpec.groovy | 36 - .../HandlerMethodResolverSpec.groovy | 298 -- .../ExpandedParameterBuilderSpec.groovy | 117 - ...ModelAttributeParameterExpanderSpec.groovy | 299 -- .../ParameterTypeDeterminerSpec.groovy | 38 - .../scanners/ModelNamesRegistrySpec.groovy | 102 - .../scanners/PathMappingAdjusterSpec.groovy | 47 - .../web/scanners/ResourceGroupsSpec.groovy | 31 - .../spring/web/dummy/Address.java | 88 - .../web/dummy/AlternateTypeContainer.java | 31 - .../web/dummy/Bug2219ListingScanner.java | 76 - .../spring/web/dummy/Category.java | 36 - .../spring/web/dummy/DummyClass.java | 616 --- .../dummy/DummyClassWithRequestMapping.java | 25 - ...ithRequestMappingWithMultipleMappings.java | 25 - ...WithRequestMappingWithoutForwardSlash.java | 25 - .../spring/web/dummy/DummyController.java | 32 - .../DummyControllerWithApiDescription.java | 31 - .../DummyControllerWithResourcePath.java | 31 - .../web/dummy/DummyControllerWithTags.java | 30 - .../web/dummy/DummyDeprecatedController.java | 31 - .../spring/web/dummy/DummyModels.java | 147 - .../DummyRequestMappingHandlerAdapter.java | 25 - .../spring/web/dummy/FancyPet.java | 34 - .../web/dummy/ModelWithSameNameClasses.java | 98 - .../spring/web/dummy/Person.java | 83 - .../documentation/spring/web/dummy/Pet.java | 50 - .../dummy/ResponseExampleTestController.java | 71 - .../dummy/ResponseHeaderTestController.java | 109 - .../spring/web/dummy/RestError.java | 36 - .../spring/web/dummy/SameCategory.java | 60 - .../spring/web/dummy/SameFancyPet.java | 33 - .../spring/web/dummy/SamePet.java | 73 - .../documentation/spring/web/dummy/Tag.java | 53 - .../spring/web/dummy/ToReplaceWithString.java | 23 - .../dummy/controllers/AbstractController.java | 49 - .../dummy/controllers/AbstractPetService.java | 40 - .../web/dummy/controllers/BugsController.java | 1096 ------ .../dummy/controllers/BusinessService.java | 102 - .../controllers/CommonRestController.java | 22 - .../dummy/controllers/ConcreteController.java | 30 - .../controllers/ConsumesProducesService.java | 63 - ...ControllerWithNoRequestMappingService.java | 38 - .../CyclicStructuresController.java | 57 - .../web/dummy/controllers/EnumService.java | 64 - .../dummy/controllers/ExcludedService.java | 46 - .../dummy/controllers/FancyPetService.java | 62 - .../FeatureDemonstrationService.java | 308 -- .../controllers/GenericPetController.java | 34 - .../controllers/GenericRestController.java | 36 - .../web/dummy/controllers/IRepository.java | 22 - .../dummy/controllers/InheritedService.java | 50 - .../controllers/InheritedServiceImpl.java | 42 - .../dummy/controllers/PetGroomingService.java | 50 - .../web/dummy/controllers/PetRepository.java | 26 - .../web/dummy/controllers/PetService.java | 204 - .../web/dummy/controllers/RootController.java | 40 - .../web/dummy/controllers/SameController.java | 46 - .../web/dummy/controllers/SortDirection.java | 24 - .../spring/web/dummy/models/AccountType.java | 40 - .../web/dummy/models/ApplicationLang.java | 28 - .../spring/web/dummy/models/Bar.java | 37 - .../spring/web/dummy/models/Bug1749.java | 120 - .../spring/web/dummy/models/Business.java | 60 - .../spring/web/dummy/models/Car.java | 49 - .../spring/web/dummy/models/Category.java | 36 - .../spring/web/dummy/models/City.java | 55 - .../spring/web/dummy/models/Country.java | 49 - .../models/CustomAllCapsStringHashSet.java | 47 - .../spring/web/dummy/models/District.java | 65 - .../dummy/models/EHDTOApplicatorUnits.java | 40 - .../spring/web/dummy/models/EHDTOUnit.java | 59 - .../web/dummy/models/EHDTOUnitGroup.java | 52 - .../web/dummy/models/EnumCollection.java | 34 - .../web/dummy/models/EnumObjectType.java | 47 - .../spring/web/dummy/models/EnumType.java | 25 - .../spring/web/dummy/models/Example.java | 150 - .../spring/web/dummy/models/FancyPet.java | 34 - .../spring/web/dummy/models/Foo.java | 43 - .../spring/web/dummy/models/FoobarDto.java | 62 - .../spring/web/dummy/models/Holder.java | 43 - .../spring/web/dummy/models/House.java | 83 - .../spring/web/dummy/models/Language.java | 28 - .../web/dummy/models/LanguageResponse.java | 28 - .../spring/web/dummy/models/LanguageText.java | 38 - .../spring/web/dummy/models/MapFancyPet.java | 44 - .../ModelAttributeComplexTypeExample.java | 65 - .../dummy/models/ModelAttributeExample.java | 78 - ...lAttributeWithHiddenParametersExample.java | 65 - .../dummy/models/ModelWithArrayOfArrays.java | 31 - .../dummy/models/ModelWithMapProperty.java | 38 - .../web/dummy/models/ModelWithObjectNode.java | 33 - .../models/ModelWithSameNameClasses.java | 98 - .../spring/web/dummy/models/Monkey.java | 31 - .../spring/web/dummy/models/NestedType.java | 36 - .../spring/web/dummy/models/OtherType.java | 40 - .../spring/web/dummy/models/Parent.java | 34 - .../spring/web/dummy/models/Pet.java | 50 - .../web/dummy/models/PetWithJsonView.java | 71 - .../web/dummy/models/PetWithSerializer.java | 25 - .../spring/web/dummy/models/Pirate.java | 31 - .../models/RecursiveTypeWithConditions.java | 37 - ...rsiveTypeWithNonEqualsConditionsInner.java | 34 - ...ithNonEqualsConditionsInnerWithCircle.java | 34 - ...WithNonEqualsConditionsInnerWithModel.java | 34 - ...siveTypeWithNonEqualsConditionsMiddle.java | 34 - ...thNonEqualsConditionsMiddleWithCircle.java | 45 - ...ithNonEqualsConditionsMiddleWithModel.java | 59 - ...rsiveTypeWithNonEqualsConditionsOuter.java | 48 - ...ithNonEqualsConditionsOuterWithCircle.java | 34 - ...WithNonEqualsConditionsOuterWithModel.java | 45 - ...hNonEqualsConditionsOuterWithSubTypes.java | 26 - .../spring/web/dummy/models/Region.java | 45 - .../spring/web/dummy/models/Response.java | 57 - .../spring/web/dummy/models/SameCategory.java | 58 - .../spring/web/dummy/models/SameFancyPet.java | 33 - .../spring/web/dummy/models/SamePet.java | 73 - .../spring/web/dummy/models/SomeType.java | 51 - .../spring/web/dummy/models/Street.java | 75 - .../spring/web/dummy/models/Treeish.java | 45 - .../spring/web/dummy/models/Truck.java | 39 - .../spring/web/dummy/models/Vehicle.java | 59 - .../spring/web/dummy/models/Wrapper.java | 15 - .../spring/web/dummy/models/same/Pet.java | 50 - springfox-spring-webflux/build.gradle | 31 - .../WebFluxNameValueExpressionWrapper.java | 68 - ...ebFluxPatternsRequestConditionWrapper.java | 72 - .../spring/web/WebFluxRequestHandler.java | 158 - .../WebFluxRequestHandlerProvider.java | 90 - .../src/main/resources/.gitkeep | 0 .../dummy/controllers/GroovyService.groovy | 22 - .../web/dummy/models/GroovyModel.groovy | 17 - springfox-spring-webmvc/build.gradle | 36 - .../web/OnNotServletBasedWebApplication.java | 13 - .../web/WebMvcNameValueExpressionWrapper.java | 68 - ...WebMvcPatternsRequestConditionWrapper.java | 92 - .../spring/web/WebMvcRequestHandler.java | 161 - .../web/WebMvcRequestMappingInfoWrapper.java | 37 - .../plugins/WebMvcRequestHandlerProvider.java | 97 - .../src/main/resources/.gitkeep | 0 .../schema/ReturnTypesSpec.groovy | 87 - .../OperationCachingEquivalenceSpec.groovy | 256 -- .../dummy/controllers/GroovyService.groovy | 22 - .../web/dummy/models/GroovyModel.groovy | 17 - .../spring/web/mixins/JsonSupport.groovy | 37 - .../web/mixins/RequestMappingSupport.groovy | 243 -- .../web/paths/DefaultPathProviderSpec.groovy | 64 - .../RelativeSwaggerPathProviderSpec.groovy | 39 - .../DefaultRequestHandlerCombinerSpec.groovy | 130 - .../spring/web/plugins/DocketSpec.groovy | 278 -- .../DocumentationPluginsManagerSpec.groovy | 156 - .../PathAndParametersEquivalenceSpec.groovy | 86 - .../WebMvcRequestHandlerProviderSpec.groovy | 38 - .../web/readers/ApiModelReaderSpec.groovy | 1588 -------- .../web/readers/ApiOperationReaderSpec.groovy | 95 - ...ultipartRequestParameterBuilderSpec.groovy | 346 -- .../readers/RepresentationReaderSpec.groovy | 142 - .../DefaultResponseMessageReaderSpec.groovy | 173 - .../OperationCommandReaderSpec.groovy | 66 - .../OperationMethodReaderSpec.groovy | 57 - ...ParameterHeadersConditionReaderSpec.groovy | 167 - ...ParameterRequestConditionReaderSpec.groovy | 105 - .../OperationPositionReaderSpec.groovy | 45 - .../OperationResponseClassReaderSpec.groovy | 84 - .../operation/OperationTagsReaderSpec.groovy | 46 - .../OperationParameterReaderSpec.groovy | 290 -- .../ParameterAnnotationSupport.groovy | 54 - .../ParameterDataTypeReaderSpec.groovy | 203 - .../ParameterMultiplesReaderSpec.groovy | 90 - .../parameter/ParameterReaderSpec.groovy | 191 - .../ParameterRequiredReaderSpec.groovy | 178 - .../parameter/ParameterTypeReaderSpec.groovy | 116 - .../scanners/ApiDescriptionLookupSpec.groovy | 48 - .../scanners/ApiDescriptionReaderSpec.groovy | 133 - .../ApiListingReferenceScannerSpec.groovy | 131 - .../web/scanners/ApiListingScannerSpec.groovy | 265 -- .../CachingOperationReaderSpec.groovy | 61 - .../scanners/ResourcePathProviderSpec.groovy | 30 - .../SwaggerApiDocumentationScannerSpec.groovy | 216 - ...ObjectMapperConfigurerIntegrationTest.java | 117 - springfox-swagger-common/build.gradle | 4 +- .../gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 59821 bytes .../gradle/wrapper/gradle-wrapper.properties | 5 + springfox-swagger-common/gradlew | 234 ++ springfox-swagger-common/gradlew.bat | 89 + .../annotations/AnnotationsSpec.groovy | 111 - .../common/HostNameProviderSpec.groovy | 77 - .../XForwardPrefixPathAdjusterSpec.groovy | 68 - .../mixins/SwaggerPluginsSupport.groovy | 115 - .../OpenApiOperationTagsReaderSpec.groovy | 75 - .../operation/OperationAuthReaderSpec.groovy | 100 - .../OperationCommandReaderSpec.groovy | 60 - .../OperationHttpMethodReaderSpec.groovy | 55 - ...perationImplicitParameterReaderSpec.groovy | 67 - .../OperationImplicitParamsReaderSpec.groovy | 91 - ...ationNicknameIntoUniqueIdReaderSpec.groovy | 48 - .../OperationPositionReaderSpec.groovy | 44 - .../SwaggerOperationModelsProviderSpec.groovy | 65 - ...gerOperationResponseClassReaderSpec.groovy | 92 - .../SwaggerOperationTagsReaderSpec.groovy | 45 - .../SwaggerRepresentationReaderSpec.groovy | 72 - .../SwaggerResponseMessageReaderSpec.groovy | 297 -- .../VendorExtensionsReaderSpec.groovy | 62 - .../ApiImplicitParamAnnotationSupport.groovy | 46 - .../ApiParamAnnotationSupport.groovy | 157 - .../ApiParamParameterBuilderSpec.groovy | 269 -- .../readers/parameter/ExamplesSpec.groovy | 129 - ...ModelAttributeParameterExpanderSpec.groovy | 125 - .../ParameterAnnotationReaderSpec.groovy | 76 - .../ParameterMultiplesReaderSpec.groovy | 87 - .../parameter/ParameterNameReaderSpec.groovy | 89 - .../parameter/ParameterReaderSpec.groovy | 99 - .../ParameterRequiredReaderSpec.groovy | 105 - ...SwaggerExpandedParameterBuilderSpec.groovy | 117 - .../swagger/schema/ApiModelBuilderSpec.groovy | 83 - ...ApiModelPropertyPropertyBuilderSpec.groovy | 300 -- .../ApiModelTypeNameProviderSpec.groovy | 46 - .../web/ApiResourceControllerSpec.groovy | 191 - ...nMemorySwaggerResourcesProviderSpec.groovy | 56 - .../SecurityConfigurationBuilderSpec.groovy | 54 - .../web/SecurityConfigurationSpec.groovy | 57 - .../web/SwaggerApiListingReaderSpec.groovy | 39 - .../web/UiConfigurationBuilderSpec.groovy | 67 - .../swagger/web/UiConfigurationSpec.groovy | 103 - .../java/springfox/documentation/.gitkeep | 0 .../TypeWithAnnotatedGettersAndSetters.java | 135 - ...thAnnotatedGettersAndSettersInterface.java | 27 - .../schema/TypeWithApiModelAnnotation.java | 26 - .../TypeWithEmptyApiModelAnnotation.java | 26 - .../schema/TypeWithGettersAndSetters.java | 80 - .../src/test/resources/.gitkeep | 0 springfox-swagger-ui/build.gradle | 3 +- .../gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 59821 bytes .../gradle/wrapper/gradle-wrapper.properties | 5 + springfox-swagger-ui/gradlew | 234 ++ springfox-swagger-ui/gradlew.bat | 89 + springfox-swagger1/build.gradle | 71 - .../groovy/CustomJavaPluginStartupSpec.groovy | 51 - .../groovy/CustomXmlPluginStartupSpec.groovy | 50 - .../DefaultJavaPluginStartupSpec.groovy | 49 - .../groovy/DefaultXmlPluginStartupSpec.groovy | 51 - .../MultiplePropertyPlaceholderSpec.groovy | 47 - ...leRequestMappingHandlerAdaptersSpec.groovy | 39 - .../swagger1/annotations/EnableSwagger.java | 43 - .../Swagger1DocumentationConfiguration.java | 67 - .../configuration/SwaggerJacksonModule.java | 111 - .../swagger1/dto/AllowableListValues.java | 58 - .../swagger1/dto/AllowableRangeValues.java | 53 - .../swagger1/dto/AllowableValues.java | 28 - .../swagger1/dto/ApiDescription.java | 76 - .../documentation/swagger1/dto/ApiInfo.java | 91 - .../documentation/swagger1/dto/ApiKey.java | 57 - .../swagger1/dto/ApiListing.java | 227 -- .../swagger1/dto/ApiListingReference.java | 59 - .../swagger1/dto/Authorization.java | 56 - .../swagger1/dto/AuthorizationCodeGrant.java | 52 - .../swagger1/dto/AuthorizationScope.java | 49 - .../swagger1/dto/AuthorizationType.java | 41 - .../documentation/swagger1/dto/BasicAuth.java | 27 - .../swagger1/dto/ContainerDataType.java | 61 - .../documentation/swagger1/dto/DataType.java | 117 - .../documentation/swagger1/dto/GrantType.java | 39 - .../swagger1/dto/ImplicitGrant.java | 52 - .../swagger1/dto/LoginEndpoint.java | 39 - .../documentation/swagger1/dto/ModelDto.java | 134 - .../swagger1/dto/ModelPropertyDto.java | 112 - .../documentation/swagger1/dto/OAuth.java | 73 - .../documentation/swagger1/dto/Operation.java | 207 - .../documentation/swagger1/dto/Parameter.java | 135 - .../swagger1/dto/PrimitiveDataType.java | 37 - .../swagger1/dto/PrimitiveFormatDataType.java | 44 - .../swagger1/dto/ReferenceDataType.java | 42 - .../swagger1/dto/ResourceListing.java | 95 - .../swagger1/dto/ResponseMessage.java | 62 - .../swagger1/dto/SwaggerDataType.java | 24 - .../swagger1/dto/TokenEndpoint.java | 50 - .../swagger1/dto/TokenRequestEndpoint.java | 60 - .../mappers/AllowableValuesMapper.java | 51 - .../mappers/AuthorizationTypesMapper.java | 104 - .../swagger1/mappers/DataTypeMapper.java | 109 - .../swagger1/mappers/Mappers.java | 73 - .../mappers/ServiceModelToSwaggerMapper.java | 98 - .../parameter/ParameterNameReader.java | 64 - .../swagger1/web/ApiListingMerger.java | 56 - .../swagger1/web/Swagger1Controller.java | 127 - .../web/SwaggerDefaultConfiguration.java | 75 - .../field/FieldModelPropertySpec.groovy | 115 - .../property/BeanModelPropertySpec.groovy | 175 - .../ApiDocumentationScannerSpec.groovy | 164 - ...aggerApiListingReferenceScannerSpec.groovy | 153 - .../scanners/SwaggerApiModelReaderSpec.groovy | 273 -- .../dto/AllowableListValuesSpec.groovy | 43 - .../dto/AllowableRangeValuesSpec.groovy | 33 - .../swagger1/dto/ApiDescriptionSpec.groovy | 41 - .../swagger1/dto/ApiInfoSpec.groovy | 54 - .../swagger1/dto/ApiKeySpec.groovy | 53 - .../dto/ApiListingReferenceSpec.groovy | 41 - .../swagger1/dto/ApiListingSpec.groovy | 156 - .../dto/AuthorizationScopeSpec.groovy | 39 - .../swagger1/dto/AuthorizationSpec.groovy | 41 - .../swagger1/dto/BasicAuthSpec.groovy | 46 - .../swagger1/dto/ContainerDataTypeSpec.groovy | 73 - .../swagger1/dto/DataTypeSpec.groovy | 58 - .../dto/InternalJsonSerializationSpec.groovy | 51 - .../swagger1/dto/ModelPropertySpec.groovy | 90 - .../swagger1/dto/ModelSpec.groovy | 76 - .../swagger1/dto/OperationSpec.groovy | 83 - .../swagger1/dto/ParameterSpec.groovy | 146 - .../swagger1/dto/PrimitiveDataTypeSpec.groovy | 28 - .../dto/PrimitiveFormatDataTypeSpec.groovy | 39 - .../swagger1/dto/ReferenceDataTypeSpec.groovy | 30 - .../swagger1/dto/ResourceListingSpec.groovy | 164 - .../swagger1/dto/ResponseMessageSpec.groovy | 58 - .../swagger1/dto/TokenEndpointSpec.groovy | 38 - .../dto/TokenRequestEndpointSpec.groovy | 50 - .../swagger1/integration/DocketSpec.groovy | 214 - .../AuthorizationTypesSerializerSpec.groovy | 71 - .../jackson/SwaggerJacksonModuleSpec.groovy | 45 - .../swagger1/mappers/AllMappersSpec.groovy | 82 - .../mappers/AllowableValuesMapperSpec.groovy | 110 - .../AuthorizationTypesMapperSpec.groovy | 197 - .../mappers/DataTypeMapperSpec.groovy | 74 - .../ServiceModelToSwaggerMapperSpec.groovy | 221 -- .../swagger1/mixins/MapperSupport.groovy | 51 - .../OperationParameterReaderSpec.groovy | 229 -- .../parameter/ParameterNameReaderSpec.groovy | 81 - .../swagger1/web/ApiListingMergerSpec.groovy | 75 - .../web/Swagger1ControllerSpec.groovy | 137 - .../SwaggerApiDescriptionReaderSpec.groovy | 98 - .../configuration/CustomJavaPluginConfig.java | 84 - .../configuration/CustomXmlJavaConfig.java | 51 - .../DefaultJavaPluginConfig.java | 34 - .../configuration/MultipleRMHAConfig.java | 34 - .../swagger1/configuration/SimpleBean.java | 44 - .../ServiceWithAnnotationOnInterface.java | 46 - .../src/test/resources/avalue.properties | 1 - .../test/resources/custom-plugin-context.xml | 15 - .../test/resources/default-plugin-context.xml | 13 - .../resources/handler-adapter-context.xml | 18 - .../placeholders-adapter-context.xml | 40 - springfox-swagger2/build.gradle | 27 +- .../gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 59821 bytes .../gradle/wrapper/gradle-wrapper.properties | 5 + springfox-swagger2/gradlew | 234 ++ springfox-swagger2/gradlew.bat | 89 + .../spring/web/OnReactiveWebApplication.java | 0 .../web/OnServletBasedWebApplication.java | 0 .../web/SpringfoxWebFluxConfiguration.java | 2 +- .../web/SpringfoxWebMvcConfiguration.java | 2 +- .../web/WebFluxObjectMapperConfigurer.java | 0 .../web/WebMvcObjectMapperConfigurer.java | 0 .../web/plugins/WebfluxDefaultsProvider.java | 0 .../PropertyExampleSerializerMixinSpec.groovy | 41 - .../Swagger2JacksonModuleSpec.groovy | 24 - .../mappers/ApiKeyAuthFactorySpec.groovy | 71 - .../swagger2/mappers/EnumMapperSpec.groovy | 142 - .../mappers/ExamplesMapperSpec.groovy | 74 - .../swagger2/mappers/LicenseMapperSpec.groovy | 42 - .../swagger2/mappers/MapperSupport.groovy | 36 - .../swagger2/mappers/ModelMapperSpec.groovy | 536 --- .../mappers/OAuth2AuthFactorySpec.groovy | 79 - .../mappers/ParameterMapperSpec.groovy | 167 - .../swagger2/mappers/PropertiesSpec.groovy | 119 - .../mappers/SecurityMapperSpec.groovy | 102 - .../SerializableParameterFactoriesSpec.groovy | 136 - .../ServiceModelToSwagger2MapperSpec.groovy | 370 -- .../mappers/VendorExtensionsMapperSpec.groovy | 86 - .../web/Swagger2ControllerSpec.groovy | 174 - .../web/Swagger2ControllerWebFluxSpec.groovy | 91 - .../PropertyExampleSerializerTest.java | 109 - swagger-contract-tests-webflux/README.md | 9 - swagger-contract-tests-webflux/build.gradle | 43 - .../FeatureDemonstrationController.java | 45 - .../swagger/webflux/SecuritySupport.java | 41 - .../webflux/Swagger2WebFluxConfig.java | 72 - .../webflux/SwaggerWebfluxApplication.java | 33 - .../swagger/webflux/bugs/Bug3343.java | 36 - .../webflux/bugs/WebFluxBugController.java | 31 - .../listeners/ObjectMapperEventListener.java | 40 - .../main/resources/simplelogger.properties | 1 - .../swaggertests/webflux/FileAccess.groovy | 54 - .../webflux/ObjectMapperSanityCheck.groovy | 105 - .../WebFluxFunctionContractSpec.groovy | 112 - .../contract/swagger2/bug-demonstration.json | 94 - .../swagger2/feature-demonstration.json | 198 - .../resources/contract/swagger2/swagger.json | 1032 ----- .../contract/swagger2/swaggerTemplated.json | 183 - swagger-contract-tests/README.md | 9 - swagger-contract-tests/build.gradle | 48 - .../contract/swagger/AbstractController.java | 49 - .../contract/swagger/AbstractPetService.java | 40 - .../swagger/Bug1767ListingScanner.java | 176 - .../test/contract/swagger/BugsController.java | 1205 ------ .../contract/swagger/BusinessService.java | 107 - .../contract/swagger/ConcreteController.java | 30 - .../swagger/ConsumesProducesService.java | 66 - .../contract/swagger/CrossOriginFilter.java | 63 - .../swagger/CyclicStructuresController.java | 56 - .../test/contract/swagger/EnumService.java | 70 - .../contract/swagger/FancyPetService.java | 64 - .../swagger/FeatureDemonstrationService.java | 358 -- .../contract/swagger/InheritedService.java | 50 - .../swagger/InheritedServiceImpl.java | 42 - .../contract/swagger/PetGroomingService.java | 50 - .../test/contract/swagger/PetService.java | 211 - .../test/contract/swagger/SameController.java | 45 - .../contract/swagger/SecuritySupport.java | 52 - .../test/contract/swagger/SortDirection.java | 24 - .../contract/swagger/Swagger2TestConfig.java | 459 --- .../contract/swagger/SwaggerApplication.java | 48 - .../contract/swagger/data/rest/Address.java | 96 - .../swagger/data/rest/AddressRepository.java | 26 - .../swagger/data/rest/BasePathConfigurer.java | 37 - .../contract/swagger/data/rest/Category.java | 62 - .../swagger/data/rest/CategoryRepository.java | 26 - .../contract/swagger/data/rest/Person.java | 102 - .../swagger/data/rest/PersonController.java | 48 - .../swagger/data/rest/PersonRepository.java | 41 - .../test/contract/swagger/data/rest/Tag.java | 69 - .../swagger/data/rest/TagRepository.java | 26 - .../contract/swagger/models/AccountType.java | 46 - .../swagger/models/ApplicationLang.java | 28 - .../test/contract/swagger/models/Bug1370.java | 24 - .../test/contract/swagger/models/Bug1749.java | 143 - .../test/contract/swagger/models/Bug2767.java | 31 - .../test/contract/swagger/models/Bug3087.java | 29 - .../test/contract/swagger/models/Bug3353.java | 206 - .../contract/swagger/models/Business.java | 60 - .../test/contract/swagger/models/Car.java | 55 - .../contract/swagger/models/Category.java | 36 - .../test/contract/swagger/models/City.java | 55 - .../test/contract/swagger/models/Country.java | 49 - .../models/CustomAllCapsStringHashSet.java | 47 - .../contract/swagger/models/District.java | 65 - .../swagger/models/EHDTOApplicatorUnits.java | 40 - .../contract/swagger/models/EHDTOUnit.java | 59 - .../swagger/models/EHDTOUnitGroup.java | 52 - .../swagger/models/EnumCollection.java | 34 - .../swagger/models/EnumObjectType.java | 53 - .../contract/swagger/models/EnumType.java | 25 - .../test/contract/swagger/models/Example.java | 154 - .../swagger/models/ExampleListWrapper.java | 16 - .../contract/swagger/models/FancyPet.java | 34 - .../contract/swagger/models/Feature3311.java | 13 - .../test/contract/swagger/models/House.java | 83 - .../contract/swagger/models/Language.java | 28 - .../swagger/models/LanguageResponse.java | 28 - .../contract/swagger/models/LanguageText.java | 38 - .../swagger/models/ModelAttributeExample.java | 78 - .../models/ModelWithArrayOfArrays.java | 31 - .../swagger/models/ModelWithMapProperty.java | 37 - .../swagger/models/ModelWithObjectNode.java | 33 - .../models/ModelWithSameNameClasses.java | 98 - .../contract/swagger/models/NestedType.java | 36 - .../test/contract/swagger/models/Parent.java | 34 - .../test/contract/swagger/models/Pet.java | 50 - .../swagger/models/PetWithSerializer.java | 25 - .../test/contract/swagger/models/Region.java | 45 - .../contract/swagger/models/SameCategory.java | 60 - .../contract/swagger/models/SameFancyPet.java | 33 - .../test/contract/swagger/models/SamePet.java | 73 - .../swagger/models/SortDirection.java | 24 - .../test/contract/swagger/models/Street.java | 75 - .../test/contract/swagger/models/Treeish.java | 45 - .../test/contract/swagger/models/Truck.java | 44 - .../test/contract/swagger/models/Vehicle.java | 61 - .../listeners/ObjectMapperEventListener.java | 40 - .../src/main/resources/application.properties | 4 - .../main/resources/simplelogger.properties | 1 - .../contract/swaggertests/FileAccess.groovy | 54 - .../swaggertests/FunctionContractSpec.groovy | 217 - .../ObjectMapperSanityCheck.groovy | 105 - .../swagger/declaration-business-service.json | 417 -- .../declaration-concrete-controller.json | 308 -- ...oller-with-no-request-mapping-service.json | 133 - .../declaration-fancy-pet-service.json | 237 -- ...aration-feature-demonstration-service.json | 2344 ----------- .../swagger/declaration-groovy-service.json | 118 - .../declaration-inherited-service-impl.json | 131 - .../declaration-pet-grooming-service.json | 318 -- .../swagger/declaration-pet-service.json | 1146 ------ .../swagger/declaration-root-controller.json | 58 - .../contract/swagger/resource-listing.json | 154 - .../declaration-bugs-different-service.json | 2711 ------------- .../swagger2/declaration-bugs-service.json | 2741 ------------- .../declaration-business-service.json | 315 -- .../declaration-concrete-controller.json | 246 -- ...umes-produces-not-on-document-context.json | 175 - ...consumes-produces-on-document-context.json | 169 - ...oller-with-no-request-mapping-service.json | 38 - .../declaration-cyclic-controller.json | 387 -- .../swagger2/declaration-different-group.json | 53 - .../swagger2/declaration-enum-service.json | 128 - .../declaration-fancy-pet-service.json | 119 - ...feature-demonstration-service-codeGen.json | 1486 ------- ...aration-feature-demonstration-service.json | 1486 ------- .../swagger2/declaration-groovy-service.json | 38 - .../declaration-inherited-service-impl.json | 119 - .../declaration-pet-grooming-service.json | 73 - .../swagger2/declaration-pet-service.json | 704 ---- .../swagger2/declaration-root-controller.json | 3477 ----------------- .../swagger2/declaration-same-controller.json | 347 -- .../declaration-spring-data-rest.json | 2019 ---------- .../resources/contract/swagger2/swagger.json | 1032 ----- .../contract/swagger2/swaggerTemplated.json | 183 - 745 files changed, 3147 insertions(+), 75946 deletions(-) mode change 100644 => 100755 gradle/publishing.gradle create mode 100644 oas-contract-tests/gradle/wrapper/gradle-wrapper.jar create mode 100644 oas-contract-tests/gradle/wrapper/gradle-wrapper.properties create mode 100755 oas-contract-tests/gradlew create mode 100644 oas-contract-tests/gradlew.bat create mode 100644 springfox-bean-validators/gradle/wrapper/gradle-wrapper.jar create mode 100644 springfox-bean-validators/gradle/wrapper/gradle-wrapper.properties create mode 100755 springfox-bean-validators/gradlew create mode 100644 springfox-bean-validators/gradlew.bat delete mode 100644 springfox-boot-starter/.gitignore delete mode 100644 springfox-boot-starter/build.gradle delete mode 100644 springfox-boot-starter/src/main/java/springfox/boot/starter/autoconfigure/OpenApiAutoConfiguration.java delete mode 100644 springfox-boot-starter/src/main/java/springfox/boot/starter/autoconfigure/SpringfoxConfigurationProperties.java delete mode 100644 springfox-boot-starter/src/main/java/springfox/boot/starter/autoconfigure/SwaggerUiWebFluxConfiguration.java delete mode 100644 springfox-boot-starter/src/main/java/springfox/boot/starter/autoconfigure/SwaggerUiWebFluxConfigurer.java delete mode 100644 springfox-boot-starter/src/main/java/springfox/boot/starter/autoconfigure/SwaggerUiWebMvcConfiguration.java delete mode 100644 springfox-boot-starter/src/main/java/springfox/boot/starter/autoconfigure/SwaggerUiWebMvcConfigurer.java delete mode 100644 springfox-boot-starter/src/main/resources/META-INF/spring.factories create mode 100644 springfox-core/gradle/wrapper/gradle-wrapper.jar create mode 100644 springfox-core/gradle/wrapper/gradle-wrapper.properties create mode 100755 springfox-core/gradlew create mode 100644 springfox-core/gradlew.bat delete mode 100644 springfox-core/src/test/java/springfox/documentation/schema/XmlTest.java delete mode 100644 springfox-data-rest/build.gradle delete mode 100644 springfox-data-rest/src/main/java/springfox/documentation/spring/data/rest/ActionSpecification.java delete mode 100644 springfox-data-rest/src/main/java/springfox/documentation/spring/data/rest/BasePathAwareServicesProvider.java delete mode 100644 springfox-data-rest/src/main/java/springfox/documentation/spring/data/rest/DefaultExtractorConfiguration.java delete mode 100644 springfox-data-rest/src/main/java/springfox/documentation/spring/data/rest/EntityAssociationContext.java delete mode 100644 springfox-data-rest/src/main/java/springfox/documentation/spring/data/rest/EntityAssociationDeleteExtractor.java delete mode 100644 springfox-data-rest/src/main/java/springfox/documentation/spring/data/rest/EntityAssociationGetExtractor.java delete mode 100644 springfox-data-rest/src/main/java/springfox/documentation/spring/data/rest/EntityAssociationItemDeleteExtractor.java delete mode 100644 springfox-data-rest/src/main/java/springfox/documentation/spring/data/rest/EntityAssociationItemGetExtractor.java delete mode 100644 springfox-data-rest/src/main/java/springfox/documentation/spring/data/rest/EntityAssociationOperationsExtractor.java delete mode 100644 springfox-data-rest/src/main/java/springfox/documentation/spring/data/rest/EntityAssociationSaveExtractor.java delete mode 100644 springfox-data-rest/src/main/java/springfox/documentation/spring/data/rest/EntityAssociationsExtractor.java delete mode 100644 springfox-data-rest/src/main/java/springfox/documentation/spring/data/rest/EntityContext.java delete mode 100644 springfox-data-rest/src/main/java/springfox/documentation/spring/data/rest/EntityDeleteExtractor.java delete mode 100644 springfox-data-rest/src/main/java/springfox/documentation/spring/data/rest/EntityFindAllExtractor.java delete mode 100644 springfox-data-rest/src/main/java/springfox/documentation/spring/data/rest/EntityFindOneExtractor.java delete mode 100644 springfox-data-rest/src/main/java/springfox/documentation/spring/data/rest/EntityOperationsExtractor.java delete mode 100644 springfox-data-rest/src/main/java/springfox/documentation/spring/data/rest/EntitySaveExtractor.java delete mode 100644 springfox-data-rest/src/main/java/springfox/documentation/spring/data/rest/EntitySearchExtractor.java delete mode 100644 springfox-data-rest/src/main/java/springfox/documentation/spring/data/rest/EntityServicesProvider.java delete mode 100644 springfox-data-rest/src/main/java/springfox/documentation/spring/data/rest/OptionalDeferencer.java delete mode 100644 springfox-data-rest/src/main/java/springfox/documentation/spring/data/rest/RequestExtractionUtils.java delete mode 100644 springfox-data-rest/src/main/java/springfox/documentation/spring/data/rest/RequestHandlerExtractorConfiguration.java delete mode 100644 springfox-data-rest/src/main/java/springfox/documentation/spring/data/rest/SpecificationBuilder.java delete mode 100644 springfox-data-rest/src/main/java/springfox/documentation/spring/data/rest/SpringDataRestRequestHandler.java delete mode 100644 springfox-data-rest/src/main/java/springfox/documentation/spring/data/rest/SynthesizedAnnotations.java delete mode 100644 springfox-data-rest/src/main/java/springfox/documentation/spring/data/rest/configuration/SpringDataRestConfiguration.java delete mode 100644 springfox-data-rest/src/main/java/springfox/documentation/spring/data/rest/schema/EmbeddedCollection.java delete mode 100644 springfox-data-rest/src/main/java/springfox/documentation/spring/data/rest/schema/EmbeddedCollectionModelProvider.java delete mode 100644 springfox-data-rest/src/main/java/springfox/documentation/spring/data/rest/schema/ResourcesModelProvider.java delete mode 100644 springfox-data-rest/src/main/java/springfox/documentation/spring/data/rest/schema/SpringDataRestSchemaExtensions.java delete mode 100644 springfox-oas/build.gradle delete mode 100644 springfox-oas/src/main/java/springfox/documentation/oas/annotations/EnableOpenApi.java delete mode 100644 springfox-oas/src/main/java/springfox/documentation/oas/configuration/OpenApiDocumentationConfiguration.java delete mode 100644 springfox-oas/src/main/java/springfox/documentation/oas/configuration/OpenApiJacksonModule.java delete mode 100644 springfox-oas/src/main/java/springfox/documentation/oas/configuration/OpenApiMappingConfiguration.java delete mode 100644 springfox-oas/src/main/java/springfox/documentation/oas/configuration/OpenApiWebFluxConfiguration.java delete mode 100644 springfox-oas/src/main/java/springfox/documentation/oas/configuration/OpenApiWebMvcConfiguration.java delete mode 100644 springfox-oas/src/main/java/springfox/documentation/oas/mappers/CollectionSpecificationToSchemaConverter.java delete mode 100644 springfox-oas/src/main/java/springfox/documentation/oas/mappers/CompoundSpecificationToSchemaConverter.java delete mode 100644 springfox-oas/src/main/java/springfox/documentation/oas/mappers/ExamplesMapper.java delete mode 100644 springfox-oas/src/main/java/springfox/documentation/oas/mappers/LicenseMapper.java delete mode 100644 springfox-oas/src/main/java/springfox/documentation/oas/mappers/MapSchema.java delete mode 100644 springfox-oas/src/main/java/springfox/documentation/oas/mappers/MapSpecificationToSchemaConverter.java delete mode 100644 springfox-oas/src/main/java/springfox/documentation/oas/mappers/ModelSpecificationInheritanceDeterminer.java delete mode 100644 springfox-oas/src/main/java/springfox/documentation/oas/mappers/ReferenceModelSpecificationToSchemaConverter.java delete mode 100644 springfox-oas/src/main/java/springfox/documentation/oas/mappers/ScalarModelToSchemaConverter.java delete mode 100644 springfox-oas/src/main/java/springfox/documentation/oas/mappers/SchemaMapper.java delete mode 100644 springfox-oas/src/main/java/springfox/documentation/oas/mappers/SecurityMapper.java delete mode 100644 springfox-oas/src/main/java/springfox/documentation/oas/mappers/SecuritySchemeMapper.java delete mode 100644 springfox-oas/src/main/java/springfox/documentation/oas/mappers/ServiceModelToOpenApiMapper.java delete mode 100644 springfox-oas/src/main/java/springfox/documentation/oas/mappers/StyleEnumMapper.java delete mode 100644 springfox-oas/src/main/java/springfox/documentation/oas/mappers/VendorExtensionsMapper.java delete mode 100644 springfox-oas/src/main/java/springfox/documentation/oas/web/ForwardedHeaderExtractingRequest.java delete mode 100644 springfox-oas/src/main/java/springfox/documentation/oas/web/ForwardedPrefixExtractor.java delete mode 100644 springfox-oas/src/main/java/springfox/documentation/oas/web/OpenApiControllerWebFlux.java delete mode 100644 springfox-oas/src/main/java/springfox/documentation/oas/web/OpenApiControllerWebMvc.java delete mode 100644 springfox-oas/src/main/java/springfox/documentation/oas/web/OpenApiTransformationContext.java delete mode 100644 springfox-oas/src/main/java/springfox/documentation/oas/web/OpenApiTransformationFilter.java delete mode 100644 springfox-oas/src/main/java/springfox/documentation/oas/web/SpecGeneration.java delete mode 100644 springfox-oas/src/main/java/springfox/documentation/oas/web/WebFluxBasePathAndHostnameTransformationFilter.java delete mode 100644 springfox-oas/src/main/java/springfox/documentation/oas/web/WebFluxOpenApiTransformationFilter.java delete mode 100644 springfox-oas/src/main/java/springfox/documentation/oas/web/WebMvcBasePathAndHostnameTransformationFilter.java delete mode 100644 springfox-oas/src/main/java/springfox/documentation/oas/web/WebMvcOpenApiTransformationFilter.java delete mode 100644 springfox-oas/src/test/groovy/spring/documentation/oas/ComplexTypeSpec.groovy delete mode 100644 springfox-oas/src/test/groovy/spring/documentation/oas/ContainerTypesSpec.groovy delete mode 100644 springfox-oas/src/test/groovy/spring/documentation/oas/ModelRegistrySupport.groovy delete mode 100644 springfox-oas/src/test/groovy/spring/documentation/oas/SimpleTypeSpec.groovy delete mode 100644 springfox-petstore-webflux/build.gradle delete mode 100644 springfox-petstore-webflux/src/main/java/springfox/petstore/webflux/PetStoreConfiguration.java delete mode 100644 springfox-petstore-webflux/src/main/java/springfox/petstore/webflux/RecursiveAlternateTypeRule.java delete mode 100644 springfox-petstore-webflux/src/main/java/springfox/petstore/webflux/Responses.java delete mode 100644 springfox-petstore-webflux/src/main/java/springfox/petstore/webflux/controller/NotFoundException.java delete mode 100644 springfox-petstore-webflux/src/main/java/springfox/petstore/webflux/controller/PetController.java delete mode 100644 springfox-petstore-webflux/src/main/java/springfox/petstore/webflux/controller/PetStoreResource.java delete mode 100644 springfox-petstore-webflux/src/main/java/springfox/petstore/webflux/controller/UserController.java delete mode 100644 springfox-petstore-webflux/src/main/java/springfox/petstore/webflux/model/Category.java delete mode 100644 springfox-petstore-webflux/src/main/java/springfox/petstore/webflux/model/Order.java delete mode 100644 springfox-petstore-webflux/src/main/java/springfox/petstore/webflux/model/Pet.java delete mode 100644 springfox-petstore-webflux/src/main/java/springfox/petstore/webflux/model/Tag.java delete mode 100644 springfox-petstore-webflux/src/main/java/springfox/petstore/webflux/model/User.java delete mode 100644 springfox-petstore-webflux/src/main/java/springfox/petstore/webflux/repository/Identifiable.java delete mode 100644 springfox-petstore-webflux/src/main/java/springfox/petstore/webflux/repository/MapBackedRepository.java delete mode 100644 springfox-petstore-webflux/src/main/java/springfox/petstore/webflux/repository/UserRepository.java delete mode 100644 springfox-petstore-webflux/src/main/resources/.gitkeep delete mode 100644 springfox-petstore-webflux/src/test/groovy/springfox/documentation/.gitkeep delete mode 100644 springfox-petstore-webflux/src/test/java/springfox/documentation/.gitkeep delete mode 100644 springfox-petstore-webflux/src/test/resources/.gitkeep delete mode 100644 springfox-petstore/build.gradle delete mode 100644 springfox-petstore/src/main/java/springfox/petstore/PetStoreConfiguration.java delete mode 100644 springfox-petstore/src/main/java/springfox/petstore/Responses.java delete mode 100644 springfox-petstore/src/main/java/springfox/petstore/controller/NotFoundException.java delete mode 100644 springfox-petstore/src/main/java/springfox/petstore/controller/PetController.java delete mode 100644 springfox-petstore/src/main/java/springfox/petstore/controller/PetStoreResource.java delete mode 100644 springfox-petstore/src/main/java/springfox/petstore/controller/UserController.java delete mode 100644 springfox-petstore/src/main/java/springfox/petstore/model/Category.java delete mode 100644 springfox-petstore/src/main/java/springfox/petstore/model/Order.java delete mode 100644 springfox-petstore/src/main/java/springfox/petstore/model/Pet.java delete mode 100644 springfox-petstore/src/main/java/springfox/petstore/model/Pets.java delete mode 100644 springfox-petstore/src/main/java/springfox/petstore/model/Tag.java delete mode 100644 springfox-petstore/src/main/java/springfox/petstore/model/User.java delete mode 100644 springfox-petstore/src/main/java/springfox/petstore/repository/Identifiable.java delete mode 100644 springfox-petstore/src/main/java/springfox/petstore/repository/MapBackedRepository.java delete mode 100644 springfox-petstore/src/main/java/springfox/petstore/repository/UserRepository.java delete mode 100644 springfox-petstore/src/main/resources/.gitkeep delete mode 100644 springfox-petstore/src/test/groovy/springfox/documentation/.gitkeep delete mode 100644 springfox-petstore/src/test/java/springfox/documentation/.gitkeep delete mode 100644 springfox-petstore/src/test/resources/.gitkeep create mode 100644 springfox-schema/gradle/wrapper/gradle-wrapper.jar create mode 100644 springfox-schema/gradle/wrapper/gradle-wrapper.properties create mode 100755 springfox-schema/gradlew create mode 100644 springfox-schema/gradlew.bat create mode 100644 springfox-spi/gradle/wrapper/gradle-wrapper.jar create mode 100644 springfox-spi/gradle/wrapper/gradle-wrapper.properties create mode 100755 springfox-spi/gradlew create mode 100644 springfox-spi/gradlew.bat delete mode 100644 springfox-spi/src/test/groovy/springfox/documentation/spi/service/contexts/DefaultsSpec.groovy delete mode 100644 springfox-spi/src/test/groovy/springfox/documentation/spi/service/contexts/SecurityContextSpec.groovy delete mode 100644 springfox-spring-config/build.gradle delete mode 100644 springfox-spring-config/src/main/java/springfox/springconfig/AdditionalModel.java delete mode 100644 springfox-spring-config/src/main/java/springfox/springconfig/Swagger2SpringBoot.java delete mode 100644 springfox-spring-config/src/main/java/springfox/springconfig/VersionApi.java delete mode 100644 springfox-spring-config/src/main/java/springfox/springconfig/VersionApiReader.java delete mode 100644 springfox-spring-config/src/main/java/springfox/springconfig/VersionedController.java delete mode 100644 springfox-spring-config/src/test/groovy/springfox/.gitkeep delete mode 100644 springfox-spring-config/src/test/java/springfox/.gitkeep delete mode 100644 springfox-spring-config/src/test/resources/.gitkeep delete mode 100644 springfox-spring-integration-webflux/README.md delete mode 100644 springfox-spring-integration-webflux/build.gradle delete mode 100644 springfox-spring-integration-webflux/src/main/java/springfox/documentation/spring/web/SpringIntegrationWebFluxRequestHandler.java delete mode 100644 springfox-spring-integration-webflux/src/main/java/springfox/documentation/spring/web/package-info.java delete mode 100644 springfox-spring-integration-webflux/src/main/java/springfox/documentation/spring/web/plugins/SpringIntegrationWebFluxRequestHandlerProvider.java delete mode 100644 springfox-spring-integration-webflux/src/main/resources/.gitkeep delete mode 100644 springfox-spring-integration-webflux/src/test/groovy/springfox/documentation/spring/web/SpringIntegrationWebFluxRequestHandlerSpec.groovy delete mode 100644 springfox-spring-integration-webflux/src/test/groovy/springfox/documentation/spring/web/plugins/SpringIntegrationWebFluxRequestHandlerProviderSpec.groovy delete mode 100644 springfox-spring-integration-webmvc/README.md delete mode 100644 springfox-spring-integration-webmvc/build.gradle delete mode 100644 springfox-spring-integration-webmvc/src/main/java/springfox/documentation/spring/web/SpringIntegrationWebMvcRequestHandler.java delete mode 100644 springfox-spring-integration-webmvc/src/main/java/springfox/documentation/spring/web/package-info.java delete mode 100644 springfox-spring-integration-webmvc/src/main/java/springfox/documentation/spring/web/plugins/SpringIntegrationWebMvcRequestHandlerProvider.java delete mode 100644 springfox-spring-integration-webmvc/src/main/resources/.gitkeep delete mode 100644 springfox-spring-integration-webmvc/src/test/groovy/springfox/documentation/spring/web/SpringIntegrationWebMvcRequestHandlerSpec.groovy delete mode 100644 springfox-spring-integration-webmvc/src/test/groovy/springfox/documentation/spring/web/plugins/SpringIntegrationWebMvcRequestHandlerProviderSpec.groovy delete mode 100644 springfox-spring-integration/README.md delete mode 100644 springfox-spring-integration/build.gradle delete mode 100644 springfox-spring-integration/src/main/java/springfox/documentation/spring/web/SpringfoxTemplateFormat.java delete mode 100644 springfox-spring-integration/src/main/java/springfox/documentation/spring/web/package-info.java delete mode 100644 springfox-spring-integration/src/main/java/springfox/documentation/spring/web/plugins/SpringIntegrationDocumentationPluginsBootstrapper.java delete mode 100644 springfox-spring-integration/src/main/java/springfox/documentation/spring/web/plugins/SpringIntegrationParametersProvider.java delete mode 100644 springfox-spring-integration/src/main/java/springfox/documentation/spring/web/plugins/SpringRestDocsOperationBuilderPlugin.java delete mode 100644 springfox-spring-integration/src/main/resources/.gitkeep delete mode 100644 springfox-spring-integration/src/main/resources/org/springframework/restdocs/templates/springfox/default-curl-request.snippet delete mode 100644 springfox-spring-integration/src/main/resources/org/springframework/restdocs/templates/springfox/default-http-request.snippet delete mode 100644 springfox-spring-integration/src/main/resources/org/springframework/restdocs/templates/springfox/default-http-response.snippet delete mode 100644 springfox-spring-integration/src/main/resources/org/springframework/restdocs/templates/springfox/default-httpie-request.snippet delete mode 100644 springfox-spring-integration/src/main/resources/org/springframework/restdocs/templates/springfox/default-links.snippet delete mode 100644 springfox-spring-integration/src/main/resources/org/springframework/restdocs/templates/springfox/default-path-parameters.snippet delete mode 100644 springfox-spring-integration/src/main/resources/org/springframework/restdocs/templates/springfox/default-request-body.snippet delete mode 100644 springfox-spring-integration/src/main/resources/org/springframework/restdocs/templates/springfox/default-request-fields.snippet delete mode 100644 springfox-spring-integration/src/main/resources/org/springframework/restdocs/templates/springfox/default-request-headers.snippet delete mode 100644 springfox-spring-integration/src/main/resources/org/springframework/restdocs/templates/springfox/default-request-parameters.snippet delete mode 100644 springfox-spring-integration/src/main/resources/org/springframework/restdocs/templates/springfox/default-request-part-body.snippet delete mode 100644 springfox-spring-integration/src/main/resources/org/springframework/restdocs/templates/springfox/default-request-part-fields.snippet delete mode 100644 springfox-spring-integration/src/main/resources/org/springframework/restdocs/templates/springfox/default-request-parts.snippet delete mode 100644 springfox-spring-integration/src/main/resources/org/springframework/restdocs/templates/springfox/default-response-body.snippet delete mode 100644 springfox-spring-integration/src/main/resources/org/springframework/restdocs/templates/springfox/default-response-fields.snippet delete mode 100644 springfox-spring-integration/src/main/resources/org/springframework/restdocs/templates/springfox/default-response-headers.snippet delete mode 100644 springfox-spring-integration/src/test/groovy/springfox/documentation/spring/web/plugins/SpringIntegrationParametersProviderSpec.groovy delete mode 100644 springfox-spring-integration/src/test/groovy/springfox/documentation/spring/web/plugins/SpringRestDocsOperationBuilderPluginSpec.groovy delete mode 100644 springfox-spring-integration/src/test/resources/toLowerGatewayAragorn/http-response.springfox delete mode 100644 springfox-spring-integration/src/test/resources/toLowerGatewayGimli/http-response.springfox create mode 100644 springfox-spring-web/gradle/wrapper/gradle-wrapper.jar create mode 100644 springfox-spring-web/gradle/wrapper/gradle-wrapper.properties create mode 100755 springfox-spring-web/gradlew create mode 100644 springfox-spring-web/gradlew.bat delete mode 100644 springfox-spring-web/src/test/groovy/springfox/documentation/spi/service/contexts/OrderingsSpec.groovy delete mode 100644 springfox-spring-web/src/test/groovy/springfox/documentation/spring/web/ControllerNamingUtilsSpec.groovy delete mode 100644 springfox-spring-web/src/test/groovy/springfox/documentation/spring/web/DescriptionResolverSpec.groovy delete mode 100644 springfox-spring-web/src/test/groovy/springfox/documentation/spring/web/DocumentationCacheSpec.groovy delete mode 100644 springfox-spring-web/src/test/groovy/springfox/documentation/spring/web/HandlerMethodReturnTypesSpec.groovy delete mode 100644 springfox-spring-web/src/test/groovy/springfox/documentation/spring/web/SpringfoxWebConfigurationSpec.groovy delete mode 100644 springfox-spring-web/src/test/groovy/springfox/documentation/spring/web/authorization/AuthSerializationSpec.groovy delete mode 100644 springfox-spring-web/src/test/groovy/springfox/documentation/spring/web/authorization/AuthorizationContextSpec.groovy delete mode 100644 springfox-spring-web/src/test/groovy/springfox/documentation/spring/web/json/JsonSerializerTest.groovy delete mode 100644 springfox-spring-web/src/test/groovy/springfox/documentation/spring/web/json/JsonTest.groovy delete mode 100644 springfox-spring-web/src/test/groovy/springfox/documentation/spring/web/mixins/AccessorAssertions.groovy delete mode 100644 springfox-spring-web/src/test/groovy/springfox/documentation/spring/web/mixins/ApiDescriptionSupport.groovy delete mode 100644 springfox-spring-web/src/test/groovy/springfox/documentation/spring/web/mixins/ApiListingSupport.groovy delete mode 100644 springfox-spring-web/src/test/groovy/springfox/documentation/spring/web/mixins/AuthSupport.groovy delete mode 100644 springfox-spring-web/src/test/groovy/springfox/documentation/spring/web/mixins/HandlerMethodsSupport.groovy delete mode 100644 springfox-spring-web/src/test/groovy/springfox/documentation/spring/web/mixins/ModelProviderForServiceSupport.groovy delete mode 100644 springfox-spring-web/src/test/groovy/springfox/documentation/spring/web/mixins/ServicePluginsSupport.groovy delete mode 100644 springfox-spring-web/src/test/groovy/springfox/documentation/spring/web/paths/OperationPathDecoratorSpec.groovy delete mode 100644 springfox-spring-web/src/test/groovy/springfox/documentation/spring/web/paths/PathMappingDecoratorSpec.groovy delete mode 100644 springfox-spring-web/src/test/groovy/springfox/documentation/spring/web/paths/PathSanitizerSpec.groovy delete mode 100644 springfox-spring-web/src/test/groovy/springfox/documentation/spring/web/paths/PathsSpec.groovy delete mode 100644 springfox-spring-web/src/test/groovy/springfox/documentation/spring/web/paths/QueryStringUriTemplateDecoratorSpec.groovy delete mode 100644 springfox-spring-web/src/test/groovy/springfox/documentation/spring/web/plugins/DocumentationContextSpec.groovy delete mode 100644 springfox-spring-web/src/test/groovy/springfox/documentation/spring/web/plugins/DocumentationPluginsBootstrapperSpec.groovy delete mode 100644 springfox-spring-web/src/test/groovy/springfox/documentation/spring/web/plugins/DuplicateGroupsDetectorSpec.groovy delete mode 100644 springfox-spring-web/src/test/groovy/springfox/documentation/spring/web/plugins/JacksonSerializerConventionSpec.groovy delete mode 100644 springfox-spring-web/src/test/groovy/springfox/documentation/spring/web/plugins/OperationModelsBuilderSpec.groovy delete mode 100644 springfox-spring-web/src/test/groovy/springfox/documentation/spring/web/plugins/ResolvedMethodParameterEquivalenceSpec.groovy delete mode 100644 springfox-spring-web/src/test/groovy/springfox/documentation/spring/web/readers/operation/CachingOperationNameGeneratorSpec.groovy delete mode 100644 springfox-spring-web/src/test/groovy/springfox/documentation/spring/web/readers/operation/HandlerMethodResolverSpec.groovy delete mode 100644 springfox-spring-web/src/test/groovy/springfox/documentation/spring/web/readers/parameter/ExpandedParameterBuilderSpec.groovy delete mode 100644 springfox-spring-web/src/test/groovy/springfox/documentation/spring/web/readers/parameter/ModelAttributeParameterExpanderSpec.groovy delete mode 100644 springfox-spring-web/src/test/groovy/springfox/documentation/spring/web/readers/parameter/ParameterTypeDeterminerSpec.groovy delete mode 100644 springfox-spring-web/src/test/groovy/springfox/documentation/spring/web/scanners/ModelNamesRegistrySpec.groovy delete mode 100644 springfox-spring-web/src/test/groovy/springfox/documentation/spring/web/scanners/PathMappingAdjusterSpec.groovy delete mode 100644 springfox-spring-web/src/test/groovy/springfox/documentation/spring/web/scanners/ResourceGroupsSpec.groovy delete mode 100644 springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/Address.java delete mode 100644 springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/AlternateTypeContainer.java delete mode 100644 springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/Bug2219ListingScanner.java delete mode 100644 springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/Category.java delete mode 100644 springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/DummyClass.java delete mode 100644 springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/DummyClassWithRequestMapping.java delete mode 100644 springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/DummyClassWithRequestMappingWithMultipleMappings.java delete mode 100644 springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/DummyClassWithRequestMappingWithoutForwardSlash.java delete mode 100644 springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/DummyController.java delete mode 100644 springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/DummyControllerWithApiDescription.java delete mode 100644 springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/DummyControllerWithResourcePath.java delete mode 100644 springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/DummyControllerWithTags.java delete mode 100644 springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/DummyDeprecatedController.java delete mode 100644 springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/DummyModels.java delete mode 100644 springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/DummyRequestMappingHandlerAdapter.java delete mode 100644 springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/FancyPet.java delete mode 100644 springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/ModelWithSameNameClasses.java delete mode 100644 springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/Person.java delete mode 100644 springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/Pet.java delete mode 100644 springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/ResponseExampleTestController.java delete mode 100644 springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/ResponseHeaderTestController.java delete mode 100644 springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/RestError.java delete mode 100644 springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/SameCategory.java delete mode 100644 springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/SameFancyPet.java delete mode 100644 springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/SamePet.java delete mode 100644 springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/Tag.java delete mode 100644 springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/ToReplaceWithString.java delete mode 100644 springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/controllers/AbstractController.java delete mode 100644 springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/controllers/AbstractPetService.java delete mode 100644 springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/controllers/BugsController.java delete mode 100644 springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/controllers/BusinessService.java delete mode 100644 springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/controllers/CommonRestController.java delete mode 100644 springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/controllers/ConcreteController.java delete mode 100644 springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/controllers/ConsumesProducesService.java delete mode 100644 springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/controllers/ControllerWithNoRequestMappingService.java delete mode 100644 springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/controllers/CyclicStructuresController.java delete mode 100644 springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/controllers/EnumService.java delete mode 100644 springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/controllers/ExcludedService.java delete mode 100644 springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/controllers/FancyPetService.java delete mode 100644 springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/controllers/FeatureDemonstrationService.java delete mode 100644 springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/controllers/GenericPetController.java delete mode 100644 springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/controllers/GenericRestController.java delete mode 100644 springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/controllers/IRepository.java delete mode 100644 springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/controllers/InheritedService.java delete mode 100644 springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/controllers/InheritedServiceImpl.java delete mode 100644 springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/controllers/PetGroomingService.java delete mode 100644 springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/controllers/PetRepository.java delete mode 100644 springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/controllers/PetService.java delete mode 100644 springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/controllers/RootController.java delete mode 100644 springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/controllers/SameController.java delete mode 100644 springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/controllers/SortDirection.java delete mode 100644 springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/AccountType.java delete mode 100644 springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/ApplicationLang.java delete mode 100644 springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/Bar.java delete mode 100644 springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/Bug1749.java delete mode 100644 springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/Business.java delete mode 100644 springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/Car.java delete mode 100644 springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/Category.java delete mode 100644 springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/City.java delete mode 100644 springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/Country.java delete mode 100644 springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/CustomAllCapsStringHashSet.java delete mode 100644 springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/District.java delete mode 100644 springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/EHDTOApplicatorUnits.java delete mode 100644 springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/EHDTOUnit.java delete mode 100644 springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/EHDTOUnitGroup.java delete mode 100644 springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/EnumCollection.java delete mode 100644 springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/EnumObjectType.java delete mode 100644 springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/EnumType.java delete mode 100644 springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/Example.java delete mode 100644 springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/FancyPet.java delete mode 100644 springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/Foo.java delete mode 100644 springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/FoobarDto.java delete mode 100644 springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/Holder.java delete mode 100644 springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/House.java delete mode 100644 springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/Language.java delete mode 100644 springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/LanguageResponse.java delete mode 100644 springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/LanguageText.java delete mode 100644 springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/MapFancyPet.java delete mode 100644 springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/ModelAttributeComplexTypeExample.java delete mode 100644 springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/ModelAttributeExample.java delete mode 100644 springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/ModelAttributeWithHiddenParametersExample.java delete mode 100644 springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/ModelWithArrayOfArrays.java delete mode 100644 springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/ModelWithMapProperty.java delete mode 100644 springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/ModelWithObjectNode.java delete mode 100644 springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/ModelWithSameNameClasses.java delete mode 100644 springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/Monkey.java delete mode 100644 springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/NestedType.java delete mode 100644 springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/OtherType.java delete mode 100644 springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/Parent.java delete mode 100644 springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/Pet.java delete mode 100644 springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/PetWithJsonView.java delete mode 100644 springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/PetWithSerializer.java delete mode 100644 springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/Pirate.java delete mode 100644 springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/RecursiveTypeWithConditions.java delete mode 100644 springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/RecursiveTypeWithNonEqualsConditionsInner.java delete mode 100644 springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/RecursiveTypeWithNonEqualsConditionsInnerWithCircle.java delete mode 100644 springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/RecursiveTypeWithNonEqualsConditionsInnerWithModel.java delete mode 100644 springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/RecursiveTypeWithNonEqualsConditionsMiddle.java delete mode 100644 springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/RecursiveTypeWithNonEqualsConditionsMiddleWithCircle.java delete mode 100644 springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/RecursiveTypeWithNonEqualsConditionsMiddleWithModel.java delete mode 100644 springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/RecursiveTypeWithNonEqualsConditionsOuter.java delete mode 100644 springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/RecursiveTypeWithNonEqualsConditionsOuterWithCircle.java delete mode 100644 springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/RecursiveTypeWithNonEqualsConditionsOuterWithModel.java delete mode 100644 springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/RecursiveTypeWithNonEqualsConditionsOuterWithSubTypes.java delete mode 100644 springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/Region.java delete mode 100644 springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/Response.java delete mode 100644 springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/SameCategory.java delete mode 100644 springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/SameFancyPet.java delete mode 100644 springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/SamePet.java delete mode 100644 springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/SomeType.java delete mode 100644 springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/Street.java delete mode 100644 springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/Treeish.java delete mode 100644 springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/Truck.java delete mode 100644 springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/Vehicle.java delete mode 100644 springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/Wrapper.java delete mode 100755 springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/same/Pet.java delete mode 100644 springfox-spring-webflux/build.gradle delete mode 100644 springfox-spring-webflux/src/main/java/springfox/documentation/spring/web/WebFluxNameValueExpressionWrapper.java delete mode 100644 springfox-spring-webflux/src/main/java/springfox/documentation/spring/web/WebFluxPatternsRequestConditionWrapper.java delete mode 100644 springfox-spring-webflux/src/main/java/springfox/documentation/spring/web/WebFluxRequestHandler.java delete mode 100644 springfox-spring-webflux/src/main/java/springfox/documentation/spring/web/plugins/WebFluxRequestHandlerProvider.java delete mode 100644 springfox-spring-webflux/src/main/resources/.gitkeep delete mode 100644 springfox-spring-webflux/src/test/groovy/springfox/documentation/spring/web/dummy/controllers/GroovyService.groovy delete mode 100644 springfox-spring-webflux/src/test/groovy/springfox/documentation/spring/web/dummy/models/GroovyModel.groovy delete mode 100644 springfox-spring-webmvc/build.gradle delete mode 100644 springfox-spring-webmvc/src/main/java/springfox/documentation/spring/web/OnNotServletBasedWebApplication.java delete mode 100644 springfox-spring-webmvc/src/main/java/springfox/documentation/spring/web/WebMvcNameValueExpressionWrapper.java delete mode 100644 springfox-spring-webmvc/src/main/java/springfox/documentation/spring/web/WebMvcPatternsRequestConditionWrapper.java delete mode 100644 springfox-spring-webmvc/src/main/java/springfox/documentation/spring/web/WebMvcRequestHandler.java delete mode 100644 springfox-spring-webmvc/src/main/java/springfox/documentation/spring/web/WebMvcRequestMappingInfoWrapper.java delete mode 100644 springfox-spring-webmvc/src/main/java/springfox/documentation/spring/web/plugins/WebMvcRequestHandlerProvider.java delete mode 100644 springfox-spring-webmvc/src/main/resources/.gitkeep delete mode 100644 springfox-spring-webmvc/src/test/groovy/springfox/documentation/schema/ReturnTypesSpec.groovy delete mode 100644 springfox-spring-webmvc/src/test/groovy/springfox/documentation/spring/web/OperationCachingEquivalenceSpec.groovy delete mode 100644 springfox-spring-webmvc/src/test/groovy/springfox/documentation/spring/web/dummy/controllers/GroovyService.groovy delete mode 100644 springfox-spring-webmvc/src/test/groovy/springfox/documentation/spring/web/dummy/models/GroovyModel.groovy delete mode 100644 springfox-spring-webmvc/src/test/groovy/springfox/documentation/spring/web/mixins/JsonSupport.groovy delete mode 100644 springfox-spring-webmvc/src/test/groovy/springfox/documentation/spring/web/mixins/RequestMappingSupport.groovy delete mode 100644 springfox-spring-webmvc/src/test/groovy/springfox/documentation/spring/web/paths/DefaultPathProviderSpec.groovy delete mode 100644 springfox-spring-webmvc/src/test/groovy/springfox/documentation/spring/web/paths/RelativeSwaggerPathProviderSpec.groovy delete mode 100644 springfox-spring-webmvc/src/test/groovy/springfox/documentation/spring/web/plugins/DefaultRequestHandlerCombinerSpec.groovy delete mode 100644 springfox-spring-webmvc/src/test/groovy/springfox/documentation/spring/web/plugins/DocketSpec.groovy delete mode 100644 springfox-spring-webmvc/src/test/groovy/springfox/documentation/spring/web/plugins/DocumentationPluginsManagerSpec.groovy delete mode 100644 springfox-spring-webmvc/src/test/groovy/springfox/documentation/spring/web/plugins/PathAndParametersEquivalenceSpec.groovy delete mode 100644 springfox-spring-webmvc/src/test/groovy/springfox/documentation/spring/web/plugins/WebMvcRequestHandlerProviderSpec.groovy delete mode 100755 springfox-spring-webmvc/src/test/groovy/springfox/documentation/spring/web/readers/ApiModelReaderSpec.groovy delete mode 100644 springfox-spring-webmvc/src/test/groovy/springfox/documentation/spring/web/readers/ApiOperationReaderSpec.groovy delete mode 100644 springfox-spring-webmvc/src/test/groovy/springfox/documentation/spring/web/readers/MixedMultipartRequestParameterBuilderSpec.groovy delete mode 100644 springfox-spring-webmvc/src/test/groovy/springfox/documentation/spring/web/readers/RepresentationReaderSpec.groovy delete mode 100644 springfox-spring-webmvc/src/test/groovy/springfox/documentation/spring/web/readers/operation/DefaultResponseMessageReaderSpec.groovy delete mode 100644 springfox-spring-webmvc/src/test/groovy/springfox/documentation/spring/web/readers/operation/OperationCommandReaderSpec.groovy delete mode 100644 springfox-spring-webmvc/src/test/groovy/springfox/documentation/spring/web/readers/operation/OperationMethodReaderSpec.groovy delete mode 100644 springfox-spring-webmvc/src/test/groovy/springfox/documentation/spring/web/readers/operation/OperationParameterHeadersConditionReaderSpec.groovy delete mode 100644 springfox-spring-webmvc/src/test/groovy/springfox/documentation/spring/web/readers/operation/OperationParameterRequestConditionReaderSpec.groovy delete mode 100644 springfox-spring-webmvc/src/test/groovy/springfox/documentation/spring/web/readers/operation/OperationPositionReaderSpec.groovy delete mode 100644 springfox-spring-webmvc/src/test/groovy/springfox/documentation/spring/web/readers/operation/OperationResponseClassReaderSpec.groovy delete mode 100644 springfox-spring-webmvc/src/test/groovy/springfox/documentation/spring/web/readers/operation/OperationTagsReaderSpec.groovy delete mode 100644 springfox-spring-webmvc/src/test/groovy/springfox/documentation/spring/web/readers/parameter/OperationParameterReaderSpec.groovy delete mode 100644 springfox-spring-webmvc/src/test/groovy/springfox/documentation/spring/web/readers/parameter/ParameterAnnotationSupport.groovy delete mode 100644 springfox-spring-webmvc/src/test/groovy/springfox/documentation/spring/web/readers/parameter/ParameterDataTypeReaderSpec.groovy delete mode 100644 springfox-spring-webmvc/src/test/groovy/springfox/documentation/spring/web/readers/parameter/ParameterMultiplesReaderSpec.groovy delete mode 100644 springfox-spring-webmvc/src/test/groovy/springfox/documentation/spring/web/readers/parameter/ParameterReaderSpec.groovy delete mode 100644 springfox-spring-webmvc/src/test/groovy/springfox/documentation/spring/web/readers/parameter/ParameterRequiredReaderSpec.groovy delete mode 100644 springfox-spring-webmvc/src/test/groovy/springfox/documentation/spring/web/readers/parameter/ParameterTypeReaderSpec.groovy delete mode 100644 springfox-spring-webmvc/src/test/groovy/springfox/documentation/spring/web/scanners/ApiDescriptionLookupSpec.groovy delete mode 100644 springfox-spring-webmvc/src/test/groovy/springfox/documentation/spring/web/scanners/ApiDescriptionReaderSpec.groovy delete mode 100644 springfox-spring-webmvc/src/test/groovy/springfox/documentation/spring/web/scanners/ApiListingReferenceScannerSpec.groovy delete mode 100644 springfox-spring-webmvc/src/test/groovy/springfox/documentation/spring/web/scanners/ApiListingScannerSpec.groovy delete mode 100644 springfox-spring-webmvc/src/test/groovy/springfox/documentation/spring/web/scanners/CachingOperationReaderSpec.groovy delete mode 100644 springfox-spring-webmvc/src/test/groovy/springfox/documentation/spring/web/scanners/ResourcePathProviderSpec.groovy delete mode 100644 springfox-spring-webmvc/src/test/groovy/springfox/documentation/spring/web/scanners/SwaggerApiDocumentationScannerSpec.groovy delete mode 100644 springfox-spring-webmvc/src/test/java/springfox/documentation/spring/web/WebMvcObjectMapperConfigurerIntegrationTest.java create mode 100644 springfox-swagger-common/gradle/wrapper/gradle-wrapper.jar create mode 100644 springfox-swagger-common/gradle/wrapper/gradle-wrapper.properties create mode 100755 springfox-swagger-common/gradlew create mode 100644 springfox-swagger-common/gradlew.bat delete mode 100644 springfox-swagger-common/src/test/groovy/springfox/documentation/swagger/annotations/AnnotationsSpec.groovy delete mode 100644 springfox-swagger-common/src/test/groovy/springfox/documentation/swagger/common/HostNameProviderSpec.groovy delete mode 100644 springfox-swagger-common/src/test/groovy/springfox/documentation/swagger/common/XForwardPrefixPathAdjusterSpec.groovy delete mode 100644 springfox-swagger-common/src/test/groovy/springfox/documentation/swagger/mixins/SwaggerPluginsSupport.groovy delete mode 100644 springfox-swagger-common/src/test/groovy/springfox/documentation/swagger/readers/operation/OpenApiOperationTagsReaderSpec.groovy delete mode 100644 springfox-swagger-common/src/test/groovy/springfox/documentation/swagger/readers/operation/OperationAuthReaderSpec.groovy delete mode 100644 springfox-swagger-common/src/test/groovy/springfox/documentation/swagger/readers/operation/OperationCommandReaderSpec.groovy delete mode 100644 springfox-swagger-common/src/test/groovy/springfox/documentation/swagger/readers/operation/OperationHttpMethodReaderSpec.groovy delete mode 100644 springfox-swagger-common/src/test/groovy/springfox/documentation/swagger/readers/operation/OperationImplicitParameterReaderSpec.groovy delete mode 100644 springfox-swagger-common/src/test/groovy/springfox/documentation/swagger/readers/operation/OperationImplicitParamsReaderSpec.groovy delete mode 100644 springfox-swagger-common/src/test/groovy/springfox/documentation/swagger/readers/operation/OperationNicknameIntoUniqueIdReaderSpec.groovy delete mode 100644 springfox-swagger-common/src/test/groovy/springfox/documentation/swagger/readers/operation/OperationPositionReaderSpec.groovy delete mode 100644 springfox-swagger-common/src/test/groovy/springfox/documentation/swagger/readers/operation/SwaggerOperationModelsProviderSpec.groovy delete mode 100644 springfox-swagger-common/src/test/groovy/springfox/documentation/swagger/readers/operation/SwaggerOperationResponseClassReaderSpec.groovy delete mode 100644 springfox-swagger-common/src/test/groovy/springfox/documentation/swagger/readers/operation/SwaggerOperationTagsReaderSpec.groovy delete mode 100644 springfox-swagger-common/src/test/groovy/springfox/documentation/swagger/readers/operation/SwaggerRepresentationReaderSpec.groovy delete mode 100644 springfox-swagger-common/src/test/groovy/springfox/documentation/swagger/readers/operation/SwaggerResponseMessageReaderSpec.groovy delete mode 100644 springfox-swagger-common/src/test/groovy/springfox/documentation/swagger/readers/operation/VendorExtensionsReaderSpec.groovy delete mode 100644 springfox-swagger-common/src/test/groovy/springfox/documentation/swagger/readers/parameter/ApiImplicitParamAnnotationSupport.groovy delete mode 100644 springfox-swagger-common/src/test/groovy/springfox/documentation/swagger/readers/parameter/ApiParamAnnotationSupport.groovy delete mode 100644 springfox-swagger-common/src/test/groovy/springfox/documentation/swagger/readers/parameter/ApiParamParameterBuilderSpec.groovy delete mode 100644 springfox-swagger-common/src/test/groovy/springfox/documentation/swagger/readers/parameter/ExamplesSpec.groovy delete mode 100644 springfox-swagger-common/src/test/groovy/springfox/documentation/swagger/readers/parameter/ModelAttributeParameterExpanderSpec.groovy delete mode 100644 springfox-swagger-common/src/test/groovy/springfox/documentation/swagger/readers/parameter/ParameterAnnotationReaderSpec.groovy delete mode 100644 springfox-swagger-common/src/test/groovy/springfox/documentation/swagger/readers/parameter/ParameterMultiplesReaderSpec.groovy delete mode 100644 springfox-swagger-common/src/test/groovy/springfox/documentation/swagger/readers/parameter/ParameterNameReaderSpec.groovy delete mode 100644 springfox-swagger-common/src/test/groovy/springfox/documentation/swagger/readers/parameter/ParameterReaderSpec.groovy delete mode 100644 springfox-swagger-common/src/test/groovy/springfox/documentation/swagger/readers/parameter/ParameterRequiredReaderSpec.groovy delete mode 100644 springfox-swagger-common/src/test/groovy/springfox/documentation/swagger/readers/parameter/SwaggerExpandedParameterBuilderSpec.groovy delete mode 100644 springfox-swagger-common/src/test/groovy/springfox/documentation/swagger/schema/ApiModelBuilderSpec.groovy delete mode 100644 springfox-swagger-common/src/test/groovy/springfox/documentation/swagger/schema/ApiModelPropertyPropertyBuilderSpec.groovy delete mode 100644 springfox-swagger-common/src/test/groovy/springfox/documentation/swagger/schema/ApiModelTypeNameProviderSpec.groovy delete mode 100644 springfox-swagger-common/src/test/groovy/springfox/documentation/swagger/web/ApiResourceControllerSpec.groovy delete mode 100644 springfox-swagger-common/src/test/groovy/springfox/documentation/swagger/web/InMemorySwaggerResourcesProviderSpec.groovy delete mode 100644 springfox-swagger-common/src/test/groovy/springfox/documentation/swagger/web/SecurityConfigurationBuilderSpec.groovy delete mode 100644 springfox-swagger-common/src/test/groovy/springfox/documentation/swagger/web/SecurityConfigurationSpec.groovy delete mode 100644 springfox-swagger-common/src/test/groovy/springfox/documentation/swagger/web/SwaggerApiListingReaderSpec.groovy delete mode 100644 springfox-swagger-common/src/test/groovy/springfox/documentation/swagger/web/UiConfigurationBuilderSpec.groovy delete mode 100644 springfox-swagger-common/src/test/groovy/springfox/documentation/swagger/web/UiConfigurationSpec.groovy delete mode 100644 springfox-swagger-common/src/test/java/springfox/documentation/.gitkeep delete mode 100644 springfox-swagger-common/src/test/java/springfox/documentation/schema/TypeWithAnnotatedGettersAndSetters.java delete mode 100644 springfox-swagger-common/src/test/java/springfox/documentation/schema/TypeWithAnnotatedGettersAndSettersInterface.java delete mode 100644 springfox-swagger-common/src/test/java/springfox/documentation/schema/TypeWithApiModelAnnotation.java delete mode 100644 springfox-swagger-common/src/test/java/springfox/documentation/schema/TypeWithEmptyApiModelAnnotation.java delete mode 100644 springfox-swagger-common/src/test/java/springfox/documentation/schema/TypeWithGettersAndSetters.java delete mode 100644 springfox-swagger-common/src/test/resources/.gitkeep create mode 100644 springfox-swagger-ui/gradle/wrapper/gradle-wrapper.jar create mode 100644 springfox-swagger-ui/gradle/wrapper/gradle-wrapper.properties create mode 100755 springfox-swagger-ui/gradlew create mode 100644 springfox-swagger-ui/gradlew.bat delete mode 100644 springfox-swagger1/build.gradle delete mode 100644 springfox-swagger1/src/integration-test/groovy/CustomJavaPluginStartupSpec.groovy delete mode 100644 springfox-swagger1/src/integration-test/groovy/CustomXmlPluginStartupSpec.groovy delete mode 100644 springfox-swagger1/src/integration-test/groovy/DefaultJavaPluginStartupSpec.groovy delete mode 100644 springfox-swagger1/src/integration-test/groovy/DefaultXmlPluginStartupSpec.groovy delete mode 100644 springfox-swagger1/src/integration-test/groovy/MultiplePropertyPlaceholderSpec.groovy delete mode 100644 springfox-swagger1/src/integration-test/groovy/MultipleRequestMappingHandlerAdaptersSpec.groovy delete mode 100644 springfox-swagger1/src/main/java/springfox/documentation/swagger1/annotations/EnableSwagger.java delete mode 100644 springfox-swagger1/src/main/java/springfox/documentation/swagger1/configuration/Swagger1DocumentationConfiguration.java delete mode 100644 springfox-swagger1/src/main/java/springfox/documentation/swagger1/configuration/SwaggerJacksonModule.java delete mode 100644 springfox-swagger1/src/main/java/springfox/documentation/swagger1/dto/AllowableListValues.java delete mode 100644 springfox-swagger1/src/main/java/springfox/documentation/swagger1/dto/AllowableRangeValues.java delete mode 100644 springfox-swagger1/src/main/java/springfox/documentation/swagger1/dto/AllowableValues.java delete mode 100644 springfox-swagger1/src/main/java/springfox/documentation/swagger1/dto/ApiDescription.java delete mode 100644 springfox-swagger1/src/main/java/springfox/documentation/swagger1/dto/ApiInfo.java delete mode 100644 springfox-swagger1/src/main/java/springfox/documentation/swagger1/dto/ApiKey.java delete mode 100644 springfox-swagger1/src/main/java/springfox/documentation/swagger1/dto/ApiListing.java delete mode 100644 springfox-swagger1/src/main/java/springfox/documentation/swagger1/dto/ApiListingReference.java delete mode 100644 springfox-swagger1/src/main/java/springfox/documentation/swagger1/dto/Authorization.java delete mode 100644 springfox-swagger1/src/main/java/springfox/documentation/swagger1/dto/AuthorizationCodeGrant.java delete mode 100644 springfox-swagger1/src/main/java/springfox/documentation/swagger1/dto/AuthorizationScope.java delete mode 100644 springfox-swagger1/src/main/java/springfox/documentation/swagger1/dto/AuthorizationType.java delete mode 100644 springfox-swagger1/src/main/java/springfox/documentation/swagger1/dto/BasicAuth.java delete mode 100644 springfox-swagger1/src/main/java/springfox/documentation/swagger1/dto/ContainerDataType.java delete mode 100644 springfox-swagger1/src/main/java/springfox/documentation/swagger1/dto/DataType.java delete mode 100644 springfox-swagger1/src/main/java/springfox/documentation/swagger1/dto/GrantType.java delete mode 100644 springfox-swagger1/src/main/java/springfox/documentation/swagger1/dto/ImplicitGrant.java delete mode 100644 springfox-swagger1/src/main/java/springfox/documentation/swagger1/dto/LoginEndpoint.java delete mode 100644 springfox-swagger1/src/main/java/springfox/documentation/swagger1/dto/ModelDto.java delete mode 100644 springfox-swagger1/src/main/java/springfox/documentation/swagger1/dto/ModelPropertyDto.java delete mode 100644 springfox-swagger1/src/main/java/springfox/documentation/swagger1/dto/OAuth.java delete mode 100644 springfox-swagger1/src/main/java/springfox/documentation/swagger1/dto/Operation.java delete mode 100644 springfox-swagger1/src/main/java/springfox/documentation/swagger1/dto/Parameter.java delete mode 100644 springfox-swagger1/src/main/java/springfox/documentation/swagger1/dto/PrimitiveDataType.java delete mode 100644 springfox-swagger1/src/main/java/springfox/documentation/swagger1/dto/PrimitiveFormatDataType.java delete mode 100644 springfox-swagger1/src/main/java/springfox/documentation/swagger1/dto/ReferenceDataType.java delete mode 100644 springfox-swagger1/src/main/java/springfox/documentation/swagger1/dto/ResourceListing.java delete mode 100644 springfox-swagger1/src/main/java/springfox/documentation/swagger1/dto/ResponseMessage.java delete mode 100644 springfox-swagger1/src/main/java/springfox/documentation/swagger1/dto/SwaggerDataType.java delete mode 100644 springfox-swagger1/src/main/java/springfox/documentation/swagger1/dto/TokenEndpoint.java delete mode 100644 springfox-swagger1/src/main/java/springfox/documentation/swagger1/dto/TokenRequestEndpoint.java delete mode 100644 springfox-swagger1/src/main/java/springfox/documentation/swagger1/mappers/AllowableValuesMapper.java delete mode 100644 springfox-swagger1/src/main/java/springfox/documentation/swagger1/mappers/AuthorizationTypesMapper.java delete mode 100644 springfox-swagger1/src/main/java/springfox/documentation/swagger1/mappers/DataTypeMapper.java delete mode 100644 springfox-swagger1/src/main/java/springfox/documentation/swagger1/mappers/Mappers.java delete mode 100644 springfox-swagger1/src/main/java/springfox/documentation/swagger1/mappers/ServiceModelToSwaggerMapper.java delete mode 100644 springfox-swagger1/src/main/java/springfox/documentation/swagger1/readers/parameter/ParameterNameReader.java delete mode 100644 springfox-swagger1/src/main/java/springfox/documentation/swagger1/web/ApiListingMerger.java delete mode 100644 springfox-swagger1/src/main/java/springfox/documentation/swagger1/web/Swagger1Controller.java delete mode 100644 springfox-swagger1/src/main/java/springfox/documentation/swagger1/web/SwaggerDefaultConfiguration.java delete mode 100644 springfox-swagger1/src/test/groovy/springfox/documentation/schema/property/field/FieldModelPropertySpec.groovy delete mode 100755 springfox-swagger1/src/test/groovy/springfox/documentation/schema/property/property/BeanModelPropertySpec.groovy delete mode 100644 springfox-swagger1/src/test/groovy/springfox/documentation/spring/web/scanners/ApiDocumentationScannerSpec.groovy delete mode 100644 springfox-swagger1/src/test/groovy/springfox/documentation/spring/web/scanners/SwaggerApiListingReferenceScannerSpec.groovy delete mode 100755 springfox-swagger1/src/test/groovy/springfox/documentation/spring/web/scanners/SwaggerApiModelReaderSpec.groovy delete mode 100644 springfox-swagger1/src/test/groovy/springfox/documentation/swagger1/dto/AllowableListValuesSpec.groovy delete mode 100644 springfox-swagger1/src/test/groovy/springfox/documentation/swagger1/dto/AllowableRangeValuesSpec.groovy delete mode 100644 springfox-swagger1/src/test/groovy/springfox/documentation/swagger1/dto/ApiDescriptionSpec.groovy delete mode 100644 springfox-swagger1/src/test/groovy/springfox/documentation/swagger1/dto/ApiInfoSpec.groovy delete mode 100644 springfox-swagger1/src/test/groovy/springfox/documentation/swagger1/dto/ApiKeySpec.groovy delete mode 100644 springfox-swagger1/src/test/groovy/springfox/documentation/swagger1/dto/ApiListingReferenceSpec.groovy delete mode 100644 springfox-swagger1/src/test/groovy/springfox/documentation/swagger1/dto/ApiListingSpec.groovy delete mode 100644 springfox-swagger1/src/test/groovy/springfox/documentation/swagger1/dto/AuthorizationScopeSpec.groovy delete mode 100644 springfox-swagger1/src/test/groovy/springfox/documentation/swagger1/dto/AuthorizationSpec.groovy delete mode 100644 springfox-swagger1/src/test/groovy/springfox/documentation/swagger1/dto/BasicAuthSpec.groovy delete mode 100644 springfox-swagger1/src/test/groovy/springfox/documentation/swagger1/dto/ContainerDataTypeSpec.groovy delete mode 100644 springfox-swagger1/src/test/groovy/springfox/documentation/swagger1/dto/DataTypeSpec.groovy delete mode 100644 springfox-swagger1/src/test/groovy/springfox/documentation/swagger1/dto/InternalJsonSerializationSpec.groovy delete mode 100644 springfox-swagger1/src/test/groovy/springfox/documentation/swagger1/dto/ModelPropertySpec.groovy delete mode 100644 springfox-swagger1/src/test/groovy/springfox/documentation/swagger1/dto/ModelSpec.groovy delete mode 100644 springfox-swagger1/src/test/groovy/springfox/documentation/swagger1/dto/OperationSpec.groovy delete mode 100644 springfox-swagger1/src/test/groovy/springfox/documentation/swagger1/dto/ParameterSpec.groovy delete mode 100644 springfox-swagger1/src/test/groovy/springfox/documentation/swagger1/dto/PrimitiveDataTypeSpec.groovy delete mode 100644 springfox-swagger1/src/test/groovy/springfox/documentation/swagger1/dto/PrimitiveFormatDataTypeSpec.groovy delete mode 100644 springfox-swagger1/src/test/groovy/springfox/documentation/swagger1/dto/ReferenceDataTypeSpec.groovy delete mode 100644 springfox-swagger1/src/test/groovy/springfox/documentation/swagger1/dto/ResourceListingSpec.groovy delete mode 100644 springfox-swagger1/src/test/groovy/springfox/documentation/swagger1/dto/ResponseMessageSpec.groovy delete mode 100644 springfox-swagger1/src/test/groovy/springfox/documentation/swagger1/dto/TokenEndpointSpec.groovy delete mode 100644 springfox-swagger1/src/test/groovy/springfox/documentation/swagger1/dto/TokenRequestEndpointSpec.groovy delete mode 100644 springfox-swagger1/src/test/groovy/springfox/documentation/swagger1/integration/DocketSpec.groovy delete mode 100644 springfox-swagger1/src/test/groovy/springfox/documentation/swagger1/jackson/AuthorizationTypesSerializerSpec.groovy delete mode 100644 springfox-swagger1/src/test/groovy/springfox/documentation/swagger1/jackson/SwaggerJacksonModuleSpec.groovy delete mode 100644 springfox-swagger1/src/test/groovy/springfox/documentation/swagger1/mappers/AllMappersSpec.groovy delete mode 100644 springfox-swagger1/src/test/groovy/springfox/documentation/swagger1/mappers/AllowableValuesMapperSpec.groovy delete mode 100644 springfox-swagger1/src/test/groovy/springfox/documentation/swagger1/mappers/AuthorizationTypesMapperSpec.groovy delete mode 100644 springfox-swagger1/src/test/groovy/springfox/documentation/swagger1/mappers/DataTypeMapperSpec.groovy delete mode 100644 springfox-swagger1/src/test/groovy/springfox/documentation/swagger1/mappers/ServiceModelToSwaggerMapperSpec.groovy delete mode 100644 springfox-swagger1/src/test/groovy/springfox/documentation/swagger1/mixins/MapperSupport.groovy delete mode 100644 springfox-swagger1/src/test/groovy/springfox/documentation/swagger1/readers/parameter/OperationParameterReaderSpec.groovy delete mode 100644 springfox-swagger1/src/test/groovy/springfox/documentation/swagger1/readers/parameter/ParameterNameReaderSpec.groovy delete mode 100644 springfox-swagger1/src/test/groovy/springfox/documentation/swagger1/web/ApiListingMergerSpec.groovy delete mode 100644 springfox-swagger1/src/test/groovy/springfox/documentation/swagger1/web/Swagger1ControllerSpec.groovy delete mode 100644 springfox-swagger1/src/test/groovy/springfox/documentation/swagger1/web/SwaggerApiDescriptionReaderSpec.groovy delete mode 100644 springfox-swagger1/src/test/java/springfox/documentation/swagger1/configuration/CustomJavaPluginConfig.java delete mode 100644 springfox-swagger1/src/test/java/springfox/documentation/swagger1/configuration/CustomXmlJavaConfig.java delete mode 100644 springfox-swagger1/src/test/java/springfox/documentation/swagger1/configuration/DefaultJavaPluginConfig.java delete mode 100644 springfox-swagger1/src/test/java/springfox/documentation/swagger1/configuration/MultipleRMHAConfig.java delete mode 100644 springfox-swagger1/src/test/java/springfox/documentation/swagger1/configuration/SimpleBean.java delete mode 100644 springfox-swagger1/src/test/java/springfox/documentation/swagger1/models/ServiceWithAnnotationOnInterface.java delete mode 100644 springfox-swagger1/src/test/resources/avalue.properties delete mode 100644 springfox-swagger1/src/test/resources/custom-plugin-context.xml delete mode 100644 springfox-swagger1/src/test/resources/default-plugin-context.xml delete mode 100644 springfox-swagger1/src/test/resources/handler-adapter-context.xml delete mode 100644 springfox-swagger1/src/test/resources/placeholders-adapter-context.xml create mode 100644 springfox-swagger2/gradle/wrapper/gradle-wrapper.jar create mode 100644 springfox-swagger2/gradle/wrapper/gradle-wrapper.properties create mode 100755 springfox-swagger2/gradlew create mode 100644 springfox-swagger2/gradlew.bat rename {springfox-spring-webflux => springfox-swagger2}/src/main/java/springfox/documentation/spring/web/OnReactiveWebApplication.java (100%) rename {springfox-spring-webmvc => springfox-swagger2}/src/main/java/springfox/documentation/spring/web/OnServletBasedWebApplication.java (100%) rename {springfox-spring-webflux => springfox-swagger2}/src/main/java/springfox/documentation/spring/web/SpringfoxWebFluxConfiguration.java (99%) rename {springfox-spring-webmvc => springfox-swagger2}/src/main/java/springfox/documentation/spring/web/SpringfoxWebMvcConfiguration.java (99%) rename {springfox-spring-webflux => springfox-swagger2}/src/main/java/springfox/documentation/spring/web/WebFluxObjectMapperConfigurer.java (100%) rename {springfox-spring-webmvc => springfox-swagger2}/src/main/java/springfox/documentation/spring/web/WebMvcObjectMapperConfigurer.java (100%) rename {springfox-spring-webflux => springfox-swagger2}/src/main/java/springfox/documentation/spring/web/plugins/WebfluxDefaultsProvider.java (100%) delete mode 100644 springfox-swagger2/src/test/groovy/springfox/documentation/swagger2/configuration/PropertyExampleSerializerMixinSpec.groovy delete mode 100644 springfox-swagger2/src/test/groovy/springfox/documentation/swagger2/configuration/Swagger2JacksonModuleSpec.groovy delete mode 100644 springfox-swagger2/src/test/groovy/springfox/documentation/swagger2/mappers/ApiKeyAuthFactorySpec.groovy delete mode 100644 springfox-swagger2/src/test/groovy/springfox/documentation/swagger2/mappers/EnumMapperSpec.groovy delete mode 100644 springfox-swagger2/src/test/groovy/springfox/documentation/swagger2/mappers/ExamplesMapperSpec.groovy delete mode 100644 springfox-swagger2/src/test/groovy/springfox/documentation/swagger2/mappers/LicenseMapperSpec.groovy delete mode 100644 springfox-swagger2/src/test/groovy/springfox/documentation/swagger2/mappers/MapperSupport.groovy delete mode 100644 springfox-swagger2/src/test/groovy/springfox/documentation/swagger2/mappers/ModelMapperSpec.groovy delete mode 100644 springfox-swagger2/src/test/groovy/springfox/documentation/swagger2/mappers/OAuth2AuthFactorySpec.groovy delete mode 100644 springfox-swagger2/src/test/groovy/springfox/documentation/swagger2/mappers/ParameterMapperSpec.groovy delete mode 100644 springfox-swagger2/src/test/groovy/springfox/documentation/swagger2/mappers/PropertiesSpec.groovy delete mode 100644 springfox-swagger2/src/test/groovy/springfox/documentation/swagger2/mappers/SecurityMapperSpec.groovy delete mode 100644 springfox-swagger2/src/test/groovy/springfox/documentation/swagger2/mappers/SerializableParameterFactoriesSpec.groovy delete mode 100644 springfox-swagger2/src/test/groovy/springfox/documentation/swagger2/mappers/ServiceModelToSwagger2MapperSpec.groovy delete mode 100644 springfox-swagger2/src/test/groovy/springfox/documentation/swagger2/mappers/VendorExtensionsMapperSpec.groovy delete mode 100644 springfox-swagger2/src/test/groovy/springfox/documentation/swagger2/web/Swagger2ControllerSpec.groovy delete mode 100644 springfox-swagger2/src/test/groovy/springfox/documentation/swagger2/web/Swagger2ControllerWebFluxSpec.groovy delete mode 100644 springfox-swagger2/src/test/java/springfox/documentation/swagger2/configuration/PropertyExampleSerializerTest.java delete mode 100644 swagger-contract-tests-webflux/README.md delete mode 100644 swagger-contract-tests-webflux/build.gradle delete mode 100644 swagger-contract-tests-webflux/src/main/java/springfox/test/contract/swagger/webflux/FeatureDemonstrationController.java delete mode 100644 swagger-contract-tests-webflux/src/main/java/springfox/test/contract/swagger/webflux/SecuritySupport.java delete mode 100644 swagger-contract-tests-webflux/src/main/java/springfox/test/contract/swagger/webflux/Swagger2WebFluxConfig.java delete mode 100644 swagger-contract-tests-webflux/src/main/java/springfox/test/contract/swagger/webflux/SwaggerWebfluxApplication.java delete mode 100644 swagger-contract-tests-webflux/src/main/java/springfox/test/contract/swagger/webflux/bugs/Bug3343.java delete mode 100644 swagger-contract-tests-webflux/src/main/java/springfox/test/contract/swagger/webflux/bugs/WebFluxBugController.java delete mode 100644 swagger-contract-tests-webflux/src/main/java/springfox/test/contract/swagger/webflux/listeners/ObjectMapperEventListener.java delete mode 100644 swagger-contract-tests-webflux/src/main/resources/simplelogger.properties delete mode 100644 swagger-contract-tests-webflux/src/test/groovy/springfox/test/contract/swaggertests/webflux/FileAccess.groovy delete mode 100644 swagger-contract-tests-webflux/src/test/groovy/springfox/test/contract/swaggertests/webflux/ObjectMapperSanityCheck.groovy delete mode 100644 swagger-contract-tests-webflux/src/test/groovy/springfox/test/contract/swaggertests/webflux/WebFluxFunctionContractSpec.groovy delete mode 100644 swagger-contract-tests-webflux/src/test/resources/contract/swagger2/bug-demonstration.json delete mode 100644 swagger-contract-tests-webflux/src/test/resources/contract/swagger2/feature-demonstration.json delete mode 100644 swagger-contract-tests-webflux/src/test/resources/contract/swagger2/swagger.json delete mode 100644 swagger-contract-tests-webflux/src/test/resources/contract/swagger2/swaggerTemplated.json delete mode 100644 swagger-contract-tests/README.md delete mode 100644 swagger-contract-tests/build.gradle delete mode 100644 swagger-contract-tests/src/main/java/springfox/test/contract/swagger/AbstractController.java delete mode 100644 swagger-contract-tests/src/main/java/springfox/test/contract/swagger/AbstractPetService.java delete mode 100644 swagger-contract-tests/src/main/java/springfox/test/contract/swagger/Bug1767ListingScanner.java delete mode 100644 swagger-contract-tests/src/main/java/springfox/test/contract/swagger/BugsController.java delete mode 100644 swagger-contract-tests/src/main/java/springfox/test/contract/swagger/BusinessService.java delete mode 100644 swagger-contract-tests/src/main/java/springfox/test/contract/swagger/ConcreteController.java delete mode 100644 swagger-contract-tests/src/main/java/springfox/test/contract/swagger/ConsumesProducesService.java delete mode 100644 swagger-contract-tests/src/main/java/springfox/test/contract/swagger/CrossOriginFilter.java delete mode 100644 swagger-contract-tests/src/main/java/springfox/test/contract/swagger/CyclicStructuresController.java delete mode 100644 swagger-contract-tests/src/main/java/springfox/test/contract/swagger/EnumService.java delete mode 100644 swagger-contract-tests/src/main/java/springfox/test/contract/swagger/FancyPetService.java delete mode 100644 swagger-contract-tests/src/main/java/springfox/test/contract/swagger/FeatureDemonstrationService.java delete mode 100644 swagger-contract-tests/src/main/java/springfox/test/contract/swagger/InheritedService.java delete mode 100644 swagger-contract-tests/src/main/java/springfox/test/contract/swagger/InheritedServiceImpl.java delete mode 100644 swagger-contract-tests/src/main/java/springfox/test/contract/swagger/PetGroomingService.java delete mode 100644 swagger-contract-tests/src/main/java/springfox/test/contract/swagger/PetService.java delete mode 100644 swagger-contract-tests/src/main/java/springfox/test/contract/swagger/SameController.java delete mode 100644 swagger-contract-tests/src/main/java/springfox/test/contract/swagger/SecuritySupport.java delete mode 100644 swagger-contract-tests/src/main/java/springfox/test/contract/swagger/SortDirection.java delete mode 100644 swagger-contract-tests/src/main/java/springfox/test/contract/swagger/Swagger2TestConfig.java delete mode 100644 swagger-contract-tests/src/main/java/springfox/test/contract/swagger/SwaggerApplication.java delete mode 100644 swagger-contract-tests/src/main/java/springfox/test/contract/swagger/data/rest/Address.java delete mode 100644 swagger-contract-tests/src/main/java/springfox/test/contract/swagger/data/rest/AddressRepository.java delete mode 100644 swagger-contract-tests/src/main/java/springfox/test/contract/swagger/data/rest/BasePathConfigurer.java delete mode 100644 swagger-contract-tests/src/main/java/springfox/test/contract/swagger/data/rest/Category.java delete mode 100644 swagger-contract-tests/src/main/java/springfox/test/contract/swagger/data/rest/CategoryRepository.java delete mode 100644 swagger-contract-tests/src/main/java/springfox/test/contract/swagger/data/rest/Person.java delete mode 100644 swagger-contract-tests/src/main/java/springfox/test/contract/swagger/data/rest/PersonController.java delete mode 100644 swagger-contract-tests/src/main/java/springfox/test/contract/swagger/data/rest/PersonRepository.java delete mode 100644 swagger-contract-tests/src/main/java/springfox/test/contract/swagger/data/rest/Tag.java delete mode 100644 swagger-contract-tests/src/main/java/springfox/test/contract/swagger/data/rest/TagRepository.java delete mode 100644 swagger-contract-tests/src/main/java/springfox/test/contract/swagger/models/AccountType.java delete mode 100644 swagger-contract-tests/src/main/java/springfox/test/contract/swagger/models/ApplicationLang.java delete mode 100644 swagger-contract-tests/src/main/java/springfox/test/contract/swagger/models/Bug1370.java delete mode 100644 swagger-contract-tests/src/main/java/springfox/test/contract/swagger/models/Bug1749.java delete mode 100644 swagger-contract-tests/src/main/java/springfox/test/contract/swagger/models/Bug2767.java delete mode 100644 swagger-contract-tests/src/main/java/springfox/test/contract/swagger/models/Bug3087.java delete mode 100644 swagger-contract-tests/src/main/java/springfox/test/contract/swagger/models/Bug3353.java delete mode 100644 swagger-contract-tests/src/main/java/springfox/test/contract/swagger/models/Business.java delete mode 100644 swagger-contract-tests/src/main/java/springfox/test/contract/swagger/models/Car.java delete mode 100644 swagger-contract-tests/src/main/java/springfox/test/contract/swagger/models/Category.java delete mode 100644 swagger-contract-tests/src/main/java/springfox/test/contract/swagger/models/City.java delete mode 100644 swagger-contract-tests/src/main/java/springfox/test/contract/swagger/models/Country.java delete mode 100644 swagger-contract-tests/src/main/java/springfox/test/contract/swagger/models/CustomAllCapsStringHashSet.java delete mode 100644 swagger-contract-tests/src/main/java/springfox/test/contract/swagger/models/District.java delete mode 100644 swagger-contract-tests/src/main/java/springfox/test/contract/swagger/models/EHDTOApplicatorUnits.java delete mode 100644 swagger-contract-tests/src/main/java/springfox/test/contract/swagger/models/EHDTOUnit.java delete mode 100644 swagger-contract-tests/src/main/java/springfox/test/contract/swagger/models/EHDTOUnitGroup.java delete mode 100644 swagger-contract-tests/src/main/java/springfox/test/contract/swagger/models/EnumCollection.java delete mode 100644 swagger-contract-tests/src/main/java/springfox/test/contract/swagger/models/EnumObjectType.java delete mode 100644 swagger-contract-tests/src/main/java/springfox/test/contract/swagger/models/EnumType.java delete mode 100644 swagger-contract-tests/src/main/java/springfox/test/contract/swagger/models/Example.java delete mode 100644 swagger-contract-tests/src/main/java/springfox/test/contract/swagger/models/ExampleListWrapper.java delete mode 100644 swagger-contract-tests/src/main/java/springfox/test/contract/swagger/models/FancyPet.java delete mode 100644 swagger-contract-tests/src/main/java/springfox/test/contract/swagger/models/Feature3311.java delete mode 100644 swagger-contract-tests/src/main/java/springfox/test/contract/swagger/models/House.java delete mode 100644 swagger-contract-tests/src/main/java/springfox/test/contract/swagger/models/Language.java delete mode 100644 swagger-contract-tests/src/main/java/springfox/test/contract/swagger/models/LanguageResponse.java delete mode 100644 swagger-contract-tests/src/main/java/springfox/test/contract/swagger/models/LanguageText.java delete mode 100644 swagger-contract-tests/src/main/java/springfox/test/contract/swagger/models/ModelAttributeExample.java delete mode 100644 swagger-contract-tests/src/main/java/springfox/test/contract/swagger/models/ModelWithArrayOfArrays.java delete mode 100644 swagger-contract-tests/src/main/java/springfox/test/contract/swagger/models/ModelWithMapProperty.java delete mode 100644 swagger-contract-tests/src/main/java/springfox/test/contract/swagger/models/ModelWithObjectNode.java delete mode 100644 swagger-contract-tests/src/main/java/springfox/test/contract/swagger/models/ModelWithSameNameClasses.java delete mode 100644 swagger-contract-tests/src/main/java/springfox/test/contract/swagger/models/NestedType.java delete mode 100644 swagger-contract-tests/src/main/java/springfox/test/contract/swagger/models/Parent.java delete mode 100644 swagger-contract-tests/src/main/java/springfox/test/contract/swagger/models/Pet.java delete mode 100644 swagger-contract-tests/src/main/java/springfox/test/contract/swagger/models/PetWithSerializer.java delete mode 100644 swagger-contract-tests/src/main/java/springfox/test/contract/swagger/models/Region.java delete mode 100644 swagger-contract-tests/src/main/java/springfox/test/contract/swagger/models/SameCategory.java delete mode 100644 swagger-contract-tests/src/main/java/springfox/test/contract/swagger/models/SameFancyPet.java delete mode 100644 swagger-contract-tests/src/main/java/springfox/test/contract/swagger/models/SamePet.java delete mode 100644 swagger-contract-tests/src/main/java/springfox/test/contract/swagger/models/SortDirection.java delete mode 100644 swagger-contract-tests/src/main/java/springfox/test/contract/swagger/models/Street.java delete mode 100644 swagger-contract-tests/src/main/java/springfox/test/contract/swagger/models/Treeish.java delete mode 100644 swagger-contract-tests/src/main/java/springfox/test/contract/swagger/models/Truck.java delete mode 100644 swagger-contract-tests/src/main/java/springfox/test/contract/swagger/models/Vehicle.java delete mode 100644 swagger-contract-tests/src/main/java/springfox/test/contract/swagger/webflux/listeners/ObjectMapperEventListener.java delete mode 100644 swagger-contract-tests/src/main/resources/application.properties delete mode 100644 swagger-contract-tests/src/main/resources/simplelogger.properties delete mode 100644 swagger-contract-tests/src/test/groovy/springfox/test/contract/swaggertests/FileAccess.groovy delete mode 100644 swagger-contract-tests/src/test/groovy/springfox/test/contract/swaggertests/FunctionContractSpec.groovy delete mode 100644 swagger-contract-tests/src/test/groovy/springfox/test/contract/swaggertests/ObjectMapperSanityCheck.groovy delete mode 100644 swagger-contract-tests/src/test/resources/contract/swagger/declaration-business-service.json delete mode 100644 swagger-contract-tests/src/test/resources/contract/swagger/declaration-concrete-controller.json delete mode 100644 swagger-contract-tests/src/test/resources/contract/swagger/declaration-controller-with-no-request-mapping-service.json delete mode 100644 swagger-contract-tests/src/test/resources/contract/swagger/declaration-fancy-pet-service.json delete mode 100644 swagger-contract-tests/src/test/resources/contract/swagger/declaration-feature-demonstration-service.json delete mode 100644 swagger-contract-tests/src/test/resources/contract/swagger/declaration-groovy-service.json delete mode 100644 swagger-contract-tests/src/test/resources/contract/swagger/declaration-inherited-service-impl.json delete mode 100644 swagger-contract-tests/src/test/resources/contract/swagger/declaration-pet-grooming-service.json delete mode 100644 swagger-contract-tests/src/test/resources/contract/swagger/declaration-pet-service.json delete mode 100644 swagger-contract-tests/src/test/resources/contract/swagger/declaration-root-controller.json delete mode 100644 swagger-contract-tests/src/test/resources/contract/swagger/resource-listing.json delete mode 100644 swagger-contract-tests/src/test/resources/contract/swagger2/declaration-bugs-different-service.json delete mode 100644 swagger-contract-tests/src/test/resources/contract/swagger2/declaration-bugs-service.json delete mode 100644 swagger-contract-tests/src/test/resources/contract/swagger2/declaration-business-service.json delete mode 100644 swagger-contract-tests/src/test/resources/contract/swagger2/declaration-concrete-controller.json delete mode 100644 swagger-contract-tests/src/test/resources/contract/swagger2/declaration-consumes-produces-not-on-document-context.json delete mode 100644 swagger-contract-tests/src/test/resources/contract/swagger2/declaration-consumes-produces-on-document-context.json delete mode 100644 swagger-contract-tests/src/test/resources/contract/swagger2/declaration-controller-with-no-request-mapping-service.json delete mode 100644 swagger-contract-tests/src/test/resources/contract/swagger2/declaration-cyclic-controller.json delete mode 100644 swagger-contract-tests/src/test/resources/contract/swagger2/declaration-different-group.json delete mode 100644 swagger-contract-tests/src/test/resources/contract/swagger2/declaration-enum-service.json delete mode 100644 swagger-contract-tests/src/test/resources/contract/swagger2/declaration-fancy-pet-service.json delete mode 100644 swagger-contract-tests/src/test/resources/contract/swagger2/declaration-feature-demonstration-service-codeGen.json delete mode 100644 swagger-contract-tests/src/test/resources/contract/swagger2/declaration-feature-demonstration-service.json delete mode 100644 swagger-contract-tests/src/test/resources/contract/swagger2/declaration-groovy-service.json delete mode 100644 swagger-contract-tests/src/test/resources/contract/swagger2/declaration-inherited-service-impl.json delete mode 100644 swagger-contract-tests/src/test/resources/contract/swagger2/declaration-pet-grooming-service.json delete mode 100644 swagger-contract-tests/src/test/resources/contract/swagger2/declaration-pet-service.json delete mode 100644 swagger-contract-tests/src/test/resources/contract/swagger2/declaration-root-controller.json delete mode 100644 swagger-contract-tests/src/test/resources/contract/swagger2/declaration-same-controller.json delete mode 100644 swagger-contract-tests/src/test/resources/contract/swagger2/declaration-spring-data-rest.json delete mode 100644 swagger-contract-tests/src/test/resources/contract/swagger2/swagger.json delete mode 100644 swagger-contract-tests/src/test/resources/contract/swagger2/swaggerTemplated.json diff --git a/build.gradle b/build.gradle index 50b954366a3..d41b3c86589 100644 --- a/build.gradle +++ b/build.gradle @@ -25,7 +25,8 @@ apply plugin: 'springfox-multi-release' allprojects { repositories { mavenLocal() - //maven {url "https://plugins.gradle.org/m2/"} + maven {url "https://plugins.gradle.org/m2/"} + maven {url "https://mvnrepository.com/"} maven {url 'https://maven.aliyun.com/repository/public'} maven {url 'https://maven.aliyun.com/repository/google'} maven {url 'https://maven.aliyun.com/repository/spring'} @@ -35,8 +36,7 @@ allprojects { gradlePluginPortal() } - apply plugin: 'jacoco' - ext['groovy.version'] = "$groovy" + ext['groovy.version'] = "4.0.0" } subprojects { @@ -71,22 +71,15 @@ subprojects { task allDeps(type: DependencyReportTask) {} - jacoco { - toolVersion = "$jacocoVersion" + task wrapper(type: Wrapper) { + gradleVersion = '7.4' } - jacocoTestReport { - reports { - xml.enabled true - html.enabled true - } - } - - test { - jvmArgs "-Dorg.spockframework.mock.ignoreByteBuddy=true" - finalizedBy jacocoTestReport - useJUnitPlatform() - } +// +// test { +// jvmArgs "-Dorg.spockframework.mock.ignoreByteBuddy=true" +// useJUnitPlatform() +// } sourceCompatibility = JavaVersion.VERSION_17 targetCompatibility = JavaVersion.VERSION_17 @@ -94,24 +87,3 @@ subprojects { apply from: "$rootDir/gradle/documentation.gradle" -task codeCoverageReport(type: JacocoReport) { - - // Gather execution data from all subprojects - // (change this if you e.g. want to calculate unit test/integration test coverage separately) - executionData fileTree(project.rootDir.absolutePath).include("**/build/jacoco/*.exec") - - // Add all relevant sourcesets from the subprojects - subprojects.each { sourceSets it.sourceSets.main } - - reports { - xml.enabled true - xml.destination file("${buildDir}/reports/jacoco/report.xml") - html.enabled false - csv.enabled false - } -} - -// always run the tests before generating the report -codeCoverageReport.dependsOn { - subprojects*.test -} diff --git a/buildSrc/src/main/groovy/springfox/gradlebuild/plugins/MultiProjectReleasePlugin.groovy b/buildSrc/src/main/groovy/springfox/gradlebuild/plugins/MultiProjectReleasePlugin.groovy index 8ed434e851d..88a6bd5df37 100644 --- a/buildSrc/src/main/groovy/springfox/gradlebuild/plugins/MultiProjectReleasePlugin.groovy +++ b/buildSrc/src/main/groovy/springfox/gradlebuild/plugins/MultiProjectReleasePlugin.groovy @@ -89,7 +89,7 @@ class MultiProjectReleasePlugin implements Plugin { project.afterEvaluate { evaluatedProject -> def javaCheckTasks = evaluatedProject.getTasksByName('check', true) - def artifactoryPublishTasks = evaluatedProject.getTasksByName('artifactoryPublish', true) + def artifactoryPublishTasks = evaluatedProject.getTasksByName('artifactoryPublish', false) publishSnapshot.dependsOn javaCheckTasks publishSnapshot.dependsOn artifactoryPublishTasks } diff --git a/buildSrc/src/main/groovy/springfox/gradlebuild/utils/ProjectDefinitions.groovy b/buildSrc/src/main/groovy/springfox/gradlebuild/utils/ProjectDefinitions.groovy index c453419b189..1326639011a 100644 --- a/buildSrc/src/main/groovy/springfox/gradlebuild/utils/ProjectDefinitions.groovy +++ b/buildSrc/src/main/groovy/springfox/gradlebuild/utils/ProjectDefinitions.groovy @@ -29,7 +29,7 @@ class ProjectDefinitions { static final TEST_PROJECTS = [ 'swagger-contract-tests', 'swagger-contract-tests-webflux', - 'oas-contract-tests', +// 'oas-contract-tests', 'buildSrc', 'springfox-spring-config', 'springfox-petstore', diff --git a/codecov.yml b/codecov.yml index c4a288783f2..085ee5e2246 100644 --- a/codecov.yml +++ b/codecov.yml @@ -44,6 +44,6 @@ ignore: - "springfox-spring-config" # ignore project used for documentation - "swagger-contract-tests" # ignore contract tests as its purely for testing - "swagger-contract-tests-webflux" # ignore contract tests as its purely for testing - - "oas-contract-tests" # ignore contract tests as its purely for testing +# - "oas-contract-tests" # ignore contract tests as its purely for testing - "springfox-boot-starter" # ignore contract tests as its purely for testing diff --git a/config/checkstyle.xml b/config/checkstyle.xml index 1cf82d92671..e5636791813 100644 --- a/config/checkstyle.xml +++ b/config/checkstyle.xml @@ -65,9 +65,6 @@ - - - @@ -154,4 +151,4 @@ - \ No newline at end of file + diff --git a/gradle/dependencies.gradle b/gradle/dependencies.gradle index aff40793602..3a84667c7fd 100644 --- a/gradle/dependencies.gradle +++ b/gradle/dependencies.gradle @@ -5,7 +5,6 @@ ext { classGraph = "4.8.83" equalsverifierVersion = '3.3' groovy = "4.0.6" - jacocoVersion = '0.8.5' jackson = '2.14.1' joda = "2.10.6" jsonPath = "2.4.0" diff --git a/gradle/publishing.gradle b/gradle/publishing.gradle old mode 100644 new mode 100755 index e0eac74794f..067aa294e1b --- a/gradle/publishing.gradle +++ b/gradle/publishing.gradle @@ -72,14 +72,7 @@ javadoc { publishing { repositories { - maven { - name 'nexus' - url = project.publishUrl - credentials{ - username = project.ossUser - password = project.ossPassword - } - } + mavenLocal() } publications { mavenJava(MavenPublication) { diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 62d4c053550b91381bbd28b1afc82d634bf73a8a..41d9927a4d4fb3f96a785543079b8df6723c946b 100644 GIT binary patch delta 20829 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

;BmaEf^h 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 \(.*\)$'` - if expr "$link" : '/.*' > /dev/null; then - PRG="$link" - else - PRG=`dirname "$PRG"`"/$link" - fi +app_path=$0 + +# Need this for daisy-chained symlinks. +while + APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path + [ -h "$app_path" ] +do + ls=$( ls -ld "$app_path" ) + link=${ls#*' -> '} + case $link in #( + /*) app_path=$link ;; #( + *) app_path=$APP_HOME$link ;; + esac done -SAVED="`pwd`" -cd "`dirname \"$PRG\"`/" >/dev/null -APP_HOME="`pwd -P`" -cd "$SAVED" >/dev/null + +APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit APP_NAME="Gradle" -APP_BASE_NAME=`basename "$0"` +APP_BASE_NAME=${0##*/} # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' # Use the maximum available, or set MAX_FD != -1 to use that value. -MAX_FD="maximum" +MAX_FD=maximum warn () { echo "$*" -} +} >&2 die () { echo echo "$*" echo exit 1 -} +} >&2 # OS specific support (must be 'true' or 'false'). cygwin=false msys=false darwin=false nonstop=false -case "`uname`" in - CYGWIN* ) - cygwin=true - ;; - Darwin* ) - darwin=true - ;; - MINGW* ) - msys=true - ;; - NONSTOP* ) - nonstop=true - ;; +case "$( uname )" in #( + CYGWIN* ) cygwin=true ;; #( + Darwin* ) darwin=true ;; #( + MSYS* | MINGW* ) msys=true ;; #( + NONSTOP* ) nonstop=true ;; esac CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar @@ -87,9 +121,9 @@ CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar if [ -n "$JAVA_HOME" ] ; then if [ -x "$JAVA_HOME/jre/sh/java" ] ; then # IBM's JDK on AIX uses strange locations for the executables - JAVACMD="$JAVA_HOME/jre/sh/java" + JAVACMD=$JAVA_HOME/jre/sh/java else - JAVACMD="$JAVA_HOME/bin/java" + JAVACMD=$JAVA_HOME/bin/java fi if [ ! -x "$JAVACMD" ] ; then die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME @@ -98,7 +132,7 @@ Please set the JAVA_HOME variable in your environment to match the location of your Java installation." fi else - JAVACMD="java" + JAVACMD=java which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. Please set the JAVA_HOME variable in your environment to match the @@ -106,80 +140,95 @@ location of your Java installation." fi # Increase the maximum file descriptors if we can. -if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then - MAX_FD_LIMIT=`ulimit -H -n` - if [ $? -eq 0 ] ; then - if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then - MAX_FD="$MAX_FD_LIMIT" - fi - ulimit -n $MAX_FD - if [ $? -ne 0 ] ; then - warn "Could not set maximum file descriptor limit: $MAX_FD" - fi - else - warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" - fi +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then + case $MAX_FD in #( + max*) + MAX_FD=$( ulimit -H -n ) || + warn "Could not query maximum file descriptor limit" + esac + case $MAX_FD in #( + '' | soft) :;; #( + *) + ulimit -n "$MAX_FD" || + warn "Could not set maximum file descriptor limit to $MAX_FD" + esac fi -# For Darwin, add options to specify how the application appears in the dock -if $darwin; then - GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" -fi +# Collect all arguments for the java command, stacking in reverse order: +# * args from the command line +# * the main class name +# * -classpath +# * -D...appname settings +# * --module-path (only if needed) +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. # For Cygwin or MSYS, switch paths to Windows format before running java -if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then - APP_HOME=`cygpath --path --mixed "$APP_HOME"` - CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` - - JAVACMD=`cygpath --unix "$JAVACMD"` - - # We build the pattern for arguments to be converted via cygpath - ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` - SEP="" - for dir in $ROOTDIRSRAW ; do - ROOTDIRS="$ROOTDIRS$SEP$dir" - SEP="|" - done - OURCYGPATTERN="(^($ROOTDIRS))" - # Add a user-defined pattern to the cygpath arguments - if [ "$GRADLE_CYGPATTERN" != "" ] ; then - OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" - fi +if "$cygwin" || "$msys" ; then + APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) + CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) + + JAVACMD=$( cygpath --unix "$JAVACMD" ) + # Now convert the arguments - kludge to limit ourselves to /bin/sh - i=0 - for arg in "$@" ; do - CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` - CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option - - if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition - eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` - else - eval `echo args$i`="\"$arg\"" + for arg do + if + case $arg in #( + -*) false ;; # don't mess with options #( + /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath + [ -e "$t" ] ;; #( + *) false ;; + esac + then + arg=$( cygpath --path --ignore --mixed "$arg" ) fi - i=`expr $i + 1` + # Roll the args list around exactly as many times as the number of + # args, so each arg winds up back in the position where it started, but + # possibly modified. + # + # NB: a `for` loop captures its iteration list before it begins, so + # changing the positional parameters here affects neither the number of + # iterations, nor the values presented in `arg`. + shift # remove old arg + set -- "$@" "$arg" # push replacement arg done - case $i in - 0) set -- ;; - 1) set -- "$args0" ;; - 2) set -- "$args0" "$args1" ;; - 3) set -- "$args0" "$args1" "$args2" ;; - 4) set -- "$args0" "$args1" "$args2" "$args3" ;; - 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; - 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; - 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; - 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; - 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; - esac fi -# Escape application args -save () { - for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done - echo " " -} -APP_ARGS=`save "$@"` +# Collect all arguments for the java command; +# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of +# shell script including quotes and variable substitutions, so put them in +# double quotes to make sure that they get re-expanded; and +# * put everything else in single quotes, so that it's not re-expanded. + +set -- \ + "-Dorg.gradle.appname=$APP_BASE_NAME" \ + -classpath "$CLASSPATH" \ + org.gradle.wrapper.GradleWrapperMain \ + "$@" + +# Use "xargs" to parse quoted args. +# +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# -# Collect all arguments for the java command, following the shell quoting and substitution rules -eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" +eval "set -- $( + printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | + xargs -n1 | + sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | + tr '\n' ' ' + )" '"$@"' exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat index a9f778a7a96..ac1b06f9382 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -40,7 +40,7 @@ if defined JAVA_HOME goto findJavaFromJavaHome set JAVA_EXE=java.exe %JAVA_EXE% -version >NUL 2>&1 -if "%ERRORLEVEL%" == "0" goto init +if "%ERRORLEVEL%" == "0" goto execute echo. echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. @@ -54,7 +54,7 @@ goto fail set JAVA_HOME=%JAVA_HOME:"=% set JAVA_EXE=%JAVA_HOME%/bin/java.exe -if exist "%JAVA_EXE%" goto init +if exist "%JAVA_EXE%" goto execute echo. echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% @@ -64,21 +64,6 @@ echo location of your Java installation. goto fail -:init -@rem Get command-line arguments, handling Windows variants - -if not "%OS%" == "Windows_NT" goto win9xME_args - -:win9xME_args -@rem Slurp the command line arguments. -set CMD_LINE_ARGS= -set _SKIP=2 - -:win9xME_args_slurp -if "x%~1" == "x" goto execute - -set CMD_LINE_ARGS=%* - :execute @rem Setup the command line @@ -86,7 +71,7 @@ set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar @rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* :end @rem End local scope for the variables with windows NT shell diff --git a/oas-contract-tests/build.gradle b/oas-contract-tests/build.gradle index ee5a7b99b24..5a2b3921bbd 100644 --- a/oas-contract-tests/build.gradle +++ b/oas-contract-tests/build.gradle @@ -22,7 +22,7 @@ dependencies { implementation "org.springframework.boot:spring-boot-starter-web" implementation "org.springframework.boot:spring-boot-starter-webflux" implementation "org.springframework.boot:spring-boot-starter-data-rest" - implementation "org.apache.groovy:groovy-all:$groovy" + implementation "org.codehaus.groovy:groovy-all:$groovy" implementation 'org.slf4j:slf4j-simple:1.7.30' implementation "javax.validation:validation-api:$validationApiVersion" @@ -45,4 +45,4 @@ dependencies { // systemProperty("contract.tests.root", "$projectDir/src/test/resources") // systemProperty("contract.tests.update", true) //} -// end::update-contract-tests[] \ No newline at end of file +// end::update-contract-tests[] diff --git a/oas-contract-tests/gradle/wrapper/gradle-wrapper.jar b/oas-contract-tests/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..41d9927a4d4fb3f96a785543079b8df6723c946b GIT binary patch literal 59821 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 literal 0 HcmV?d00001 diff --git a/oas-contract-tests/gradle/wrapper/gradle-wrapper.properties b/oas-contract-tests/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 00000000000..41dfb87909a --- /dev/null +++ b/oas-contract-tests/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,5 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-7.4-bin.zip +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/oas-contract-tests/gradlew b/oas-contract-tests/gradlew new file mode 100755 index 00000000000..1b6c787337f --- /dev/null +++ b/oas-contract-tests/gradlew @@ -0,0 +1,234 @@ +#!/bin/sh + +# +# Copyright © 2015-2021 the original authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +############################################################################## +# +# Gradle start up script for POSIX generated by Gradle. +# +# Important for running: +# +# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is +# noncompliant, but you have some other compliant shell such as ksh or +# bash, then to run this script, type that shell name before the whole +# command line, like: +# +# ksh Gradle +# +# Busybox and similar reduced shells will NOT work, because this script +# requires all of these POSIX shell features: +# * functions; +# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», +# «${var#prefix}», «${var%suffix}», and «$( cmd )»; +# * compound commands having a testable exit status, especially «case»; +# * various built-in commands including «command», «set», and «ulimit». +# +# Important for patching: +# +# (2) This script targets any POSIX shell, so it avoids extensions provided +# by Bash, Ksh, etc; in particular arrays are avoided. +# +# The "traditional" practice of packing multiple parameters into a +# space-separated string is a well documented source of bugs and security +# problems, so this is (mostly) avoided, by progressively accumulating +# options in "$@", and eventually passing that to Java. +# +# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, +# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; +# see the in-line comments for details. +# +# There are tweaks for specific operating systems such as AIX, CygWin, +# Darwin, MinGW, and NonStop. +# +# (3) This script is generated from the Groovy template +# https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# within the Gradle project. +# +# You can find Gradle at https://github.com/gradle/gradle/. +# +############################################################################## + +# Attempt to set APP_HOME + +# Resolve links: $0 may be a link +app_path=$0 + +# Need this for daisy-chained symlinks. +while + APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path + [ -h "$app_path" ] +do + ls=$( ls -ld "$app_path" ) + link=${ls#*' -> '} + case $link in #( + /*) app_path=$link ;; #( + *) app_path=$APP_HOME$link ;; + esac +done + +APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit + +APP_NAME="Gradle" +APP_BASE_NAME=${0##*/} + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD=maximum + +warn () { + echo "$*" +} >&2 + +die () { + echo + echo "$*" + echo + exit 1 +} >&2 + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "$( uname )" in #( + CYGWIN* ) cygwin=true ;; #( + Darwin* ) darwin=true ;; #( + MSYS* | MINGW* ) msys=true ;; #( + NONSTOP* ) nonstop=true ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD=$JAVA_HOME/jre/sh/java + else + JAVACMD=$JAVA_HOME/bin/java + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD=java + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then + case $MAX_FD in #( + max*) + MAX_FD=$( ulimit -H -n ) || + warn "Could not query maximum file descriptor limit" + esac + case $MAX_FD in #( + '' | soft) :;; #( + *) + ulimit -n "$MAX_FD" || + warn "Could not set maximum file descriptor limit to $MAX_FD" + esac +fi + +# Collect all arguments for the java command, stacking in reverse order: +# * args from the command line +# * the main class name +# * -classpath +# * -D...appname settings +# * --module-path (only if needed) +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. + +# For Cygwin or MSYS, switch paths to Windows format before running java +if "$cygwin" || "$msys" ; then + APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) + CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) + + JAVACMD=$( cygpath --unix "$JAVACMD" ) + + # Now convert the arguments - kludge to limit ourselves to /bin/sh + for arg do + if + case $arg in #( + -*) false ;; # don't mess with options #( + /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath + [ -e "$t" ] ;; #( + *) false ;; + esac + then + arg=$( cygpath --path --ignore --mixed "$arg" ) + fi + # Roll the args list around exactly as many times as the number of + # args, so each arg winds up back in the position where it started, but + # possibly modified. + # + # NB: a `for` loop captures its iteration list before it begins, so + # changing the positional parameters here affects neither the number of + # iterations, nor the values presented in `arg`. + shift # remove old arg + set -- "$@" "$arg" # push replacement arg + done +fi + +# Collect all arguments for the java command; +# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of +# shell script including quotes and variable substitutions, so put them in +# double quotes to make sure that they get re-expanded; and +# * put everything else in single quotes, so that it's not re-expanded. + +set -- \ + "-Dorg.gradle.appname=$APP_BASE_NAME" \ + -classpath "$CLASSPATH" \ + org.gradle.wrapper.GradleWrapperMain \ + "$@" + +# Use "xargs" to parse quoted args. +# +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# + +eval "set -- $( + printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | + xargs -n1 | + sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | + tr '\n' ' ' + )" '"$@"' + +exec "$JAVACMD" "$@" diff --git a/oas-contract-tests/gradlew.bat b/oas-contract-tests/gradlew.bat new file mode 100644 index 00000000000..ac1b06f9382 --- /dev/null +++ b/oas-contract-tests/gradlew.bat @@ -0,0 +1,89 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto execute + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/settings.gradle b/settings.gradle index d73a78481ad..2c746415dc3 100644 --- a/settings.gradle +++ b/settings.gradle @@ -3,24 +3,7 @@ include 'springfox-core' include 'springfox-spi' include 'springfox-schema' include 'springfox-spring-web' -include 'springfox-spring-webmvc' -include 'springfox-spring-webflux' -include 'springfox-spring-integration' -include 'springfox-spring-integration-webmvc' -include 'springfox-spring-integration-webflux' include 'springfox-swagger-common' -include 'springfox-swagger1' include 'springfox-swagger2' -include 'springfox-oas' include 'springfox-bean-validators' -include 'springfox-data-rest' include 'springfox-swagger-ui' -include 'springfox-petstore' -include 'springfox-petstore-webflux' -include 'springfox-boot-starter' - -// Auxiliary projects that are not published -include 'springfox-spring-config' -include 'swagger-contract-tests' -include 'swagger-contract-tests-webflux' -include 'oas-contract-tests' diff --git a/springfox-bean-validators/gradle/wrapper/gradle-wrapper.jar b/springfox-bean-validators/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..41d9927a4d4fb3f96a785543079b8df6723c946b GIT binary patch literal 59821 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 literal 0 HcmV?d00001 diff --git a/springfox-bean-validators/gradle/wrapper/gradle-wrapper.properties b/springfox-bean-validators/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 00000000000..41dfb87909a --- /dev/null +++ b/springfox-bean-validators/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,5 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-7.4-bin.zip +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/springfox-bean-validators/gradlew b/springfox-bean-validators/gradlew new file mode 100755 index 00000000000..1b6c787337f --- /dev/null +++ b/springfox-bean-validators/gradlew @@ -0,0 +1,234 @@ +#!/bin/sh + +# +# Copyright © 2015-2021 the original authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +############################################################################## +# +# Gradle start up script for POSIX generated by Gradle. +# +# Important for running: +# +# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is +# noncompliant, but you have some other compliant shell such as ksh or +# bash, then to run this script, type that shell name before the whole +# command line, like: +# +# ksh Gradle +# +# Busybox and similar reduced shells will NOT work, because this script +# requires all of these POSIX shell features: +# * functions; +# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», +# «${var#prefix}», «${var%suffix}», and «$( cmd )»; +# * compound commands having a testable exit status, especially «case»; +# * various built-in commands including «command», «set», and «ulimit». +# +# Important for patching: +# +# (2) This script targets any POSIX shell, so it avoids extensions provided +# by Bash, Ksh, etc; in particular arrays are avoided. +# +# The "traditional" practice of packing multiple parameters into a +# space-separated string is a well documented source of bugs and security +# problems, so this is (mostly) avoided, by progressively accumulating +# options in "$@", and eventually passing that to Java. +# +# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, +# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; +# see the in-line comments for details. +# +# There are tweaks for specific operating systems such as AIX, CygWin, +# Darwin, MinGW, and NonStop. +# +# (3) This script is generated from the Groovy template +# https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# within the Gradle project. +# +# You can find Gradle at https://github.com/gradle/gradle/. +# +############################################################################## + +# Attempt to set APP_HOME + +# Resolve links: $0 may be a link +app_path=$0 + +# Need this for daisy-chained symlinks. +while + APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path + [ -h "$app_path" ] +do + ls=$( ls -ld "$app_path" ) + link=${ls#*' -> '} + case $link in #( + /*) app_path=$link ;; #( + *) app_path=$APP_HOME$link ;; + esac +done + +APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit + +APP_NAME="Gradle" +APP_BASE_NAME=${0##*/} + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD=maximum + +warn () { + echo "$*" +} >&2 + +die () { + echo + echo "$*" + echo + exit 1 +} >&2 + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "$( uname )" in #( + CYGWIN* ) cygwin=true ;; #( + Darwin* ) darwin=true ;; #( + MSYS* | MINGW* ) msys=true ;; #( + NONSTOP* ) nonstop=true ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD=$JAVA_HOME/jre/sh/java + else + JAVACMD=$JAVA_HOME/bin/java + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD=java + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then + case $MAX_FD in #( + max*) + MAX_FD=$( ulimit -H -n ) || + warn "Could not query maximum file descriptor limit" + esac + case $MAX_FD in #( + '' | soft) :;; #( + *) + ulimit -n "$MAX_FD" || + warn "Could not set maximum file descriptor limit to $MAX_FD" + esac +fi + +# Collect all arguments for the java command, stacking in reverse order: +# * args from the command line +# * the main class name +# * -classpath +# * -D...appname settings +# * --module-path (only if needed) +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. + +# For Cygwin or MSYS, switch paths to Windows format before running java +if "$cygwin" || "$msys" ; then + APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) + CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) + + JAVACMD=$( cygpath --unix "$JAVACMD" ) + + # Now convert the arguments - kludge to limit ourselves to /bin/sh + for arg do + if + case $arg in #( + -*) false ;; # don't mess with options #( + /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath + [ -e "$t" ] ;; #( + *) false ;; + esac + then + arg=$( cygpath --path --ignore --mixed "$arg" ) + fi + # Roll the args list around exactly as many times as the number of + # args, so each arg winds up back in the position where it started, but + # possibly modified. + # + # NB: a `for` loop captures its iteration list before it begins, so + # changing the positional parameters here affects neither the number of + # iterations, nor the values presented in `arg`. + shift # remove old arg + set -- "$@" "$arg" # push replacement arg + done +fi + +# Collect all arguments for the java command; +# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of +# shell script including quotes and variable substitutions, so put them in +# double quotes to make sure that they get re-expanded; and +# * put everything else in single quotes, so that it's not re-expanded. + +set -- \ + "-Dorg.gradle.appname=$APP_BASE_NAME" \ + -classpath "$CLASSPATH" \ + org.gradle.wrapper.GradleWrapperMain \ + "$@" + +# Use "xargs" to parse quoted args. +# +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# + +eval "set -- $( + printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | + xargs -n1 | + sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | + tr '\n' ' ' + )" '"$@"' + +exec "$JAVACMD" "$@" diff --git a/springfox-bean-validators/gradlew.bat b/springfox-bean-validators/gradlew.bat new file mode 100644 index 00000000000..ac1b06f9382 --- /dev/null +++ b/springfox-bean-validators/gradlew.bat @@ -0,0 +1,89 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto execute + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/springfox-boot-starter/.gitignore b/springfox-boot-starter/.gitignore deleted file mode 100644 index 6c018781387..00000000000 --- a/springfox-boot-starter/.gitignore +++ /dev/null @@ -1,32 +0,0 @@ -HELP.md -.gradle -build/ -!gradle/wrapper/gradle-wrapper.jar -!**/src/main/** -!**/src/test/** - -### STS ### -.apt_generated -.classpath -.factorypath -.project -.settings -.springBeans -.sts4-cache - -### IntelliJ IDEA ### -.idea -*.iws -*.iml -*.ipr -out/ - -### NetBeans ### -/nbproject/private/ -/nbbuild/ -/dist/ -/nbdist/ -/.nb-gradle/ - -### VS Code ### -.vscode/ diff --git a/springfox-boot-starter/build.gradle b/springfox-boot-starter/build.gradle deleted file mode 100644 index 1e2b0b15cd0..00000000000 --- a/springfox-boot-starter/build.gradle +++ /dev/null @@ -1,23 +0,0 @@ -group = 'io.springfox' - -repositories { - mavenCentral() -} - -dependencies { - api project(':springfox-oas') - api project(':springfox-data-rest') - api project(':springfox-bean-validators') - api project(':springfox-swagger2') - api project(':springfox-swagger-ui') - api libs.core - api libs.spring - - compileOnly libs.springProvidedWithMvc - compileOnly "org.springframework:spring-webflux:$springWeb" - compileOnly libs.springBootProvided - compileOnly libs.clientProvided - compileOnly "jakarta.servlet:jakarta.servlet-api:$servlet" - annotationProcessor "org.springframework.boot:spring-boot-configuration-processor:3.0.0" - -} diff --git a/springfox-boot-starter/src/main/java/springfox/boot/starter/autoconfigure/OpenApiAutoConfiguration.java b/springfox-boot-starter/src/main/java/springfox/boot/starter/autoconfigure/OpenApiAutoConfiguration.java deleted file mode 100644 index 3e0fb7dbce4..00000000000 --- a/springfox-boot-starter/src/main/java/springfox/boot/starter/autoconfigure/OpenApiAutoConfiguration.java +++ /dev/null @@ -1,32 +0,0 @@ -package springfox.boot.starter.autoconfigure; - -import org.springframework.boot.autoconfigure.AutoConfigureAfter; -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; -import org.springframework.boot.autoconfigure.data.rest.RepositoryRestMvcAutoConfiguration; -import org.springframework.boot.autoconfigure.http.HttpMessageConvertersAutoConfiguration; -import org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration; -import org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration; -import org.springframework.boot.context.properties.EnableConfigurationProperties; -import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.Import; -import springfox.bean.validators.configuration.BeanValidatorPluginsConfiguration; -import springfox.documentation.oas.configuration.OpenApiDocumentationConfiguration; -import springfox.documentation.spring.data.rest.configuration.SpringDataRestConfiguration; -import springfox.documentation.swagger2.configuration.Swagger2DocumentationConfiguration; - -@Configuration -@EnableConfigurationProperties(SpringfoxConfigurationProperties.class) -@ConditionalOnProperty(value = "springfox.documentation.enabled", havingValue = "true", matchIfMissing = true) -@Import({ - OpenApiDocumentationConfiguration.class, - SpringDataRestConfiguration.class, - BeanValidatorPluginsConfiguration.class, - Swagger2DocumentationConfiguration.class, - SwaggerUiWebFluxConfiguration.class, - SwaggerUiWebMvcConfiguration.class -}) -@AutoConfigureAfter({ WebMvcAutoConfiguration.class, JacksonAutoConfiguration.class, - HttpMessageConvertersAutoConfiguration.class, RepositoryRestMvcAutoConfiguration.class }) -public class OpenApiAutoConfiguration { - -} diff --git a/springfox-boot-starter/src/main/java/springfox/boot/starter/autoconfigure/SpringfoxConfigurationProperties.java b/springfox-boot-starter/src/main/java/springfox/boot/starter/autoconfigure/SpringfoxConfigurationProperties.java deleted file mode 100644 index 6d38d5b72c0..00000000000 --- a/springfox-boot-starter/src/main/java/springfox/boot/starter/autoconfigure/SpringfoxConfigurationProperties.java +++ /dev/null @@ -1,178 +0,0 @@ -package springfox.boot.starter.autoconfigure; - -import org.springframework.boot.context.properties.ConfigurationProperties; -import org.springframework.boot.context.properties.NestedConfigurationProperty; - -@ConfigurationProperties("springfox.documentation") -public class SpringfoxConfigurationProperties { - /** - * Flag that indicates if springfox should auto start scanning services - */ - private boolean autoStartup = true; - /** - * Flag that indicates if springfox should scan services to produce specifications. - */ - private boolean enabled = true; - @NestedConfigurationProperty - private SwaggerConfigurationProperties swagger; - @NestedConfigurationProperty - private OpenApiConfigurationProperties openApi; - @NestedConfigurationProperty - private SwaggerUiConfigurationProperties swaggerUi; - - public boolean isAutoStartup() { - return autoStartup; - } - - public void setAutoStartup(boolean autoStartup) { - this.autoStartup = autoStartup; - } - - public boolean isEnabled() { - return enabled; - } - - public void setEnabled(boolean enabled) { - this.enabled = enabled; - } - - public SwaggerConfigurationProperties getSwagger() { - return swagger; - } - - public void setSwagger(SwaggerConfigurationProperties swagger) { - this.swagger = swagger; - } - - public OpenApiConfigurationProperties getOpenApi() { - return openApi; - } - - public void setOpenApi(OpenApiConfigurationProperties openApi) { - this.openApi = openApi; - } - - public SwaggerUiConfigurationProperties getSwaggerUi() { - return swaggerUi; - } - - public void setSwaggerUi(SwaggerUiConfigurationProperties swaggerUi) { - this.swaggerUi = swaggerUi; - } - - /** - * Configuration properties related to swagger specification. - * - * @since 3.0.0 - */ - public static class SwaggerConfigurationProperties { - @NestedConfigurationProperty - private Swagger2Configuration v2; - - public Swagger2Configuration getV2() { - return v2; - } - - public void setV2(Swagger2Configuration v2) { - this.v2 = v2; - } - - } - - /** - * Configuration properties related to swagger 2.0 specification. - * - * @since 3.0.0 - */ - public static class Swagger2Configuration { - /** - * Flag that disables swagger 2 related beans - */ - private boolean enabled = false; - /** - * Flag that toggles between generating models using v3.0.0 of the library or the 2.9.x version of the library. - * This flag can be changed to false, if v3.0.0 is not working as expected. - */ - private boolean useModelV3 = true; - /** - * Host name to use for swagger 2 specification - */ - private String host; - - public String getHost() { - return host; - } - - public void setHost(String host) { - this.host = host; - } - - public boolean isEnabled() { - return enabled; - } - - public void setEnabled(boolean enabled) { - this.enabled = enabled; - } - - public boolean isUseModelV3() { - return useModelV3; - } - - public void setUseModelV3(boolean useModelV3) { - this.useModelV3 = useModelV3; - } - } - /** - * Configuration properties related to OpenApi 3.0 specification. - * - * @since 3.0.0 - */ - public static class OpenApiConfigurationProperties { - /** - * Flag that disables openApi related beans - */ - private boolean enabled = true; - - public boolean isEnabled() { - return enabled; - } - - public void setEnabled(boolean enabled) { - this.enabled = enabled; - } - } - - /** - * Configuration properties related to swagger-ui specification. - * - * @since 3.0.0 - */ - public static class SwaggerUiConfigurationProperties { - /** - * Flag that disables swagger-ui from being resource-handled. No swagger-ui when this is false. - */ - private boolean enabled = true; - /** - * Base url for swagger-ui. For e.g. setting it to /documentation will put swagger-ui - * at /documentation/swagger-ui/index.html - */ - private String baseUrl = ""; - - public boolean isEnabled() { - return enabled; - } - - public void setEnabled(boolean enabled) { - this.enabled = enabled; - } - - public String getBaseUrl() { - return baseUrl; - } - - public void setBaseUrl(String baseUrl) { - this.baseUrl = baseUrl; - } - } -} diff --git a/springfox-boot-starter/src/main/java/springfox/boot/starter/autoconfigure/SwaggerUiWebFluxConfiguration.java b/springfox-boot-starter/src/main/java/springfox/boot/starter/autoconfigure/SwaggerUiWebFluxConfiguration.java deleted file mode 100644 index 91ec8c0076c..00000000000 --- a/springfox-boot-starter/src/main/java/springfox/boot/starter/autoconfigure/SwaggerUiWebFluxConfiguration.java +++ /dev/null @@ -1,52 +0,0 @@ -package springfox.boot.starter.autoconfigure; - -import org.springframework.beans.factory.annotation.Value; -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; -import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication; -import org.springframework.context.annotation.Bean; -import org.springframework.util.StringUtils; -import org.springframework.web.server.ServerWebExchange; -import org.springframework.web.server.WebFilter; -import org.springframework.web.server.WebFilterChain; -import reactor.core.publisher.Mono; - -import static springfox.documentation.builders.BuilderDefaults.*; - -@ConditionalOnWebApplication(type = ConditionalOnWebApplication.Type.REACTIVE) -@ConditionalOnProperty( - value = "springfox.documentation.swagger-ui.enabled", - havingValue = "true", - matchIfMissing = true) -public class SwaggerUiWebFluxConfiguration { - @Value("${springfox.documentation.swagger-ui.base-url:}") - private String swaggerBaseUrl; - - @Bean - public SwaggerUiWebFluxConfigurer swaggerUiWebfluxConfigurer() { - return new SwaggerUiWebFluxConfigurer(fixup(swaggerBaseUrl)); - } - - @Bean - public WebFilter uiForwarder() { - return new CustomWebFilter(); - } - - private String fixup(String swaggerBaseUrl) { - return StringUtils.trimTrailingCharacter(nullToEmpty(swaggerBaseUrl), '/'); - } - - private static class CustomWebFilter implements WebFilter { - @Override - public Mono filter(ServerWebExchange exchange, WebFilterChain chain) { - String path = exchange.getRequest().getURI().getPath(); - if (path.matches(".*/swagger-ui/")) { - return chain.filter(exchange.mutate().request(exchange.getRequest() - .mutate() - .path(StringUtils.trimTrailingCharacter(path, '/') + "/index.html") - .build()) - .build()); - } - return chain.filter(exchange); - } - } -} diff --git a/springfox-boot-starter/src/main/java/springfox/boot/starter/autoconfigure/SwaggerUiWebFluxConfigurer.java b/springfox-boot-starter/src/main/java/springfox/boot/starter/autoconfigure/SwaggerUiWebFluxConfigurer.java deleted file mode 100644 index 81deaace31f..00000000000 --- a/springfox-boot-starter/src/main/java/springfox/boot/starter/autoconfigure/SwaggerUiWebFluxConfigurer.java +++ /dev/null @@ -1,24 +0,0 @@ -package springfox.boot.starter.autoconfigure; - -import org.springframework.util.StringUtils; -import org.springframework.web.reactive.config.ResourceHandlerRegistry; -import org.springframework.web.reactive.config.WebFluxConfigurer; - -// tag::swagger-ui-configurer[] -public class SwaggerUiWebFluxConfigurer implements WebFluxConfigurer { - private final String baseUrl; - - public SwaggerUiWebFluxConfigurer(String baseUrl) { - this.baseUrl = baseUrl; - } - - @Override - public void addResourceHandlers(ResourceHandlerRegistry registry) { - String baseUrl = StringUtils.trimTrailingCharacter(this.baseUrl, '/'); - registry. - addResourceHandler(baseUrl + "/swagger-ui/**") - .addResourceLocations("classpath:/META-INF/resources/webjars/springfox-swagger-ui/") - .resourceChain(false); - } -} -// end::swagger-ui-configurer[] diff --git a/springfox-boot-starter/src/main/java/springfox/boot/starter/autoconfigure/SwaggerUiWebMvcConfiguration.java b/springfox-boot-starter/src/main/java/springfox/boot/starter/autoconfigure/SwaggerUiWebMvcConfiguration.java deleted file mode 100644 index 489bf07471a..00000000000 --- a/springfox-boot-starter/src/main/java/springfox/boot/starter/autoconfigure/SwaggerUiWebMvcConfiguration.java +++ /dev/null @@ -1,30 +0,0 @@ -package springfox.boot.starter.autoconfigure; - -import org.springframework.beans.factory.annotation.Value; -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; -import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.util.StringUtils; - -import static springfox.documentation.builders.BuilderDefaults.*; - -@Configuration -@ConditionalOnWebApplication(type = ConditionalOnWebApplication.Type.SERVLET) -@ConditionalOnProperty( - value = "springfox.documentation.swagger-ui.enabled", - havingValue = "true", - matchIfMissing = true) -public class SwaggerUiWebMvcConfiguration { - @Value("${springfox.documentation.swagger-ui.base-url:}") - private String swaggerBaseUrl; - - @Bean - public SwaggerUiWebMvcConfigurer swaggerUiConfigurer() { - return new SwaggerUiWebMvcConfigurer(fixup(swaggerBaseUrl)); - } - - private String fixup(String swaggerBaseUrl) { - return StringUtils.trimTrailingCharacter(nullToEmpty(swaggerBaseUrl), '/'); - } -} diff --git a/springfox-boot-starter/src/main/java/springfox/boot/starter/autoconfigure/SwaggerUiWebMvcConfigurer.java b/springfox-boot-starter/src/main/java/springfox/boot/starter/autoconfigure/SwaggerUiWebMvcConfigurer.java deleted file mode 100644 index 9462a059461..00000000000 --- a/springfox-boot-starter/src/main/java/springfox/boot/starter/autoconfigure/SwaggerUiWebMvcConfigurer.java +++ /dev/null @@ -1,31 +0,0 @@ -package springfox.boot.starter.autoconfigure; - -import org.springframework.util.StringUtils; -import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; -import org.springframework.web.servlet.config.annotation.ViewControllerRegistry; -import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; - -// tag::swagger-ui-configurer[] -public class SwaggerUiWebMvcConfigurer implements WebMvcConfigurer { - private final String baseUrl; - - public SwaggerUiWebMvcConfigurer(String baseUrl) { - this.baseUrl = baseUrl; - } - - @Override - public void addResourceHandlers(ResourceHandlerRegistry registry) { - String baseUrl = StringUtils.trimTrailingCharacter(this.baseUrl, '/'); - registry. - addResourceHandler(baseUrl + "/swagger-ui/**") - .addResourceLocations("classpath:/META-INF/resources/webjars/springfox-swagger-ui/") - .resourceChain(false); - } - - @Override - public void addViewControllers(ViewControllerRegistry registry) { - registry.addViewController(baseUrl + "/swagger-ui/") - .setViewName("forward:" + baseUrl + "/swagger-ui/index.html"); - } -} -// end::swagger-ui-configurer[] diff --git a/springfox-boot-starter/src/main/resources/META-INF/spring.factories b/springfox-boot-starter/src/main/resources/META-INF/spring.factories deleted file mode 100644 index adc2d0a1656..00000000000 --- a/springfox-boot-starter/src/main/resources/META-INF/spring.factories +++ /dev/null @@ -1,3 +0,0 @@ -# Auto Configure -org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ -springfox.boot.starter.autoconfigure.OpenApiAutoConfiguration diff --git a/springfox-core/build.gradle b/springfox-core/build.gradle index d3a44b59741..b7b410f4e7d 100644 --- a/springfox-core/build.gradle +++ b/springfox-core/build.gradle @@ -22,4 +22,4 @@ dependencies { testImplementation "jakarta.servlet:jakarta.servlet-api:$servlet" testImplementation libs.springProvidedWithMvc -} \ No newline at end of file +} diff --git a/springfox-core/gradle/wrapper/gradle-wrapper.jar b/springfox-core/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..41d9927a4d4fb3f96a785543079b8df6723c946b GIT binary patch literal 59821 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 literal 0 HcmV?d00001 diff --git a/springfox-core/gradle/wrapper/gradle-wrapper.properties b/springfox-core/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 00000000000..41dfb87909a --- /dev/null +++ b/springfox-core/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,5 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-7.4-bin.zip +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/springfox-core/gradlew b/springfox-core/gradlew new file mode 100755 index 00000000000..1b6c787337f --- /dev/null +++ b/springfox-core/gradlew @@ -0,0 +1,234 @@ +#!/bin/sh + +# +# Copyright © 2015-2021 the original authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +############################################################################## +# +# Gradle start up script for POSIX generated by Gradle. +# +# Important for running: +# +# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is +# noncompliant, but you have some other compliant shell such as ksh or +# bash, then to run this script, type that shell name before the whole +# command line, like: +# +# ksh Gradle +# +# Busybox and similar reduced shells will NOT work, because this script +# requires all of these POSIX shell features: +# * functions; +# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», +# «${var#prefix}», «${var%suffix}», and «$( cmd )»; +# * compound commands having a testable exit status, especially «case»; +# * various built-in commands including «command», «set», and «ulimit». +# +# Important for patching: +# +# (2) This script targets any POSIX shell, so it avoids extensions provided +# by Bash, Ksh, etc; in particular arrays are avoided. +# +# The "traditional" practice of packing multiple parameters into a +# space-separated string is a well documented source of bugs and security +# problems, so this is (mostly) avoided, by progressively accumulating +# options in "$@", and eventually passing that to Java. +# +# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, +# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; +# see the in-line comments for details. +# +# There are tweaks for specific operating systems such as AIX, CygWin, +# Darwin, MinGW, and NonStop. +# +# (3) This script is generated from the Groovy template +# https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# within the Gradle project. +# +# You can find Gradle at https://github.com/gradle/gradle/. +# +############################################################################## + +# Attempt to set APP_HOME + +# Resolve links: $0 may be a link +app_path=$0 + +# Need this for daisy-chained symlinks. +while + APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path + [ -h "$app_path" ] +do + ls=$( ls -ld "$app_path" ) + link=${ls#*' -> '} + case $link in #( + /*) app_path=$link ;; #( + *) app_path=$APP_HOME$link ;; + esac +done + +APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit + +APP_NAME="Gradle" +APP_BASE_NAME=${0##*/} + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD=maximum + +warn () { + echo "$*" +} >&2 + +die () { + echo + echo "$*" + echo + exit 1 +} >&2 + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "$( uname )" in #( + CYGWIN* ) cygwin=true ;; #( + Darwin* ) darwin=true ;; #( + MSYS* | MINGW* ) msys=true ;; #( + NONSTOP* ) nonstop=true ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD=$JAVA_HOME/jre/sh/java + else + JAVACMD=$JAVA_HOME/bin/java + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD=java + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then + case $MAX_FD in #( + max*) + MAX_FD=$( ulimit -H -n ) || + warn "Could not query maximum file descriptor limit" + esac + case $MAX_FD in #( + '' | soft) :;; #( + *) + ulimit -n "$MAX_FD" || + warn "Could not set maximum file descriptor limit to $MAX_FD" + esac +fi + +# Collect all arguments for the java command, stacking in reverse order: +# * args from the command line +# * the main class name +# * -classpath +# * -D...appname settings +# * --module-path (only if needed) +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. + +# For Cygwin or MSYS, switch paths to Windows format before running java +if "$cygwin" || "$msys" ; then + APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) + CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) + + JAVACMD=$( cygpath --unix "$JAVACMD" ) + + # Now convert the arguments - kludge to limit ourselves to /bin/sh + for arg do + if + case $arg in #( + -*) false ;; # don't mess with options #( + /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath + [ -e "$t" ] ;; #( + *) false ;; + esac + then + arg=$( cygpath --path --ignore --mixed "$arg" ) + fi + # Roll the args list around exactly as many times as the number of + # args, so each arg winds up back in the position where it started, but + # possibly modified. + # + # NB: a `for` loop captures its iteration list before it begins, so + # changing the positional parameters here affects neither the number of + # iterations, nor the values presented in `arg`. + shift # remove old arg + set -- "$@" "$arg" # push replacement arg + done +fi + +# Collect all arguments for the java command; +# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of +# shell script including quotes and variable substitutions, so put them in +# double quotes to make sure that they get re-expanded; and +# * put everything else in single quotes, so that it's not re-expanded. + +set -- \ + "-Dorg.gradle.appname=$APP_BASE_NAME" \ + -classpath "$CLASSPATH" \ + org.gradle.wrapper.GradleWrapperMain \ + "$@" + +# Use "xargs" to parse quoted args. +# +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# + +eval "set -- $( + printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | + xargs -n1 | + sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | + tr '\n' ' ' + )" '"$@"' + +exec "$JAVACMD" "$@" diff --git a/springfox-core/gradlew.bat b/springfox-core/gradlew.bat new file mode 100644 index 00000000000..ac1b06f9382 --- /dev/null +++ b/springfox-core/gradlew.bat @@ -0,0 +1,89 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto execute + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/springfox-core/src/test/java/springfox/documentation/schema/XmlTest.java b/springfox-core/src/test/java/springfox/documentation/schema/XmlTest.java deleted file mode 100644 index 84322464cc7..00000000000 --- a/springfox-core/src/test/java/springfox/documentation/schema/XmlTest.java +++ /dev/null @@ -1,44 +0,0 @@ -/* - * - * Copyright 2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.schema; - -import nl.jqno.equalsverifier.EqualsVerifier; -import nl.jqno.equalsverifier.Warning; -import org.junit.Test; - -import static org.hamcrest.CoreMatchers.is; -import static org.junit.Assert.*; - -/** - * @author Nikolai Iusiumbeli - * date: 12/08/2017 - */ -public class XmlTest { - @Test - public void equalsHashCodeContractTest() throws Exception { - Xml xml1 = new Xml().name("1").attribute(true).namespace("2").prefix("3").wrapped(true); - Xml xml2 = new Xml().name("1").attribute(true).namespace("2").prefix("3").wrapped(true); - assertThat(xml1, is(xml2)); - EqualsVerifier.forClass(Xml.class) - .suppress(Warning.NONFINAL_FIELDS) - .usingGetClass() - .verify(); - } -} \ No newline at end of file diff --git a/springfox-data-rest/build.gradle b/springfox-data-rest/build.gradle deleted file mode 100644 index e1f60ffccfc..00000000000 --- a/springfox-data-rest/build.gradle +++ /dev/null @@ -1,28 +0,0 @@ -ext { - limits = [ - 'instruction': 100, - 'branch' : 100, - 'line' : 100, - 'complexity' : 100, - 'method' : 100, - 'class' : 100 - ] -} - -dependencies { - api libs.core - api libs.spring - api project(':springfox-spi') - api project(':springfox-core') - api project(':springfox-spring-webmvc') - - compileOnly "org.springframework.data:spring-data-rest-webmvc:$springDataRest" - compileOnly "org.springframework.hateoas:spring-hateoas:${springHateoas}" - compileOnly libs.springBootProvided - - compileOnly libs.springProvidedWithMvc - compileOnly "jakarta.servlet:jakarta.servlet-api:$servlet" - - testImplementation libs.test -} - diff --git a/springfox-data-rest/src/main/java/springfox/documentation/spring/data/rest/ActionSpecification.java b/springfox-data-rest/src/main/java/springfox/documentation/spring/data/rest/ActionSpecification.java deleted file mode 100644 index 2c184ed519f..00000000000 --- a/springfox-data-rest/src/main/java/springfox/documentation/spring/data/rest/ActionSpecification.java +++ /dev/null @@ -1,109 +0,0 @@ -/* - * - * Copyright 2017-2019 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ -package springfox.documentation.spring.data.rest; - -import com.fasterxml.classmate.ResolvedType; -import org.springframework.aop.support.AopUtils; -import org.springframework.http.MediaType; -import org.springframework.web.bind.annotation.RequestMethod; -import org.springframework.web.method.HandlerMethod; -import springfox.documentation.service.ResolvedMethodParameter; - -import java.util.Collection; -import java.util.List; -import java.util.Optional; -import java.util.Set; - -import static java.util.Optional.*; - -class ActionSpecification { - private final Collection supportedMethods; - private final Set produces; - private final Set consumes; - private final List parameters; - private final ResolvedType returnType; - private final HandlerMethod handlerMethod; - private final Class entityType; - private final String name; - private final String path; - - @SuppressWarnings("ParameterNumber") - ActionSpecification( - String name, - String path, - Collection supportedMethods, - Set produces, - Set consumes, - HandlerMethod handlerMethod, - Class entityType, - List parameters, - ResolvedType returnType) { - this.name = name; - this.path = path; - this.supportedMethods = supportedMethods; - this.produces = produces; - this.consumes = consumes; - this.parameters = parameters; - this.returnType = returnType; - this.handlerMethod = handlerMethod; - this.entityType = entityType; - } - - public String getName() { - return name; - } - - public String getPath() { - return path; - } - - public Collection getSupportedMethods() { - return supportedMethods; - } - - public Set getProduces() { - return produces; - } - - public Set getConsumes() { - return consumes; - } - - public List getParameters() { - return parameters; - } - - public ResolvedType getReturnType() { - return returnType; - } - - public Optional getHandlerMethod() { - return ofNullable(handlerMethod); - } - - public Optional> getDeclaringClass() { - return Optional.ofNullable(getHandlerMethod().map(input -> { - Object bean = new OptionalDeferencer<>().convert(handlerMethod.getBean()); - if (AopUtils.isAopProxy(bean)) { - return AopUtils.getTargetClass(bean); - } - return (Class) bean; - }).orElse(entityType)); - } -} diff --git a/springfox-data-rest/src/main/java/springfox/documentation/spring/data/rest/BasePathAwareServicesProvider.java b/springfox-data-rest/src/main/java/springfox/documentation/spring/data/rest/BasePathAwareServicesProvider.java deleted file mode 100644 index e62204bee6f..00000000000 --- a/springfox-data-rest/src/main/java/springfox/documentation/spring/data/rest/BasePathAwareServicesProvider.java +++ /dev/null @@ -1,86 +0,0 @@ -/* - * - * Copyright 2017-2019 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ -package springfox.documentation.spring.data.rest; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.ApplicationContext; -import org.springframework.data.rest.core.config.RepositoryRestConfiguration; -import org.springframework.data.rest.webmvc.BasePathAwareHandlerMapping; -import org.springframework.data.rest.webmvc.alps.AlpsController; -import org.springframework.stereotype.Component; -import org.springframework.web.method.HandlerMethod; -import org.springframework.web.servlet.mvc.method.RequestMappingInfo; -import springfox.documentation.RequestHandler; -import springfox.documentation.spi.service.RequestHandlerProvider; -import springfox.documentation.spring.web.WebMvcRequestHandler; -import springfox.documentation.spring.web.readers.operation.HandlerMethodResolver; - -import jakarta.servlet.ServletContext; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -import static springfox.documentation.spring.web.paths.Paths.*; - -@Component -public class BasePathAwareServicesProvider implements RequestHandlerProvider { - private final BasePathAwareHandlerMapping basePathAwareMappings; - private final HandlerMethodResolver methodResolver; - private final String contextPath; - - @Autowired - public BasePathAwareServicesProvider( - RepositoryRestConfiguration repositoryConfiguration, - ApplicationContext applicationContext, - HandlerMethodResolver methodResolver, - ServletContext servletContext) { - basePathAwareMappings = new BasePathAwareHandlerMapping(repositoryConfiguration); - this.methodResolver = methodResolver; - basePathAwareMappings.setApplicationContext(applicationContext); - basePathAwareMappings.afterPropertiesSet(); - contextPath = contextPath(servletContext.getContextPath()); - } - - @SuppressWarnings("java:S1872") - private static boolean isEntitySchemaService(HandlerMethod input) { - //For ensuring this bean is in the path (version conflict) - return input.getBeanType().getSimpleName().equals("RepositorySchemaController"); - } - - private static boolean isAlpsProfileServices(HandlerMethod input) { - return AlpsController.class.equals(input.getBeanType()); - } - - @Override - public List requestHandlers() { - List requestHandlers = new ArrayList<>(); - for (Map.Entry each : basePathAwareMappings.getHandlerMethods().entrySet()) { - if (!isEntitySchemaService(each.getValue()) - && !isAlpsProfileServices(each.getValue())) { - requestHandlers.add( - new WebMvcRequestHandler( - contextPath, - methodResolver, - each.getKey(), - each.getValue())); - } - } - return requestHandlers; - } -} diff --git a/springfox-data-rest/src/main/java/springfox/documentation/spring/data/rest/DefaultExtractorConfiguration.java b/springfox-data-rest/src/main/java/springfox/documentation/spring/data/rest/DefaultExtractorConfiguration.java deleted file mode 100644 index 129f91bcc83..00000000000 --- a/springfox-data-rest/src/main/java/springfox/documentation/spring/data/rest/DefaultExtractorConfiguration.java +++ /dev/null @@ -1,54 +0,0 @@ -/* - * - * Copyright 2017-2019 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ -package springfox.documentation.spring.data.rest; - -import java.util.List; -import java.util.stream.Stream; - -import static java.util.stream.Collectors.*; - -class DefaultExtractorConfiguration implements RequestHandlerExtractorConfiguration { - private final List defaultEntityExtractors = Stream.of( - new EntitySaveExtractor(), - new EntityDeleteExtractor(), - new EntityFindOneExtractor(), - new EntityFindAllExtractor(), - new EntitySearchExtractor(), - new EntityAssociationsExtractor() - ).collect(toList()); - - - private final List defaultAssociationExtractors = Stream.of( - new EntityAssociationSaveExtractor(), - new EntityAssociationDeleteExtractor(), - new EntityAssociationGetExtractor(), - new EntityAssociationItemGetExtractor(), - new EntityAssociationItemDeleteExtractor() - ).collect(toList()); - - @Override - public List getEntityExtractors() { - return defaultEntityExtractors; - } - - @Override - public List getAssociationExtractors() { - return defaultAssociationExtractors; - } -} diff --git a/springfox-data-rest/src/main/java/springfox/documentation/spring/data/rest/EntityAssociationContext.java b/springfox-data-rest/src/main/java/springfox/documentation/spring/data/rest/EntityAssociationContext.java deleted file mode 100644 index faec5516e6e..00000000000 --- a/springfox-data-rest/src/main/java/springfox/documentation/spring/data/rest/EntityAssociationContext.java +++ /dev/null @@ -1,52 +0,0 @@ -/* - * - * Copyright 2017-2019 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ -package springfox.documentation.spring.data.rest; - -import java.util.Optional; -import org.springframework.data.mapping.Association; -import org.springframework.data.mapping.PersistentEntity; -import org.springframework.data.mapping.PersistentProperty; -import org.springframework.data.rest.core.mapping.ResourceMetadata; - -public class EntityAssociationContext { - private final EntityContext entityContext; - private final Association> association; - - public EntityAssociationContext( - EntityContext entityContext, - Association> association) { - this.entityContext = entityContext; - this.association = association; - } - - public EntityContext getEntityContext() { - return entityContext; - } - - - public Association> getAssociation() { - return association; - } - - public Optional associationMetadata() { - return entityContext.entity() - .map(PersistentEntity::getType) - .map(clazz -> entityContext.getAssociations().getMetadataFor(clazz)); - } -} diff --git a/springfox-data-rest/src/main/java/springfox/documentation/spring/data/rest/EntityAssociationDeleteExtractor.java b/springfox-data-rest/src/main/java/springfox/documentation/spring/data/rest/EntityAssociationDeleteExtractor.java deleted file mode 100644 index 510acce614b..00000000000 --- a/springfox-data-rest/src/main/java/springfox/documentation/spring/data/rest/EntityAssociationDeleteExtractor.java +++ /dev/null @@ -1,63 +0,0 @@ -/* - * - * Copyright 2017-2019 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ -package springfox.documentation.spring.data.rest; - -import org.springframework.data.mapping.PersistentProperty; -import org.springframework.data.rest.core.Path; -import org.springframework.data.rest.core.mapping.ResourceMapping; -import springfox.documentation.RequestHandler; -import springfox.documentation.spring.data.rest.SpecificationBuilder.*; - -import java.util.ArrayList; -import java.util.List; - -import static org.springframework.data.rest.webmvc.RestMediaTypes.*; -import static org.springframework.web.bind.annotation.RequestMethod.*; -import static springfox.documentation.spring.data.rest.SpecificationBuilder.*; - -public class EntityAssociationDeleteExtractor implements EntityAssociationOperationsExtractor { - @Override - public List extract(EntityAssociationContext context) { - - List handlers = new ArrayList<>(); - PersistentProperty property = context.getAssociation().getInverse(); - - String mappingPath = context.associationMetadata() - .map(metadata -> metadata.getMappingFor(property)) - .map(ResourceMapping::getPath) - .map(Path::toString) - .orElse(""); - - String path = String.format("%s%s/{id}/%s", - context.getEntityContext().basePath(), - context.getEntityContext().resourcePath(), - mappingPath); - - associationAction(context, path) - .supportsMethod(DELETE) - .consumes(TEXT_URI_LIST) - .consumes(SPRING_DATA_COMPACT_JSON) - .parameterType(ParameterType.ID) - .build() - .map(delete -> new SpringDataRestRequestHandler(context.getEntityContext(), delete)) - .ifPresent(handlers::add); - - return handlers; - } -} diff --git a/springfox-data-rest/src/main/java/springfox/documentation/spring/data/rest/EntityAssociationGetExtractor.java b/springfox-data-rest/src/main/java/springfox/documentation/spring/data/rest/EntityAssociationGetExtractor.java deleted file mode 100644 index aeb2254c8d2..00000000000 --- a/springfox-data-rest/src/main/java/springfox/documentation/spring/data/rest/EntityAssociationGetExtractor.java +++ /dev/null @@ -1,62 +0,0 @@ -/* - * - * Copyright 2017-2019 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ -package springfox.documentation.spring.data.rest; - -import org.springframework.data.mapping.PersistentProperty; -import org.springframework.data.rest.core.Path; -import org.springframework.data.rest.core.mapping.ResourceMapping; -import springfox.documentation.RequestHandler; -import springfox.documentation.spring.data.rest.SpecificationBuilder.*; - -import java.util.ArrayList; -import java.util.List; - -import static org.springframework.data.rest.webmvc.RestMediaTypes.*; -import static org.springframework.web.bind.annotation.RequestMethod.*; -import static springfox.documentation.spring.data.rest.SpecificationBuilder.*; - -public class EntityAssociationGetExtractor implements EntityAssociationOperationsExtractor { - @Override - public List extract(EntityAssociationContext context) { - - List handlers = new ArrayList<>(); - PersistentProperty property = context.getAssociation().getInverse(); - - String mappingPath = context.associationMetadata() - .map(metadata -> metadata.getMappingFor(property)) - .map(ResourceMapping::getPath) - .map(Path::toString) - .orElse(""); - - String path = String.format("%s%s/{id}/%s", - context.getEntityContext().basePath(), - context.getEntityContext().resourcePath(), - mappingPath); - - associationAction(context, path) - .supportsMethod(GET) - .produces(HAL_JSON) - .parameterType(ParameterType.ID) - .build() - .map(get -> new SpringDataRestRequestHandler(context.getEntityContext(), get)) - .ifPresent(handlers::add); - - return handlers; - } -} diff --git a/springfox-data-rest/src/main/java/springfox/documentation/spring/data/rest/EntityAssociationItemDeleteExtractor.java b/springfox-data-rest/src/main/java/springfox/documentation/spring/data/rest/EntityAssociationItemDeleteExtractor.java deleted file mode 100644 index fbb8481005c..00000000000 --- a/springfox-data-rest/src/main/java/springfox/documentation/spring/data/rest/EntityAssociationItemDeleteExtractor.java +++ /dev/null @@ -1,70 +0,0 @@ -/* - * - * Copyright 2017-2019 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ -package springfox.documentation.spring.data.rest; - -import org.springframework.data.mapping.PersistentProperty; -import org.springframework.data.rest.core.Path; -import org.springframework.data.rest.core.mapping.ResourceMapping; -import springfox.documentation.RequestHandler; - -import java.util.ArrayList; -import java.util.List; - -import static org.springframework.data.rest.webmvc.RestMediaTypes.*; -import static org.springframework.web.bind.annotation.RequestMethod.*; -import static springfox.documentation.spring.data.rest.RequestExtractionUtils.*; -import static springfox.documentation.spring.data.rest.SpecificationBuilder.ParameterType.*; -import static springfox.documentation.spring.data.rest.SpecificationBuilder.*; - -public class EntityAssociationItemDeleteExtractor implements EntityAssociationOperationsExtractor { - @Override - public List extract(EntityAssociationContext context) { - - List handlers = new ArrayList<>(); - PersistentProperty property = context.getAssociation().getInverse(); - String propertyIdentifier = propertyIdentifierName(property); - - String mappingPath = context.associationMetadata() - .map(metadata -> metadata.getMappingFor(property)) - .map(ResourceMapping::getPath) - .map(Path::toString) - .orElse(""); - - String path = String.format("%s%s/{id}/%s/{%s}", - context.getEntityContext().basePath(), - context.getEntityContext().resourcePath(), - mappingPath, - propertyIdentifier); - - if (property.isMap() || property.isCollectionLike()) { - - associationAction(context, path) - .supportsMethod(DELETE) - .consumes(TEXT_URI_LIST) - .consumes(SPRING_DATA_COMPACT_JSON) - .parameterType(ID) - .parameterType(ASSOCIATION) - .build() - .map(deleteItem -> new SpringDataRestRequestHandler(context.getEntityContext(), deleteItem)) - .ifPresent(handlers::add); - - } - return handlers; - } -} diff --git a/springfox-data-rest/src/main/java/springfox/documentation/spring/data/rest/EntityAssociationItemGetExtractor.java b/springfox-data-rest/src/main/java/springfox/documentation/spring/data/rest/EntityAssociationItemGetExtractor.java deleted file mode 100644 index 366a5b9ed8c..00000000000 --- a/springfox-data-rest/src/main/java/springfox/documentation/spring/data/rest/EntityAssociationItemGetExtractor.java +++ /dev/null @@ -1,69 +0,0 @@ -/* - * - * Copyright 2017-2019 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ -package springfox.documentation.spring.data.rest; - -import org.springframework.data.mapping.PersistentProperty; -import org.springframework.data.rest.core.Path; -import org.springframework.data.rest.core.mapping.ResourceMapping; -import springfox.documentation.RequestHandler; - -import java.util.ArrayList; -import java.util.List; - -import static org.springframework.data.rest.webmvc.RestMediaTypes.*; -import static org.springframework.web.bind.annotation.RequestMethod.*; -import static springfox.documentation.spring.data.rest.RequestExtractionUtils.*; -import static springfox.documentation.spring.data.rest.SpecificationBuilder.ParameterType.*; -import static springfox.documentation.spring.data.rest.SpecificationBuilder.*; - -public class EntityAssociationItemGetExtractor implements EntityAssociationOperationsExtractor { - @Override - public List extract(EntityAssociationContext context) { - - List handlers = new ArrayList<>(); - PersistentProperty property = context.getAssociation().getInverse(); - String propertyIdentifier = propertyIdentifierName(property); - - String mappingPath = context.associationMetadata() - .map(metadata -> metadata.getMappingFor(property)) - .map(ResourceMapping::getPath) - .map(Path::toString) - .orElse(""); - - String path = String.format("%s%s/{id}/%s/{%s}", - context.getEntityContext().basePath(), - context.getEntityContext().resourcePath(), - mappingPath, - propertyIdentifier); - - if (property.isMap() || property.isCollectionLike()) { - - associationAction(context, path) - .supportsMethod(GET) - .consumes(HAL_JSON) - .parameterType(ID) - .parameterType(ASSOCIATION) - .build() - .map(getPropertyItem -> new SpringDataRestRequestHandler(context.getEntityContext(), getPropertyItem)) - .ifPresent(handlers::add); - - } - return handlers; - } -} diff --git a/springfox-data-rest/src/main/java/springfox/documentation/spring/data/rest/EntityAssociationOperationsExtractor.java b/springfox-data-rest/src/main/java/springfox/documentation/spring/data/rest/EntityAssociationOperationsExtractor.java deleted file mode 100644 index 1e1a1d7f604..00000000000 --- a/springfox-data-rest/src/main/java/springfox/documentation/spring/data/rest/EntityAssociationOperationsExtractor.java +++ /dev/null @@ -1,27 +0,0 @@ -/* - * - * Copyright 2017-2019 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ -package springfox.documentation.spring.data.rest; - -import springfox.documentation.RequestHandler; - -import java.util.List; - -public interface EntityAssociationOperationsExtractor { - List extract(EntityAssociationContext context); -} diff --git a/springfox-data-rest/src/main/java/springfox/documentation/spring/data/rest/EntityAssociationSaveExtractor.java b/springfox-data-rest/src/main/java/springfox/documentation/spring/data/rest/EntityAssociationSaveExtractor.java deleted file mode 100644 index 947e7b95ce6..00000000000 --- a/springfox-data-rest/src/main/java/springfox/documentation/spring/data/rest/EntityAssociationSaveExtractor.java +++ /dev/null @@ -1,72 +0,0 @@ -/* - * - * Copyright 2017-2019 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ -package springfox.documentation.spring.data.rest; - -import org.springframework.data.mapping.PersistentProperty; -import org.springframework.data.rest.core.Path; -import org.springframework.data.rest.core.mapping.ResourceMapping; -import springfox.documentation.RequestHandler; -import springfox.documentation.spring.data.rest.SpecificationBuilder.*; - -import java.util.ArrayList; -import java.util.List; - -import static org.springframework.data.rest.webmvc.RestMediaTypes.*; -import static org.springframework.web.bind.annotation.RequestMethod.*; -import static springfox.documentation.spring.data.rest.SpecificationBuilder.*; - -public class EntityAssociationSaveExtractor implements EntityAssociationOperationsExtractor { - @Override - public List extract(EntityAssociationContext context) { - - List handlers = new ArrayList<>(); - PersistentProperty property = context.getAssociation().getInverse(); - - String mappingPath = context.associationMetadata() - .map(metadata -> metadata.getMappingFor(property)) - .map(ResourceMapping::getPath) - .map(Path::toString) - .orElse(""); - - context.getEntityContext().entity() - .filter(entity -> property.isWritable() && property.getOwner().equals(entity)) - .ifPresent(entity -> { - - String path = String.format("%s%s/{id}/%s", - context.getEntityContext().basePath(), - context.getEntityContext().resourcePath(), - mappingPath); - - associationAction(context, path) - .supportsMethod(PUT) - .supportsMethod(PATCH) - .supportsMethod(POST) - .consumes(TEXT_URI_LIST) - .consumes(SPRING_DATA_COMPACT_JSON) - .parameterType(ParameterType.ID) - .parameterType(ParameterType.RESOURCE) - .build() - .map(update -> new SpringDataRestRequestHandler(context.getEntityContext(), update)) - .ifPresent(handlers::add); - - }); - - return handlers; - } -} diff --git a/springfox-data-rest/src/main/java/springfox/documentation/spring/data/rest/EntityAssociationsExtractor.java b/springfox-data-rest/src/main/java/springfox/documentation/spring/data/rest/EntityAssociationsExtractor.java deleted file mode 100644 index a0e5a0ad327..00000000000 --- a/springfox-data-rest/src/main/java/springfox/documentation/spring/data/rest/EntityAssociationsExtractor.java +++ /dev/null @@ -1,52 +0,0 @@ -/* - * - * Copyright 2017-2019 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ -package springfox.documentation.spring.data.rest; - -import org.springframework.data.mapping.SimpleAssociationHandler; -import org.springframework.data.rest.webmvc.mapping.Associations; -import springfox.documentation.RequestHandler; - -import java.util.ArrayList; -import java.util.List; -import java.util.stream.Collectors; - -public class EntityAssociationsExtractor implements EntityOperationsExtractor { - - @Override - public List extract(final EntityContext context) { - - List handlers = new ArrayList<>(); - Associations associations = context.getAssociations(); - - context.entity() - .ifPresent(entity -> entity.doWithAssociations((SimpleAssociationHandler) association -> { - - if (associations.isLinkableAssociation(association)) { - EntityAssociationContext associationContext = new EntityAssociationContext(context, association); - - handlers.addAll(context.getAssociationExtractors().stream() - .flatMap(extractor -> extractor.extract(associationContext).stream()) - .collect(Collectors.toList())); - } - })); - - return handlers; - } - -} diff --git a/springfox-data-rest/src/main/java/springfox/documentation/spring/data/rest/EntityContext.java b/springfox-data-rest/src/main/java/springfox/documentation/spring/data/rest/EntityContext.java deleted file mode 100644 index bb8b6f696d5..00000000000 --- a/springfox-data-rest/src/main/java/springfox/documentation/spring/data/rest/EntityContext.java +++ /dev/null @@ -1,129 +0,0 @@ -/* - * - * Copyright 2017-2019 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ -package springfox.documentation.spring.data.rest; - -import com.fasterxml.classmate.TypeResolver; -import org.springframework.data.mapping.PersistentEntity; -import org.springframework.data.mapping.PersistentProperty; -import org.springframework.data.mapping.context.PersistentEntities; -import org.springframework.data.repository.core.CrudMethods; -import org.springframework.data.repository.core.RepositoryInformation; -import org.springframework.data.repository.core.RepositoryMetadata; -import org.springframework.data.rest.core.Path; -import org.springframework.data.rest.core.config.RepositoryRestConfiguration; -import org.springframework.data.rest.core.mapping.ResourceMappings; -import org.springframework.data.rest.core.mapping.ResourceMetadata; -import org.springframework.data.rest.core.mapping.SearchResourceMappings; -import org.springframework.data.rest.webmvc.mapping.Associations; - -import java.net.URI; -import java.util.Collection; -import java.util.Optional; - -import static springfox.documentation.spring.web.paths.Paths.*; - -public class EntityContext { - private final RepositoryRestConfiguration configuration; - private final RepositoryInformation repository; - private final Object repositoryInstance; - private final ResourceMetadata resource; - private final TypeResolver typeResolver; - private final ResourceMappings mappings; - private final PersistentEntities entities; - private final Associations associations; - private final RequestHandlerExtractorConfiguration extractorConfiguration; - private final String contextPath; - - @SuppressWarnings("ParameterNumber") - public EntityContext( - TypeResolver typeResolver, - String contextPath, - RepositoryRestConfiguration configuration, - RepositoryInformation repository, - Object repositoryInstance, - ResourceMetadata resource, - ResourceMappings mappings, - PersistentEntities entities, - Associations associations, - RequestHandlerExtractorConfiguration extractorConfiguration) { - - this.configuration = configuration; - this.repository = repository; - this.repositoryInstance = repositoryInstance; - this.resource = resource; - this.typeResolver = typeResolver; - this.mappings = mappings; - this.entities = entities; - this.associations = associations; - this.extractorConfiguration = extractorConfiguration; - this.contextPath = contextPath; - } - - public String getName() { - return resource.getDomainType().getSimpleName(); - } - - public Optional>> entity() { - return entities.getPersistentEntity(resource.getDomainType()); - } - - public CrudMethods crudMethods() { - return repository.getCrudMethods(); - } - - public Object getRepositoryInstance() { - return repositoryInstance; - } - - public URI basePath() { - return configuration.getBasePath(); - } - - public Path resourcePath() { - return resource.getPath(); - } - - public TypeResolver getTypeResolver() { - return typeResolver; - } - - public RepositoryMetadata getRepositoryMetadata() { - return repository; - } - - public RepositoryRestConfiguration getConfiguration() { - return configuration; - } - - public SearchResourceMappings searchMappings() { - return mappings.getSearchResourceMappings(repository.getDomainType()); - } - - public Associations getAssociations() { - return associations; - } - - public Collection getAssociationExtractors() { - return extractorConfiguration.getAssociationExtractors(); - } - - public String contextPath() { - return rootPathWhenEmpty(contextPath); - } -} diff --git a/springfox-data-rest/src/main/java/springfox/documentation/spring/data/rest/EntityDeleteExtractor.java b/springfox-data-rest/src/main/java/springfox/documentation/spring/data/rest/EntityDeleteExtractor.java deleted file mode 100644 index 38370bd652a..00000000000 --- a/springfox-data-rest/src/main/java/springfox/documentation/spring/data/rest/EntityDeleteExtractor.java +++ /dev/null @@ -1,54 +0,0 @@ -/* - * - * Copyright 2017-2019 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ -package springfox.documentation.spring.data.rest; - -import org.springframework.web.method.HandlerMethod; -import springfox.documentation.RequestHandler; -import springfox.documentation.spring.data.rest.SpecificationBuilder.*; - -import java.util.ArrayList; -import java.util.List; - -import static org.springframework.web.bind.annotation.RequestMethod.*; -import static springfox.documentation.spring.data.rest.SpecificationBuilder.*; - -class EntityDeleteExtractor implements EntityOperationsExtractor { - @Override - public List extract(EntityContext context) { - List handlers = new ArrayList<>(); - - context.crudMethods().getDeleteMethod() - .map(method -> new HandlerMethod(context.getRepositoryInstance(), method)) - .ifPresent(handler -> { - - entityAction(context, handler) - .path(String.format("%s%s/{id}", - context.basePath(), - context.resourcePath())) - .supportsMethod(DELETE) - .parameterType(ParameterType.ID) - .build() - .map(get -> new SpringDataRestRequestHandler(context, get)) - .ifPresent(handlers::add); - - }); - - return handlers; - } -} diff --git a/springfox-data-rest/src/main/java/springfox/documentation/spring/data/rest/EntityFindAllExtractor.java b/springfox-data-rest/src/main/java/springfox/documentation/spring/data/rest/EntityFindAllExtractor.java deleted file mode 100644 index 8fb66ab894b..00000000000 --- a/springfox-data-rest/src/main/java/springfox/documentation/spring/data/rest/EntityFindAllExtractor.java +++ /dev/null @@ -1,57 +0,0 @@ -/* - * - * Copyright 2017-2019 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ -package springfox.documentation.spring.data.rest; - -import org.springframework.web.method.HandlerMethod; -import springfox.documentation.RequestHandler; -import springfox.documentation.spring.data.rest.SpecificationBuilder.*; - -import java.util.ArrayList; -import java.util.List; - -import static org.springframework.data.rest.webmvc.RestMediaTypes.*; -import static org.springframework.http.MediaType.*; -import static org.springframework.web.bind.annotation.RequestMethod.*; -import static springfox.documentation.spring.data.rest.SpecificationBuilder.*; - -class EntityFindAllExtractor implements EntityOperationsExtractor { - @Override - public List extract(EntityContext context) { - List handlers = new ArrayList<>(); - - context.crudMethods().getFindAllMethod() - .map(method -> new HandlerMethod(context.getRepositoryInstance(), method)) - .ifPresent(handler -> { - - entityAction(context, handler) - .supportsMethod(GET) - .produces(APPLICATION_JSON) - .produces(HAL_JSON) - .produces(SPRING_DATA_COMPACT_JSON) - .produces(TEXT_URI_LIST) - .parameterType(ParameterType.PAGEABLE_RESOURCE) - .build() - .map(get -> new SpringDataRestRequestHandler(context, get)) - .ifPresent(handlers::add); - - }); - - return handlers; - } -} diff --git a/springfox-data-rest/src/main/java/springfox/documentation/spring/data/rest/EntityFindOneExtractor.java b/springfox-data-rest/src/main/java/springfox/documentation/spring/data/rest/EntityFindOneExtractor.java deleted file mode 100644 index 8649f935e3b..00000000000 --- a/springfox-data-rest/src/main/java/springfox/documentation/spring/data/rest/EntityFindOneExtractor.java +++ /dev/null @@ -1,54 +0,0 @@ -/* - * - * Copyright 2017-2019 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ -package springfox.documentation.spring.data.rest; - -import org.springframework.web.method.HandlerMethod; -import springfox.documentation.RequestHandler; -import springfox.documentation.spring.data.rest.SpecificationBuilder.*; - -import java.util.ArrayList; -import java.util.List; - -import static org.springframework.web.bind.annotation.RequestMethod.*; -import static springfox.documentation.spring.data.rest.SpecificationBuilder.*; - -class EntityFindOneExtractor implements EntityOperationsExtractor { - @Override - public List extract(EntityContext context) { - List handlers = new ArrayList<>(); - - context.crudMethods().getFindOneMethod() - .map(method -> new HandlerMethod(context.getRepositoryInstance(), method)) - .ifPresent(handler -> { - - entityAction(context, handler) - .path(String.format("%s%s/{id}", - context.basePath(), - context.resourcePath())) - .supportsMethod(GET) - .parameterType(ParameterType.ID) - .build() - .map(get -> new SpringDataRestRequestHandler(context, get)) - .ifPresent(handlers::add); - - }); - - return handlers; - } -} diff --git a/springfox-data-rest/src/main/java/springfox/documentation/spring/data/rest/EntityOperationsExtractor.java b/springfox-data-rest/src/main/java/springfox/documentation/spring/data/rest/EntityOperationsExtractor.java deleted file mode 100644 index 0ae1aed9067..00000000000 --- a/springfox-data-rest/src/main/java/springfox/documentation/spring/data/rest/EntityOperationsExtractor.java +++ /dev/null @@ -1,27 +0,0 @@ -/* - * - * Copyright 2017-2019 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ -package springfox.documentation.spring.data.rest; - -import springfox.documentation.RequestHandler; - -import java.util.List; - -public interface EntityOperationsExtractor { - List extract(EntityContext context); -} diff --git a/springfox-data-rest/src/main/java/springfox/documentation/spring/data/rest/EntitySaveExtractor.java b/springfox-data-rest/src/main/java/springfox/documentation/spring/data/rest/EntitySaveExtractor.java deleted file mode 100644 index a4fd8d1a2f9..00000000000 --- a/springfox-data-rest/src/main/java/springfox/documentation/spring/data/rest/EntitySaveExtractor.java +++ /dev/null @@ -1,63 +0,0 @@ -/* - * - * Copyright 2017-2019 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ -package springfox.documentation.spring.data.rest; - -import org.springframework.web.method.HandlerMethod; -import springfox.documentation.RequestHandler; -import springfox.documentation.spring.data.rest.SpecificationBuilder.*; - -import java.util.ArrayList; -import java.util.List; - -import static org.springframework.web.bind.annotation.RequestMethod.*; -import static springfox.documentation.spring.data.rest.SpecificationBuilder.*; - -class EntitySaveExtractor implements EntityOperationsExtractor { - @Override - public List extract(EntityContext context) { - List handlers = new ArrayList<>(); - - context.crudMethods().getSaveMethod() - .map(method -> new HandlerMethod(context.getRepositoryInstance(), method)) - .ifPresent(handler -> { - - entityAction(context, handler) - .path(String.format("%s%s/{id}", - context.basePath(), - context.resourcePath())) - .supportsMethod(PUT) - .supportsMethod(PATCH) - .parameterType(ParameterType.ID) - .parameterType(ParameterType.RESOURCE) - .build() - .map(put -> new SpringDataRestRequestHandler(context, put)) - .ifPresent(handlers::add); - - entityAction(context, handler) - .supportsMethod(POST) - .parameterType(ParameterType.RESOURCE) - .build() - .map(post -> new SpringDataRestRequestHandler(context, post)) - .ifPresent(handlers::add); - - }); - - return handlers; - } -} diff --git a/springfox-data-rest/src/main/java/springfox/documentation/spring/data/rest/EntitySearchExtractor.java b/springfox-data-rest/src/main/java/springfox/documentation/spring/data/rest/EntitySearchExtractor.java deleted file mode 100644 index af4a152a0bf..00000000000 --- a/springfox-data-rest/src/main/java/springfox/documentation/spring/data/rest/EntitySearchExtractor.java +++ /dev/null @@ -1,55 +0,0 @@ -/* - * - * Copyright 2017-2019 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ -package springfox.documentation.spring.data.rest; - -import org.springframework.web.method.HandlerMethod; -import springfox.documentation.RequestHandler; - -import java.util.List; -import java.util.Optional; -import java.util.stream.Collectors; -import java.util.stream.StreamSupport; - -import static org.springframework.web.bind.annotation.RequestMethod.*; -import static springfox.documentation.spring.data.rest.SpecificationBuilder.*; - -class EntitySearchExtractor implements EntityOperationsExtractor { - @Override - public List extract(EntityContext context) { - - return StreamSupport.stream(context.searchMappings().getExportedMappings().spliterator(), false) - .map(mapping -> { - - final HandlerMethod handler = new HandlerMethod(context.getRepositoryInstance(), mapping.getMethod()); - - return entityAction(context, handler) - .path(String.format("%s%s/search%s", - context.basePath(), - context.resourcePath(), - mapping.getPath())) - .supportsMethod(GET) - .build() - .map(get -> new SpringDataRestRequestHandler(context, get)); - - }) - .filter(Optional::isPresent) - .map(Optional::get) - .collect(Collectors.toList()); - } -} diff --git a/springfox-data-rest/src/main/java/springfox/documentation/spring/data/rest/EntityServicesProvider.java b/springfox-data-rest/src/main/java/springfox/documentation/spring/data/rest/EntityServicesProvider.java deleted file mode 100644 index a32c9d3b5b1..00000000000 --- a/springfox-data-rest/src/main/java/springfox/documentation/spring/data/rest/EntityServicesProvider.java +++ /dev/null @@ -1,112 +0,0 @@ -/* - * - * Copyright 2017-2019 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ -package springfox.documentation.spring.data.rest; - -import com.fasterxml.classmate.TypeResolver; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.mapping.context.PersistentEntities; -import org.springframework.data.repository.support.Repositories; -import org.springframework.data.rest.core.config.RepositoryRestConfiguration; -import org.springframework.data.rest.core.mapping.ResourceMappings; -import org.springframework.data.rest.core.mapping.ResourceMetadata; -import org.springframework.data.rest.webmvc.mapping.Associations; -import org.springframework.stereotype.Component; -import springfox.documentation.RequestHandler; -import springfox.documentation.spi.service.RequestHandlerProvider; - -import jakarta.servlet.ServletContext; -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; -import java.util.Optional; -import java.util.function.Function; - -import static java.util.stream.Collectors.*; -import static springfox.documentation.spring.web.paths.Paths.*; - -@Component -class EntityServicesProvider implements RequestHandlerProvider { - private final RepositoryRestConfiguration configuration; - private final ResourceMappings mappings; - private final Repositories repositories; - private final TypeResolver typeResolver; - private final PersistentEntities entities; - private final Associations associations; - private final RequestHandlerExtractorConfiguration extractorConfiguration; - private final String contextPath; - - @Autowired - @SuppressWarnings("ParameterNumber") - EntityServicesProvider( - ServletContext servletContext, - RepositoryRestConfiguration configuration, - ResourceMappings mappings, - Repositories repositories, - TypeResolver typeResolver, - PersistentEntities entities, - Associations associations, - Optional extractorConfiguration) { - this.mappings = mappings; - this.configuration = configuration; - this.repositories = repositories; - this.typeResolver = typeResolver; - this.entities = entities; - this.associations = associations; - this.extractorConfiguration = extractorConfiguration.orElse(new DefaultExtractorConfiguration()); - this.contextPath = contextPath(servletContext.getContextPath()); - } - - public List requestHandlers() { - List contexts = new ArrayList<>(); - for (Class each : repositories) { - repositories.getRepositoryInformationFor(each).ifPresent(repositoryInfo -> { - repositories.getRepositoryFor(each).ifPresent(repositoryInstance -> { - ResourceMetadata resource = mappings.getMetadataFor(each); - if (resource.isExported()) { - contexts.add(new EntityContext( - typeResolver, - contextPath, configuration, - repositoryInfo, - repositoryInstance, - resource, - mappings, - entities, - associations, - extractorConfiguration - )); - } - }); - }); - } - - List handlers = new ArrayList<>(); - for (EntityContext each : contexts) { - handlers.addAll(extractorConfiguration.getEntityExtractors().stream() - .map(extractFromContext(each)) - .flatMap(Collection::stream) - .collect(toList())); - } - return handlers; - } - - private Function> extractFromContext(final EntityContext context) { - return input -> input.extract(context); - } - -} diff --git a/springfox-data-rest/src/main/java/springfox/documentation/spring/data/rest/OptionalDeferencer.java b/springfox-data-rest/src/main/java/springfox/documentation/spring/data/rest/OptionalDeferencer.java deleted file mode 100644 index 85f8d83a437..00000000000 --- a/springfox-data-rest/src/main/java/springfox/documentation/spring/data/rest/OptionalDeferencer.java +++ /dev/null @@ -1,34 +0,0 @@ -/* - * - * Copyright 2017-2019 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ -package springfox.documentation.spring.data.rest; - -import org.springframework.core.convert.converter.Converter; - -import java.util.Optional; - -public class OptionalDeferencer implements Converter { - @SuppressWarnings("unchecked") - @Override - public T convert(Object source) { - if (source instanceof Optional) { - return ((Optional) source).orElse(null); - } - return (T) source; - } -} diff --git a/springfox-data-rest/src/main/java/springfox/documentation/spring/data/rest/RequestExtractionUtils.java b/springfox-data-rest/src/main/java/springfox/documentation/spring/data/rest/RequestExtractionUtils.java deleted file mode 100644 index 541fe88e9ea..00000000000 --- a/springfox-data-rest/src/main/java/springfox/documentation/spring/data/rest/RequestExtractionUtils.java +++ /dev/null @@ -1,122 +0,0 @@ -/* - * - * Copyright 2017-2019 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ -package springfox.documentation.spring.data.rest; - -import com.fasterxml.classmate.ResolvedType; -import com.fasterxml.classmate.TypeResolver; -import org.springframework.core.annotation.AnnotationUtils; -import org.springframework.data.mapping.PersistentEntity; -import org.springframework.data.mapping.PersistentProperty; -import org.springframework.hateoas.EntityModel; -import org.springframework.hateoas.CollectionModel; -import org.springframework.web.method.HandlerMethod; - -import java.lang.annotation.Annotation; -import java.lang.reflect.Method; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.Map; - -class RequestExtractionUtils { - private RequestExtractionUtils() { - throw new UnsupportedOperationException(); - } - - static String lowerCamelCaseName(String stringValue) { - return Character.toLowerCase(stringValue.charAt(0)) + stringValue.substring(1); - } - - static String upperCamelCaseName(String stringValue) { - return Character.toUpperCase(stringValue.charAt(0)) + stringValue.substring(1); - } - - static String actionName(PersistentEntity entity, Method method) { - return String.format("%s%s", method.getName(), entity.getType().getSimpleName()); - } - - static List pathAnnotations(String name) { - return pathAnnotations(name, null); - } - - static List pathAnnotations(String name, HandlerMethod handler) { - List annotations = handlerAnnotations(handler); - if (name != null) { - annotations.add(SynthesizedAnnotations.pathVariable(name)); - } - return annotations; - } - - static List bodyAnnotations(HandlerMethod handler) { - List annotations = handlerAnnotations(handler); - annotations.add(SynthesizedAnnotations.REQUEST_BODY_ANNOTATION); - return annotations; - } - - @SuppressWarnings({"ConstantConditions", "deprecation"}) - private static List handlerAnnotations(HandlerMethod handler) { - List annotations = new ArrayList<>(); - if (handler != null) { - annotations.addAll(Arrays.asList(AnnotationUtils.getAnnotations(handler.getMethod()))); - } - return annotations; - } - - static List bodyAnnotations() { - List annotations = handlerAnnotations(null); - annotations.add(SynthesizedAnnotations.REQUEST_BODY_ANNOTATION); - return annotations; - } - - @SuppressWarnings("ConstantConditions") - static String propertyIdentifierName(PersistentProperty property) { - String propertyName = property.getName(); - if (property.isCollectionLike()) { - propertyName = property.getComponentType().getSimpleName(); - } else if (property.isMap()) { - propertyName = property.getMapValueType().getSimpleName(); - } - return String.format("%sId", propertyName.toLowerCase()); - } - - static ResolvedType propertyResponse(PersistentProperty property, TypeResolver resolver) { - if (property.isCollectionLike()) { - return resolver.resolve(CollectionModel.class, property.getComponentType()); - } else if (property.isMap()) { - return resolver.resolve( - EntityModel.class, - resolver.resolve( - Map.class, - String.class, - property.getMapValueType())); - } - return resolver.resolve(EntityModel.class, property.getType()); - } - - static ResolvedType propertyItemResponse(PersistentProperty property, TypeResolver resolver) { - if (property.isCollectionLike()) { - return resolver.resolve(EntityModel.class, property.getComponentType()); - } else if (property.isMap()) { - return resolver.resolve( - EntityModel.class, - property.getMapValueType()); - } - return resolver.resolve(EntityModel.class, property.getType()); - } -} diff --git a/springfox-data-rest/src/main/java/springfox/documentation/spring/data/rest/RequestHandlerExtractorConfiguration.java b/springfox-data-rest/src/main/java/springfox/documentation/spring/data/rest/RequestHandlerExtractorConfiguration.java deleted file mode 100644 index b84f7eb4fc3..00000000000 --- a/springfox-data-rest/src/main/java/springfox/documentation/spring/data/rest/RequestHandlerExtractorConfiguration.java +++ /dev/null @@ -1,27 +0,0 @@ -/* - * - * Copyright 2017-2019 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ -package springfox.documentation.spring.data.rest; - -import java.util.List; - -public interface RequestHandlerExtractorConfiguration { - List getEntityExtractors(); - - List getAssociationExtractors(); -} diff --git a/springfox-data-rest/src/main/java/springfox/documentation/spring/data/rest/SpecificationBuilder.java b/springfox-data-rest/src/main/java/springfox/documentation/spring/data/rest/SpecificationBuilder.java deleted file mode 100644 index e00fb8865cc..00000000000 --- a/springfox-data-rest/src/main/java/springfox/documentation/spring/data/rest/SpecificationBuilder.java +++ /dev/null @@ -1,370 +0,0 @@ -/* - * - * Copyright 2017-2018 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ -package springfox.documentation.spring.data.rest; - -import com.fasterxml.classmate.ResolvedType; -import com.fasterxml.classmate.TypeResolver; -import org.springframework.data.mapping.PersistentEntity; -import org.springframework.data.mapping.PersistentProperty; -import org.springframework.data.repository.core.RepositoryMetadata; -import org.springframework.data.repository.query.Param; -import org.springframework.data.rest.core.config.RepositoryRestConfiguration; -import org.springframework.hateoas.EntityModel; -import org.springframework.hateoas.CollectionModel; -import org.springframework.http.MediaType; -import org.springframework.util.StringUtils; -import org.springframework.web.bind.annotation.RequestMethod; -import org.springframework.web.method.HandlerMethod; -import springfox.documentation.schema.ScalarTypes; -import springfox.documentation.service.ResolvedMethodParameter; -import springfox.documentation.spring.web.readers.operation.HandlerMethodResolver; - -import java.lang.reflect.Type; -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashSet; -import java.util.List; -import java.util.Optional; -import java.util.Set; -import java.util.function.Function; -import java.util.stream.Collectors; - -import static org.springframework.web.bind.annotation.RequestMethod.*; -import static springfox.documentation.schema.Collections.*; -import static springfox.documentation.schema.ResolvedTypes.*; -import static springfox.documentation.spring.data.rest.RequestExtractionUtils.*; - -abstract class SpecificationBuilder { - - private final Set supportedMethods = new HashSet<>(); - private final Set produces = new HashSet<>(); - private final Set consumes = new HashSet<>(); - private final List parameters = new ArrayList<>(); - private String path; - - static ResolvedType resolveType(EntityContext context, Function getType) { - - RepositoryMetadata repository = context.getRepositoryMetadata(); - TypeResolver typeResolver = context.getTypeResolver(); - - return getType != null - ? typeResolver.resolve(getType.apply(repository)) - : typeResolver.resolve(Void.TYPE); - } - - static SpecificationBuilder entityAction(EntityContext context, HandlerMethod handlerMethod) { - return new EntityActionSpecificationBuilder(context, handlerMethod); - } - - static SpecificationBuilder associationAction(EntityAssociationContext context, String path) { - return new AssociationActionSpecificationBuilder(context, path); - } - - SpecificationBuilder path(String path) { - this.path = path; - return this; - } - - SpecificationBuilder supportsMethod(RequestMethod method) { - this.supportedMethods.add(method); - return this; - } - - SpecificationBuilder produces(MediaType type) { - this.produces.add(type); - return this; - } - - SpecificationBuilder consumes(MediaType type) { - this.consumes.add(type); - return this; - } - - SpecificationBuilder parameter(ResolvedMethodParameter parameter) { - this.parameters.add(parameter); - return this; - } - - public Set getSupportedMethods() { - return supportedMethods; - } - - public Set getProduces() { - return produces; - } - - public Set getConsumes() { - return consumes; - } - - public List getParameters() { - return parameters; - } - - public String getPath() { - return path; - } - - public void setPath(String path) { - this.path = path; - } - - abstract SpecificationBuilder parameterType(ParameterType parameterType); - - abstract Optional build(); - - enum ParameterType { - ID, - RESOURCE, - PAGEABLE_RESOURCE, - ASSOCIATION - } - - private static class AssociationActionSpecificationBuilder extends SpecificationBuilder { - - private final EntityAssociationContext context; - private final PersistentProperty property; - - AssociationActionSpecificationBuilder(EntityAssociationContext context, String path) { - setPath(path); - this.context = context; - this.property = context.getAssociation().getInverse(); - } - - @Override - SpecificationBuilder parameterType(ParameterType parameterType) { - - int index = this.getParameters().size(); - - switch (parameterType) { - case ID: - return parameter(new ResolvedMethodParameter( - 0, - "id", - pathAnnotations("id"), - resolveType(context.getEntityContext(), RepositoryMetadata::getIdType))); - - case RESOURCE: - return parameter(new ResolvedMethodParameter( - 0, - "body", - bodyAnnotations(), - property.isCollectionLike() - ? context.getEntityContext().getTypeResolver().resolve(List.class, String.class) - : context.getEntityContext().getTypeResolver().resolve(String.class))); - - case ASSOCIATION: - return parameter(new ResolvedMethodParameter( - index, - propertyIdentifierName(property), - pathAnnotations(propertyIdentifierName(property)), - context.getEntityContext().getTypeResolver().resolve(String.class))); - - case PAGEABLE_RESOURCE: - default: - break; - } - return this; - } - - @Override - Optional build() { - - TypeResolver resolver = context.getEntityContext().getTypeResolver(); - - return context.getEntityContext().entity() - .map(entity -> actionName(entity, property)) - .map(actionName -> new ActionSpecification( - actionName, - getPath(), - getSupportedMethods(), - getProduces(), - getConsumes(), - null, - getType(), - getParameters(), - returnType(resolver)) - ); - } - - private String actionName( - PersistentEntity entity, - PersistentProperty property) { - - return String.format("%s%s", - lowerCamelCaseName(entity.getType().getSimpleName()), - upperCamelCaseName(property.getName())); - } - - private Class getType() { - return context.getEntityContext().entity() - .map(PersistentEntity::getType) - .orElseThrow(() -> new IllegalStateException("Expecting that the entity exists here")); - } - - private ResolvedType returnType(TypeResolver resolver) { - return getSupportedMethods().contains(DELETE) - ? resolver.resolve(Void.TYPE) - : getParameters().stream() - .anyMatch(param -> param.getParameterIndex() > 0) - ? propertyItemResponse(property, resolver) - : propertyResponse(property, resolver); - } - } - - private static class EntityActionSpecificationBuilder extends SpecificationBuilder { - - private final EntityContext context; - private final HandlerMethod handlerMethod; - - EntityActionSpecificationBuilder(EntityContext context, HandlerMethod handlerMethod) { - this.context = context; - this.handlerMethod = handlerMethod; - } - - private static ResolvedMethodParameter transferResolvedMethodParameter( - ResolvedMethodParameter src) { - Optional param = src.findAnnotation(Param.class); - if (param.isPresent()) { - return src.annotate(SynthesizedAnnotations.requestParam(param.get().value())); - } - return src; - } - - @SuppressWarnings("unchecked") - @Override - SpecificationBuilder parameterType(ParameterType parameterType) { - - switch (parameterType) { - case ID: - return parameter(new ResolvedMethodParameter( - 0, - "id", - pathAnnotations("id", handlerMethod), - resolveType(context, RepositoryMetadata::getIdType))); - - case RESOURCE: - return parameter(new ResolvedMethodParameter( - 0, - "body", - bodyAnnotations(handlerMethod), - resolveType(context, RepositoryMetadata::getDomainType))); - - - case PAGEABLE_RESOURCE: - RepositoryRestConfiguration configuration = context.getConfiguration(); - TypeResolver typeResolver = context.getTypeResolver(); - - parameter(new ResolvedMethodParameter( - 0, - configuration.getPageParamName(), - Collections.EMPTY_LIST, - typeResolver.resolve(Integer.class))); - parameter(new ResolvedMethodParameter( - 1, - configuration.getLimitParamName(), - Collections.EMPTY_LIST, - typeResolver.resolve(Integer.class))); - parameter(new ResolvedMethodParameter( - 2, - configuration.getSortParamName(), - Collections.EMPTY_LIST, - typeResolver.resolve(String.class))); - - default: - break; - } - return this; - } - - @Override - Optional build() { - - if (!StringUtils.hasText(getPath())) { - setPath(String.format("%s%s", - context.basePath(), - context.resourcePath())); - } - - return context.entity() - .map(entity -> actionName(entity, handlerMethod.getMethod())) - .map(actionName -> new ActionSpecification( - actionName, - getPath(), - getSupportedMethods(), - getProduces(), - getConsumes(), - handlerMethod, - getType(), - inputParameters(), - inferReturnType(context, handlerMethod)) - ); - } - - private ResolvedType inferReturnType( - EntityContext context, - HandlerMethod handler) { - - TypeResolver resolver = context.getTypeResolver(); - HandlerMethodResolver methodResolver = new HandlerMethodResolver(resolver); - RepositoryMetadata repository = context.getRepositoryMetadata(); - - ResolvedType domainReturnType = - resolver.resolve(repository.getReturnedDomainClass(handler.getMethod())); - ResolvedType methodReturnType = - methodResolver.methodReturnType(handler); - - if (isContainerType(methodReturnType)) { - return resolver.resolve(CollectionModel.class, - collectionElementType(methodReturnType)); - } else if (Iterable.class.isAssignableFrom(methodReturnType.getErasedType())) { - return resolver.resolve(CollectionModel.class, domainReturnType); - } else if (ScalarTypes.builtInScalarType(domainReturnType).isPresent()) { - return domainReturnType; - } else if (isVoid(domainReturnType)) { - return resolver.resolve(Void.TYPE); - } - - return resolver.resolve(EntityModel.class, domainReturnType); - } - - private List transferResolvedMethodParameterList( - EntityContext context, - HandlerMethod handler) { - - TypeResolver resolver = context.getTypeResolver(); - HandlerMethodResolver methodResolver = new HandlerMethodResolver(resolver); - - return methodResolver.methodParameters(handler).stream() - .map(EntityActionSpecificationBuilder::transferResolvedMethodParameter) - .collect(Collectors.toList()); - } - - @SuppressWarnings({"OptionalGetWithoutIsPresent", "java:S3655"}) - private Class getType() { - return context.entity().get().getType(); - } - - private List inputParameters() { - return !getParameters().isEmpty() - ? getParameters() - : transferResolvedMethodParameterList(context, handlerMethod); - } - } -} diff --git a/springfox-data-rest/src/main/java/springfox/documentation/spring/data/rest/SpringDataRestRequestHandler.java b/springfox-data-rest/src/main/java/springfox/documentation/spring/data/rest/SpringDataRestRequestHandler.java deleted file mode 100644 index 47c2cae13c5..00000000000 --- a/springfox-data-rest/src/main/java/springfox/documentation/spring/data/rest/SpringDataRestRequestHandler.java +++ /dev/null @@ -1,175 +0,0 @@ -/* - * - * Copyright 2017-2019 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ -package springfox.documentation.spring.data.rest; - -import com.fasterxml.classmate.ResolvedType; -import org.springframework.core.annotation.AnnotationUtils; -import org.springframework.http.MediaType; -import org.springframework.web.bind.annotation.RequestMethod; -import org.springframework.web.method.HandlerMethod; -import org.springframework.web.util.pattern.PathPatternParser; -import springfox.documentation.RequestHandler; -import springfox.documentation.RequestHandlerKey; -import springfox.documentation.service.ResolvedMethodParameter; -import springfox.documentation.spring.web.WebMvcPatternsRequestConditionWrapper; -import springfox.documentation.spring.web.plugins.CombinedRequestHandler; -import springfox.documentation.spring.wrapper.NameValueExpression; -import springfox.documentation.spring.wrapper.PatternsRequestCondition; -import springfox.documentation.spring.wrapper.RequestMappingInfo; - -import java.lang.annotation.Annotation; -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashSet; -import java.util.List; -import java.util.Optional; -import java.util.Set; -import java.util.StringJoiner; - -import static java.util.Optional.*; -import static java.util.stream.Collectors.*; - -class SpringDataRestRequestHandler implements RequestHandler { - private final EntityContext entityContext; - private final ActionSpecification actionSpecification; - private final String contextPath; - - SpringDataRestRequestHandler( - EntityContext entityContext, - ActionSpecification actionSpecification) { - - this.contextPath = entityContext.contextPath(); - this.entityContext = entityContext; - this.actionSpecification = actionSpecification; - } - - @Override - public Class declaringClass() { - return actionSpecification.getDeclaringClass().orElse(null); - } - - @Override - public boolean isAnnotatedWith(Class annotation) { - return findAnnotation(annotation).isPresent(); - } - - @Override - public PatternsRequestCondition getPatternsCondition() { - return new WebMvcPatternsRequestConditionWrapper( - contextPath, - new org.springframework.web.servlet.mvc.condition.PathPatternsRequestCondition(PathPatternParser.defaultInstance, actionSpecification.getPath()) - ); - } - - @Override - public String groupName() { - return String.format("%s Entity", entityContext.getName()); - } - - @Override - public String getName() { - return actionSpecification.getName(); - } - - @Override - public Set supportedMethods() { - return actionSpecification.getSupportedMethods().stream() - .collect(collectingAndThen(toSet(), Collections::unmodifiableSet)); - } - - @Override - public Set produces() { - return actionSpecification.getProduces(); - } - - @Override - public Set consumes() { - return actionSpecification.getConsumes(); - } - - @Override - public Set> headers() { - return new HashSet<>(); - } - - @Override - public Set> params() { - return new HashSet<>(); - } - - @Override - public Optional findAnnotation(Class annotation) { - if (getHandlerMethod() != null) { - return ofNullable(AnnotationUtils.findAnnotation(getHandlerMethod().getMethod(), annotation)); - } - return empty(); - } - - @SuppressWarnings("unchecked") - @Override - public RequestHandlerKey key() { - return new RequestHandlerKey( - getPatternsCondition().getPatterns(), - supportedMethods(), - consumes(), - produces()); - } - - @Override - public List getParameters() { - return new ArrayList<>(actionSpecification.getParameters()); - } - - @Override - public ResolvedType getReturnType() { - return actionSpecification.getReturnType(); - } - - @Override - public Optional findControllerAnnotation(Class annotation) { - if (getHandlerMethod() != null) { - return ofNullable(AnnotationUtils.findAnnotation(getHandlerMethod().getBeanType(), annotation)); - } - return empty(); - } - - @Override - public HandlerMethod getHandlerMethod() { - return actionSpecification.getHandlerMethod().orElse(null); - } - - @Override - public RequestMappingInfo getRequestMapping() { - throw new UnsupportedOperationException(); - } - - @Override - public RequestHandler combine(RequestHandler other) { - return new CombinedRequestHandler(this, other); - } - - @Override - public String toString() { - return new StringJoiner(", ", SpringDataRestRequestHandler.class.getSimpleName() + "{", "}") - .add("entityContext=" + entityContext) - .add("actionSpecification=" + actionSpecification) - .add("key=" + key()) - .toString(); - } -} diff --git a/springfox-data-rest/src/main/java/springfox/documentation/spring/data/rest/SynthesizedAnnotations.java b/springfox-data-rest/src/main/java/springfox/documentation/spring/data/rest/SynthesizedAnnotations.java deleted file mode 100644 index b7409e56dcd..00000000000 --- a/springfox-data-rest/src/main/java/springfox/documentation/spring/data/rest/SynthesizedAnnotations.java +++ /dev/null @@ -1,111 +0,0 @@ -/* - * - * Copyright 2016 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ -package springfox.documentation.spring.data.rest; - -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestParam; -import springfox.documentation.annotations.ApiIgnore; - -import java.lang.annotation.Annotation; - -class SynthesizedAnnotations { - private SynthesizedAnnotations() { - throw new UnsupportedOperationException(); - } - - static final RequestBody REQUEST_BODY_ANNOTATION = new RequestBody() { - @Override - public Class annotationType() { - return RequestBody.class; - } - - @Override - public boolean required() { - return true; - } - }; - - static final PathVariable PATH_VARIABLE_ANNOTATION = pathVariable("id"); - - static final ApiIgnore API_IGNORE_ANNOTATION = new ApiIgnore() { - @Override - public String value() { - return "Parameter is ignored"; - } - - @Override - public Class annotationType() { - return ApiIgnore.class; - } - }; - - static PathVariable pathVariable(final String parameterName) { - return new PathVariable() { - @Override - public Class annotationType() { - return PathVariable.class; - } - - @Override - public String value() { - return parameterName; - } - - @Override - public String name() { - return parameterName; - } - - @Override - public boolean required() { - return true; - } - }; - } - - static RequestParam requestParam(final String parameterName) { - return new RequestParam() { - @Override - public Class annotationType() { - return RequestParam.class; - } - - @Override - public String value() { - return parameterName; - } - - @Override - public String name() { - return parameterName; - } - - @Override - public boolean required() { - return false; - } - - @Override - public String defaultValue() { - return null; - } - }; - } -} diff --git a/springfox-data-rest/src/main/java/springfox/documentation/spring/data/rest/configuration/SpringDataRestConfiguration.java b/springfox-data-rest/src/main/java/springfox/documentation/spring/data/rest/configuration/SpringDataRestConfiguration.java deleted file mode 100644 index be6a7783078..00000000000 --- a/springfox-data-rest/src/main/java/springfox/documentation/spring/data/rest/configuration/SpringDataRestConfiguration.java +++ /dev/null @@ -1,91 +0,0 @@ -/* - * - * Copyright 2016 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ -package springfox.documentation.spring.data.rest.configuration; - -import com.fasterxml.classmate.TypeResolver; -import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; -import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.ComponentScan; -import org.springframework.context.annotation.Configuration; -import org.springframework.core.Ordered; -import org.springframework.data.domain.Pageable; -import org.springframework.data.rest.core.config.RepositoryRestConfiguration; -import springfox.documentation.builders.AlternateTypeBuilder; -import springfox.documentation.schema.AlternateTypeRule; -import springfox.documentation.schema.AlternateTypeRuleConvention; -import springfox.documentation.spring.web.OnServletBasedWebApplication; - -import java.lang.reflect.Type; -import java.util.List; - -import static java.util.Collections.*; -import static springfox.documentation.schema.AlternateTypeRules.*; - -@Configuration -@ComponentScan(basePackages = "springfox.documentation.spring.data.rest") -@ConditionalOnWebApplication -@ConditionalOnClass({RepositoryRestConfiguration.class, OnServletBasedWebApplication.class}) -public class SpringDataRestConfiguration { - - // tag::alternate-type-rule-convention[] - @Bean - public AlternateTypeRuleConvention pageableConvention( - final TypeResolver resolver, - final RepositoryRestConfiguration restConfiguration) { - return new AlternateTypeRuleConvention() { - - @Override - public int getOrder() { - return Ordered.HIGHEST_PRECEDENCE; - } - - @Override - public List rules() { - return singletonList( - newRule(resolver.resolve(Pageable.class), resolver.resolve(pageableMixin(restConfiguration))) - ); - } - }; - } - // end::alternate-type-rule-convention[] - - // tag::alternate-type-builder[] - private Type pageableMixin(RepositoryRestConfiguration restConfiguration) { - return new AlternateTypeBuilder() - .fullyQualifiedClassName( - String.format("%s.generated.%s", - Pageable.class.getPackage().getName(), - Pageable.class.getSimpleName())) - .property(p -> p.name(restConfiguration.getPageParamName()) - .type(Integer.class) - .canRead(true) - .canWrite(true)) - .property(p -> p.name(restConfiguration.getLimitParamName()) - .type(Integer.class) - .canRead(true) - .canWrite(true)) - .property(p -> p.name(restConfiguration.getSortParamName()) - .type(String.class) - .canRead(true) - .canWrite(true)) - .build(); - } - // end::alternate-type-builder[] -} diff --git a/springfox-data-rest/src/main/java/springfox/documentation/spring/data/rest/schema/EmbeddedCollection.java b/springfox-data-rest/src/main/java/springfox/documentation/spring/data/rest/schema/EmbeddedCollection.java deleted file mode 100644 index e19848e96e9..00000000000 --- a/springfox-data-rest/src/main/java/springfox/documentation/spring/data/rest/schema/EmbeddedCollection.java +++ /dev/null @@ -1,22 +0,0 @@ -/* - * - * Copyright 2017-2019 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ -package springfox.documentation.spring.data.rest.schema; - -class EmbeddedCollection { -} diff --git a/springfox-data-rest/src/main/java/springfox/documentation/spring/data/rest/schema/EmbeddedCollectionModelProvider.java b/springfox-data-rest/src/main/java/springfox/documentation/spring/data/rest/schema/EmbeddedCollectionModelProvider.java deleted file mode 100644 index 3e05c7a2c41..00000000000 --- a/springfox-data-rest/src/main/java/springfox/documentation/spring/data/rest/schema/EmbeddedCollectionModelProvider.java +++ /dev/null @@ -1,172 +0,0 @@ -/* - * - * Copyright 2017-2019 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ -package springfox.documentation.spring.data.rest.schema; - -import com.fasterxml.classmate.ResolvedType; -import com.fasterxml.classmate.TypeResolver; -import org.springframework.hateoas.CollectionModel; -import org.springframework.hateoas.server.LinkRelationProvider; -import springfox.documentation.builders.ModelPropertyBuilder; -import springfox.documentation.builders.ModelSpecificationBuilder; -import springfox.documentation.builders.PropertySpecificationBuilder; -import springfox.documentation.schema.CollectionType; -import springfox.documentation.schema.ModelSpecification; -import springfox.documentation.schema.PropertySpecification; -import springfox.documentation.schema.TypeNameExtractor; -import springfox.documentation.schema.Xml; -import springfox.documentation.schema.property.ModelSpecificationFactory; -import springfox.documentation.spi.DocumentationType; -import springfox.documentation.spi.schema.EnumTypeDeterminer; -import springfox.documentation.spi.schema.SyntheticModelProviderPlugin; -import springfox.documentation.spi.schema.contexts.ModelContext; - -import java.util.List; -import java.util.Set; - -import static java.util.Collections.*; -import static java.util.function.Function.*; -import static java.util.stream.Collectors.*; -import static springfox.documentation.schema.ResolvedTypes.*; - -class EmbeddedCollectionModelProvider implements SyntheticModelProviderPlugin { - - private final TypeResolver resolver; - private final LinkRelationProvider relProvider; - private final TypeNameExtractor typeNameExtractor; - private final EnumTypeDeterminer enumTypeDeterminer; - private final ModelSpecificationFactory modelSpecifications; - - EmbeddedCollectionModelProvider( - TypeResolver resolver, - LinkRelationProvider relProvider, - TypeNameExtractor typeNameExtractor, - EnumTypeDeterminer enumTypeDeterminer, - ModelSpecificationFactory modelSpecifications) { - this.resolver = resolver; - this.relProvider = relProvider; - this.typeNameExtractor = typeNameExtractor; - this.enumTypeDeterminer = enumTypeDeterminer; - this.modelSpecifications = modelSpecifications; - } - - @SuppressWarnings("deprecation") - @Override - public springfox.documentation.schema.Model create(ModelContext context) { - ResolvedType resourceType = resolver.resolve(context.getType()); - List typeParameters = resourceType.getTypeParameters(); - Class type = typeParameters.get(0).getErasedType(); - String name = typeNameExtractor.typeName(context); - return context.getBuilder() - .description(String.format( - "Embedded collection of %s", - type.getSimpleName())) - .name(name) - .qualifiedType(type.getName()) - .type(typeParameters.get(0)) - .properties(properties(context).stream() - .collect(toMap(springfox.documentation.schema.ModelProperty::getName, identity()))) - .xml(new Xml() - .wrapped(true) - .name("content") - ) - .build(); - } - - @Override - @SuppressWarnings("deprecation") - public List properties(ModelContext context) { - ResolvedType resourceType = resolver.resolve(context.getType()); - List typeParameters = resourceType.getTypeParameters(); - Class type = typeParameters.get(0).getErasedType(); - return singletonList( - new ModelPropertyBuilder() - .name(relProvider.getCollectionResourceRelFor(type).value()) - .type(resolver.resolve(List.class, type)) - .qualifiedType(CollectionModel.class.getName()) - .position(0) - .required(true) - .isHidden(false) - .description("Resource collection") - .build() - .updateModelRef(modelRefFactory(context, enumTypeDeterminer, typeNameExtractor))); - } - - @Override - public ModelSpecification createModelSpecification(ModelContext context) { - ResolvedType resourceType = resolver.resolve(context.getType()); - List typeParameters = resourceType.getTypeParameters(); - Class type = typeParameters.get(0).getErasedType(); - String name = typeNameExtractor.typeName(context); - return context.getModelSpecificationBuilder() - .name(name) - .facets(f -> f.description(String.format( - "Embedded collection of %s", - type.getSimpleName())) - .xml(new Xml() - .wrapped(true) - .name("content"))) - .compoundModel(cm -> - cm.properties(propertySpecifications(context)) - .modelKey(m -> - m.isResponse(context.isReturnType()) - .qualifiedModelName(q -> - q.namespace("springfox.documentation.spring.data.rest.schema") - .name(name)) - .build())) - .build(); - } - - @Override - public List propertySpecifications(ModelContext context) { - ResolvedType resourceType = resolver.resolve(context.getType()); - List typeParameters = resourceType.getTypeParameters(); - Class type = typeParameters.get(0).getErasedType(); - ModelSpecification modelSpecification = new ModelSpecificationBuilder() - .collectionModel(c -> - c.model(m -> m.copyOf(modelSpecifications.create(context, - typeParameters.get(0)))) - .collectionType(CollectionType.LIST)) - .build(); - return singletonList( - new PropertySpecificationBuilder(relProvider.getCollectionResourceRelFor(type).value()) - .type(modelSpecification) - .position(0) - .required(true) - .isHidden(false) - .description("Resource collection") - .build()); - } - - @Override - public Set dependencies(ModelContext context) { - ResolvedType resourceType = resolver.resolve(context.getType()); - List typeParameters = resourceType.getTypeParameters(); - Class type = typeParameters.get(0).getErasedType(); - - return singleton(resolver.resolve(type)); - } - - @Override - public boolean supports(ModelContext delimiter) { - return EmbeddedCollection.class.equals(resolver.resolve(delimiter.getType()).getErasedType()) - && (delimiter.getDocumentationType() == DocumentationType.SWAGGER_2 - || delimiter.getDocumentationType() == DocumentationType.OAS_30); - } - -} diff --git a/springfox-data-rest/src/main/java/springfox/documentation/spring/data/rest/schema/ResourcesModelProvider.java b/springfox-data-rest/src/main/java/springfox/documentation/spring/data/rest/schema/ResourcesModelProvider.java deleted file mode 100644 index c8a7d1f5e1c..00000000000 --- a/springfox-data-rest/src/main/java/springfox/documentation/spring/data/rest/schema/ResourcesModelProvider.java +++ /dev/null @@ -1,213 +0,0 @@ -/* - * - * Copyright 2017-2019 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ -package springfox.documentation.spring.data.rest.schema; - -import com.fasterxml.classmate.ResolvedType; -import com.fasterxml.classmate.TypeResolver; -import org.springframework.hateoas.CollectionModel; -import org.springframework.hateoas.Link; -import springfox.documentation.builders.ModelPropertyBuilder; -import springfox.documentation.builders.PropertySpecificationBuilder; -import springfox.documentation.schema.ModelSpecification; -import springfox.documentation.schema.PropertySpecification; -import springfox.documentation.schema.TypeNameExtractor; -import springfox.documentation.schema.Xml; -import springfox.documentation.schema.property.ModelSpecificationFactory; -import springfox.documentation.spi.DocumentationType; -import springfox.documentation.spi.schema.EnumTypeDeterminer; -import springfox.documentation.spi.schema.SyntheticModelProviderPlugin; -import springfox.documentation.spi.schema.contexts.ModelContext; - -import java.lang.reflect.Type; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.stream.Stream; - -import static java.util.function.Function.*; -import static java.util.stream.Collectors.*; -import static springfox.documentation.schema.ResolvedTypes.*; - -class ResourcesModelProvider implements SyntheticModelProviderPlugin { - - private final TypeResolver resolver; - private final TypeNameExtractor typeNameExtractor; - private final EnumTypeDeterminer enumTypeDeterminer; - private final ModelSpecificationFactory modelSpecifications; - - ResourcesModelProvider( - TypeResolver resolver, - TypeNameExtractor typeNameExtractor, - EnumTypeDeterminer enumTypeDeterminer, - ModelSpecificationFactory modelSpecifications) { - this.resolver = resolver; - this.typeNameExtractor = typeNameExtractor; - this.enumTypeDeterminer = enumTypeDeterminer; - this.modelSpecifications = modelSpecifications; - } - - @SuppressWarnings("deprecation") - @Override - public springfox.documentation.schema.Model create(ModelContext context) { - ResolvedType resourceType = resourceType(context.getType()); - List typeParameters = resourceType.getTypeParameters(); - Class type = typeParameters.get(0).getErasedType(); - String name = typeNameExtractor.typeName(context); - return context.getBuilder() - .description(String.format( - "Resources of %s", - type.getSimpleName())) - .name(name) - .qualifiedType(type.getName()) - .type(typeParameters.get(0)) - .properties(properties(context).stream().collect(toMap( - springfox.documentation.schema.ModelProperty::getName, - identity()))) - .xml(new Xml() - .name("entities") - .wrapped(false) - .attribute(false)) - .build(); - } - - @Override - @SuppressWarnings("deprecation") - public List properties(ModelContext context) { - ResolvedType resourceType = resourceType(context.getType()); - List typeParameters = resourceType.getTypeParameters(); - Class type = typeParameters.get(0).getErasedType(); - ResolvedType embedded = resolver.resolve( - EmbeddedCollection.class, - type); - ResolvedType mapOfLinks = resolver.resolve( - Map.class, - String.class, - Link.class); - return Stream.of( - new ModelPropertyBuilder() - .name("_embedded") - .type(embedded) - .qualifiedType(embedded.getSignature()) - .position(0) - .required(true) - .isHidden(false) - .build() - .updateModelRef(modelRefFactory( - context, - enumTypeDeterminer, - typeNameExtractor)), - new ModelPropertyBuilder() - .name("_links") - .type(mapOfLinks) - .qualifiedType(mapOfLinks.getSignature()) - .position(1) - .required(true) - .isHidden(false) - .description("Link collection") - .build() - .updateModelRef(modelRefFactory( - context, - enumTypeDeterminer, - typeNameExtractor)) - ) - .collect(toList()); - } - - @Override - public ModelSpecification createModelSpecification(ModelContext context) { - ResolvedType resourceType = resourceType(context.getType()); - List typeParameters = resourceType.getTypeParameters(); - Class type = typeParameters.get(0).getErasedType(); - String name = typeNameExtractor.typeName(context); - return context.getModelSpecificationBuilder() - .name(name) - .facets(f -> f.description(String.format( - "Resources of %s", - type.getSimpleName())) - .xml(new Xml() - .name("entities") - .wrapped(false) - .attribute(false))) - .compoundModel(cm -> cm - .properties(propertySpecifications(context)) - .modelKey(m -> - m.isResponse(context.isReturnType()) - .qualifiedModelName( - q -> q.namespace("org.springframework.hateoas") - .name(name)) - .build())) - .build(); - } - - @Override - public List propertySpecifications(ModelContext context) { - ResolvedType resourceType = resourceType(context.getType()); - List typeParameters = resourceType.getTypeParameters(); - Class type = typeParameters.get(0).getErasedType(); - ResolvedType embedded = resolver.resolve( - EmbeddedCollection.class, - type); - ResolvedType mapOfLinks = resolver.resolve( - Map.class, - String.class, - Link.class); - ModelSpecification embeddedProperty = modelSpecifications.create(context, embedded); - ModelSpecification mapOfLinksProperty = modelSpecifications.create(context, mapOfLinks); - return Stream.of( - new PropertySpecificationBuilder("_embedded") - .type(embeddedProperty) - .position(0) - .required(true) - .isHidden(false) - .build(), - new PropertySpecificationBuilder("_links") - .type(mapOfLinksProperty) - .position(1) - .required(true) - .isHidden(false) - .description("Link collection") - .build()) - .collect(toList()); - } - - @Override - public Set dependencies(ModelContext context) { - ResolvedType resourceType = resourceType(context.getType()); - List typeParameters = resourceType.getTypeParameters(); - Class type = typeParameters.get(0).getErasedType(); - - return Stream.of( - resolver.resolve( - EmbeddedCollection.class, - type), - resolver.resolve(Link.class) - ).collect(toSet()); - } - - @Override - public boolean supports(ModelContext delimiter) { - return CollectionModel.class.equals(resourceType(delimiter.getType()).getErasedType()) - && (delimiter.getDocumentationType() == DocumentationType.SWAGGER_2 - || delimiter.getDocumentationType() == DocumentationType.OAS_30); - } - - private ResolvedType resourceType(Type type) { - return resolver.resolve(type); - } -} diff --git a/springfox-data-rest/src/main/java/springfox/documentation/spring/data/rest/schema/SpringDataRestSchemaExtensions.java b/springfox-data-rest/src/main/java/springfox/documentation/spring/data/rest/schema/SpringDataRestSchemaExtensions.java deleted file mode 100644 index c4b8f452410..00000000000 --- a/springfox-data-rest/src/main/java/springfox/documentation/spring/data/rest/schema/SpringDataRestSchemaExtensions.java +++ /dev/null @@ -1,52 +0,0 @@ -/* - * - * Copyright 2017-2019 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ -package springfox.documentation.spring.data.rest.schema; - -import com.fasterxml.classmate.TypeResolver; -import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.hateoas.server.LinkRelationProvider; -import springfox.documentation.schema.TypeNameExtractor; -import springfox.documentation.schema.property.ModelSpecificationFactory; -import springfox.documentation.spi.schema.EnumTypeDeterminer; - -@Configuration -public class SpringDataRestSchemaExtensions { - - @Bean - public ResourcesModelProvider resourcesModelProvider( - TypeResolver resolver, - TypeNameExtractor typeNameExtractor, - EnumTypeDeterminer enumTypeDeterminer) { - return new ResourcesModelProvider(resolver, typeNameExtractor, enumTypeDeterminer, - new ModelSpecificationFactory(typeNameExtractor, enumTypeDeterminer)); - } - - @Bean - public EmbeddedCollectionModelProvider embeddedCollectionProvider( - TypeResolver resolver, - @Qualifier("_relProvider") - LinkRelationProvider relProvider, - TypeNameExtractor typeNameExtractor, - EnumTypeDeterminer enumTypeDeterminer) { - return new EmbeddedCollectionModelProvider(resolver, relProvider, typeNameExtractor, enumTypeDeterminer, - new ModelSpecificationFactory(typeNameExtractor, enumTypeDeterminer)); - } -} diff --git a/springfox-oas/build.gradle b/springfox-oas/build.gradle deleted file mode 100644 index d2e9d1f15d7..00000000000 --- a/springfox-oas/build.gradle +++ /dev/null @@ -1,52 +0,0 @@ -//plugins { -// id "net.ltgt.apt-idea" version "0.21" -//} - -ext { - limits = [ - 'instruction': 96, - 'branch' : 84, - 'line' : 96.5, - 'complexity' : 87, - 'method' : 95, - 'class' : 100 - ] -} - -dependencies { - api project(':springfox-spi') - api project(':springfox-schema') - api project(':springfox-core') - api project(':springfox-spring-web') - api project(':springfox-spring-webmvc') - api project(':springfox-spring-webflux') - api project(':springfox-swagger-common') - api libs.core - api libs.spring - api libs.oasCore - - implementation "org.mapstruct:mapstruct:$mapstruct" - annotationProcessor "org.mapstruct:mapstruct-processor:$mapstruct" - - compileOnly libs.springProvidedWithMvc - compileOnly "org.springframework:spring-webflux:$springWeb" - compileOnly "org.springframework.boot:spring-boot-autoconfigure:$springBoot" - compileOnly "jakarta.servlet:jakarta.servlet-api:$servlet" - compileOnly libs.clientProvided - - testImplementation project(':springfox-core').sourceSets.test.output - testImplementation project(':springfox-schema').sourceSets.test.output - testImplementation project(':springfox-spring-web').sourceSets.test.output - - testImplementation libs.test - testImplementation "org.skyscreamer:jsonassert:${jsonAssert}" - testImplementation libs.clientProvided -} - -compileJava { - options.compilerArgs += [ - "-Amapstruct.defaultComponentModel=spring", - "-Amapstruct.unmappedTargetPolicy=ERROR" - ] - -} \ No newline at end of file diff --git a/springfox-oas/src/main/java/springfox/documentation/oas/annotations/EnableOpenApi.java b/springfox-oas/src/main/java/springfox/documentation/oas/annotations/EnableOpenApi.java deleted file mode 100644 index 57d17eead3a..00000000000 --- a/springfox-oas/src/main/java/springfox/documentation/oas/annotations/EnableOpenApi.java +++ /dev/null @@ -1,43 +0,0 @@ -/* - * - * Copyright 2017-2018 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.oas.annotations; - -import org.springframework.context.annotation.Import; -import springfox.documentation.oas.configuration.OpenApiDocumentationConfiguration; - -import java.lang.annotation.Documented; -import java.lang.annotation.Retention; -import java.lang.annotation.Target; - -/** - * Indicates that Swagger support should be enabled. - *

- * This should be applied to a Spring java config and should have an accompanying '@Configuration' annotation. - *

- * Loads all required beans defined in @see SpringSwaggerConfig - * - * @see springfox.documentation.spring.web.plugins.Docket - */ -@Retention(value = java.lang.annotation.RetentionPolicy.RUNTIME) -@Target(value = {java.lang.annotation.ElementType.TYPE}) -@Documented -@Import(OpenApiDocumentationConfiguration.class) -public @interface EnableOpenApi { -} diff --git a/springfox-oas/src/main/java/springfox/documentation/oas/configuration/OpenApiDocumentationConfiguration.java b/springfox-oas/src/main/java/springfox/documentation/oas/configuration/OpenApiDocumentationConfiguration.java deleted file mode 100644 index 4311e77b09a..00000000000 --- a/springfox-oas/src/main/java/springfox/documentation/oas/configuration/OpenApiDocumentationConfiguration.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * - * Copyright 2017-2018 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.oas.configuration; - -import org.springframework.context.annotation.ComponentScan; -import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.Import; -import springfox.documentation.spring.web.SpringfoxWebConfiguration; -import springfox.documentation.spring.web.SpringfoxWebFluxConfiguration; -import springfox.documentation.spring.web.SpringfoxWebMvcConfiguration; -import springfox.documentation.swagger.configuration.SwaggerCommonConfiguration; - -@Configuration -@Import({ - SpringfoxWebConfiguration.class, - SpringfoxWebMvcConfiguration.class, - SpringfoxWebFluxConfiguration.class, - SwaggerCommonConfiguration.class, - OpenApiMappingConfiguration.class, - OpenApiWebMvcConfiguration.class, - OpenApiWebFluxConfiguration.class -}) -@ComponentScan(basePackages = { - "springfox.documentation.oas.web", - "springfox.documentation.oas.mappers" -}) -public class OpenApiDocumentationConfiguration { -} diff --git a/springfox-oas/src/main/java/springfox/documentation/oas/configuration/OpenApiJacksonModule.java b/springfox-oas/src/main/java/springfox/documentation/oas/configuration/OpenApiJacksonModule.java deleted file mode 100644 index a1853be1866..00000000000 --- a/springfox-oas/src/main/java/springfox/documentation/oas/configuration/OpenApiJacksonModule.java +++ /dev/null @@ -1,95 +0,0 @@ -/* - * - * Copyright 2015-2019 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.oas.configuration; - -import com.fasterxml.jackson.annotation.JsonAutoDetect; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.SerializationFeature; -import com.fasterxml.jackson.databind.module.SimpleModule; -import io.swagger.v3.oas.models.Components; -import io.swagger.v3.oas.models.OpenAPI; -import io.swagger.v3.oas.models.Operation; -import io.swagger.v3.oas.models.PathItem; -import io.swagger.v3.oas.models.examples.Example; -import io.swagger.v3.oas.models.info.Contact; -import io.swagger.v3.oas.models.info.Info; -import io.swagger.v3.oas.models.info.License; -import io.swagger.v3.oas.models.media.Content; -import io.swagger.v3.oas.models.media.Encoding; -import io.swagger.v3.oas.models.media.MediaType; -import io.swagger.v3.oas.models.media.Schema; -import io.swagger.v3.oas.models.media.XML; -import io.swagger.v3.oas.models.parameters.Parameter; -import io.swagger.v3.oas.models.parameters.RequestBody; -import io.swagger.v3.oas.models.responses.ApiResponse; -import io.swagger.v3.oas.models.responses.ApiResponses; -import io.swagger.v3.oas.models.security.SecurityScheme; -import io.swagger.v3.oas.models.servers.Server; -import io.swagger.v3.oas.models.tags.Tag; -import springfox.documentation.spring.web.json.JacksonModuleRegistrar; - -import static com.fasterxml.jackson.annotation.JsonInclude.*; - -public class OpenApiJacksonModule extends SimpleModule implements JacksonModuleRegistrar { - - public void maybeRegisterModule(ObjectMapper mapper) { - if (mapper.findMixInClassFor(OpenAPI.class) == null) { - mapper.registerModule(this); - mapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false); - mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false); - mapper.configure(SerializationFeature.WRITE_ENUMS_USING_TO_STRING, true); - mapper.setSerializationInclusion(Include.NON_NULL); - } - } - - @Override - public void setupModule(SetupContext context) { - super.setupModule(context); - context.setMixInAnnotations(OpenAPI.class, NonEmptyMixin.class); - context.setMixInAnnotations(Info.class, NonEmptyMixin.class); - context.setMixInAnnotations(License.class, NonEmptyMixin.class); - context.setMixInAnnotations(Schema.class, NonEmptyMixin.class); - context.setMixInAnnotations(PathItem.class, NonEmptyMixin.class); - context.setMixInAnnotations(Content.class, NonEmptyMixin.class); - context.setMixInAnnotations(MediaType.class, NonEmptyMixin.class); - context.setMixInAnnotations(SecurityScheme.class, NonEmptyMixin.class); - context.setMixInAnnotations(Operation.class, NonEmptyMixin.class); - context.setMixInAnnotations(ApiResponses.class, NonEmptyMixin.class); - context.setMixInAnnotations(ApiResponse.class, NonEmptyMixin.class); - context.setMixInAnnotations(Parameter.class, NonEmptyMixin.class); - context.setMixInAnnotations(RequestBody.class, NonEmptyMixin.class); - context.setMixInAnnotations(Encoding.class, NonEmptyMixin.class); - context.setMixInAnnotations(Components.class, NonEmptyMixin.class); - context.setMixInAnnotations(Contact.class, NonEmptyMixin.class); - context.setMixInAnnotations(Server.class, NonEmptyMixin.class); -// context.setMixInAnnotations(ExternalDocs.class, CustomizedSwaggerSerializer.class); - context.setMixInAnnotations(XML.class, NonEmptyMixin.class); - context.setMixInAnnotations(Tag.class, NonEmptyMixin.class); - context.setMixInAnnotations(Contact.class, NonEmptyMixin.class); - context.setMixInAnnotations(Example.class, NonEmptyMixin.class); - - } - - @JsonAutoDetect - @JsonInclude(value = Include.NON_EMPTY) - private class NonEmptyMixin { - } -} diff --git a/springfox-oas/src/main/java/springfox/documentation/oas/configuration/OpenApiMappingConfiguration.java b/springfox-oas/src/main/java/springfox/documentation/oas/configuration/OpenApiMappingConfiguration.java deleted file mode 100644 index 0a678719990..00000000000 --- a/springfox-oas/src/main/java/springfox/documentation/oas/configuration/OpenApiMappingConfiguration.java +++ /dev/null @@ -1,13 +0,0 @@ -package springfox.documentation.oas.configuration; - -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import springfox.documentation.spring.web.json.JacksonModuleRegistrar; - -@Configuration -public class OpenApiMappingConfiguration { - @Bean - public JacksonModuleRegistrar openApiModule() { - return new OpenApiJacksonModule(); - } -} diff --git a/springfox-oas/src/main/java/springfox/documentation/oas/configuration/OpenApiWebFluxConfiguration.java b/springfox-oas/src/main/java/springfox/documentation/oas/configuration/OpenApiWebFluxConfiguration.java deleted file mode 100644 index ac73c57f0b4..00000000000 --- a/springfox-oas/src/main/java/springfox/documentation/oas/configuration/OpenApiWebFluxConfiguration.java +++ /dev/null @@ -1,25 +0,0 @@ -package springfox.documentation.oas.configuration; - -import org.springframework.beans.factory.annotation.Value; -import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Conditional; -import org.springframework.context.annotation.Configuration; -import org.springframework.plugin.core.config.EnablePluginRegistries; -import springfox.documentation.oas.web.WebFluxBasePathAndHostnameTransformationFilter; -import springfox.documentation.oas.web.WebFluxOpenApiTransformationFilter; -import springfox.documentation.spring.web.OnReactiveWebApplication; - -import static springfox.documentation.oas.web.SpecGeneration.*; - -@Configuration -@ConditionalOnWebApplication(type = ConditionalOnWebApplication.Type.REACTIVE) -@Conditional(OnReactiveWebApplication.class) -@EnablePluginRegistries(WebFluxOpenApiTransformationFilter.class) -public class OpenApiWebFluxConfiguration { - @Bean - public WebFluxOpenApiTransformationFilter webMvcOpenApiTransformer( - @Value(OPEN_API_SPECIFICATION_PATH) String oasPath) { - return new WebFluxBasePathAndHostnameTransformationFilter(oasPath); - } -} diff --git a/springfox-oas/src/main/java/springfox/documentation/oas/configuration/OpenApiWebMvcConfiguration.java b/springfox-oas/src/main/java/springfox/documentation/oas/configuration/OpenApiWebMvcConfiguration.java deleted file mode 100644 index 94d34fa1146..00000000000 --- a/springfox-oas/src/main/java/springfox/documentation/oas/configuration/OpenApiWebMvcConfiguration.java +++ /dev/null @@ -1,25 +0,0 @@ -package springfox.documentation.oas.configuration; - -import org.springframework.beans.factory.annotation.Value; -import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Conditional; -import org.springframework.context.annotation.Configuration; -import org.springframework.plugin.core.config.EnablePluginRegistries; -import springfox.documentation.oas.web.WebMvcBasePathAndHostnameTransformationFilter; -import springfox.documentation.oas.web.WebMvcOpenApiTransformationFilter; -import springfox.documentation.spring.web.OnServletBasedWebApplication; - -import static springfox.documentation.oas.web.SpecGeneration.*; - -@Configuration -@ConditionalOnWebApplication(type = ConditionalOnWebApplication.Type.SERVLET) -@Conditional(OnServletBasedWebApplication.class) -@EnablePluginRegistries(WebMvcOpenApiTransformationFilter.class) -public class OpenApiWebMvcConfiguration { - @Bean - public WebMvcOpenApiTransformationFilter webMvcOpenApiTransformer( - @Value(OPEN_API_SPECIFICATION_PATH) String oasPath) { - return new WebMvcBasePathAndHostnameTransformationFilter(oasPath); - } -} diff --git a/springfox-oas/src/main/java/springfox/documentation/oas/mappers/CollectionSpecificationToSchemaConverter.java b/springfox-oas/src/main/java/springfox/documentation/oas/mappers/CollectionSpecificationToSchemaConverter.java deleted file mode 100644 index c8a9744f2e9..00000000000 --- a/springfox-oas/src/main/java/springfox/documentation/oas/mappers/CollectionSpecificationToSchemaConverter.java +++ /dev/null @@ -1,35 +0,0 @@ -package springfox.documentation.oas.mappers; - -import io.swagger.v3.oas.models.media.ArraySchema; -import io.swagger.v3.oas.models.media.ByteArraySchema; -import io.swagger.v3.oas.models.media.Schema; -import org.mapstruct.factory.Mappers; -import org.springframework.core.convert.converter.Converter; -import springfox.documentation.schema.CollectionSpecification; -import springfox.documentation.schema.CollectionType; -import springfox.documentation.schema.ScalarModelSpecification; -import springfox.documentation.schema.ScalarType; -import springfox.documentation.service.ModelNamesRegistry; - -public class CollectionSpecificationToSchemaConverter implements Converter> { - private final ModelNamesRegistry modelNamesRegistry; - - public CollectionSpecificationToSchemaConverter(ModelNamesRegistry modelNamesRegistry) { - this.modelNamesRegistry = modelNamesRegistry; - } - - @Override - public Schema convert(CollectionSpecification source) { - ArraySchema arraySchema = new ArraySchema(); - if (source.getModel().getScalar() - .map(ScalarModelSpecification::getType).orElse(null) == ScalarType.BYTE) { - return new ByteArraySchema(); - } else { - arraySchema.items(Mappers.getMapper(SchemaMapper.class).mapFrom(source.getModel(), modelNamesRegistry)); - } - if (source.getCollectionType() == CollectionType.SET) { - arraySchema.uniqueItems(true); - } - return arraySchema; - } -} diff --git a/springfox-oas/src/main/java/springfox/documentation/oas/mappers/CompoundSpecificationToSchemaConverter.java b/springfox-oas/src/main/java/springfox/documentation/oas/mappers/CompoundSpecificationToSchemaConverter.java deleted file mode 100644 index ae87d4c5b6b..00000000000 --- a/springfox-oas/src/main/java/springfox/documentation/oas/mappers/CompoundSpecificationToSchemaConverter.java +++ /dev/null @@ -1,36 +0,0 @@ -package springfox.documentation.oas.mappers; - -import io.swagger.v3.oas.models.media.ObjectSchema; -import io.swagger.v3.oas.models.media.Schema; -import org.mapstruct.factory.Mappers; -import org.springframework.core.convert.converter.Converter; -import springfox.documentation.schema.CompoundModelSpecification; -import springfox.documentation.service.ModelNamesRegistry; - -import java.util.Objects; -import java.util.stream.Collectors; - -public class CompoundSpecificationToSchemaConverter implements Converter> { - private final ModelNamesRegistry modelNamesRegistry; - - public CompoundSpecificationToSchemaConverter(ModelNamesRegistry modelNamesRegistry) { - this.modelNamesRegistry = modelNamesRegistry; - } - - @Override - public Schema convert(CompoundModelSpecification source) { - ObjectSchema schema = new ObjectSchema(); - schema.properties(source.getProperties().stream() - .map(p -> { - Schema property = Mappers.getMapper(SchemaMapper.class) - .mapFrom(p.getType(), modelNamesRegistry); - if (property != null) { - return property.name(p.getName()); - } - return null; - }) - .filter(Objects::nonNull) - .collect(Collectors.toMap(Schema::getName, s -> s))); - return schema; - } -} diff --git a/springfox-oas/src/main/java/springfox/documentation/oas/mappers/ExamplesMapper.java b/springfox-oas/src/main/java/springfox/documentation/oas/mappers/ExamplesMapper.java deleted file mode 100644 index d729e7c6056..00000000000 --- a/springfox-oas/src/main/java/springfox/documentation/oas/mappers/ExamplesMapper.java +++ /dev/null @@ -1,38 +0,0 @@ -package springfox.documentation.oas.mappers; - -import org.mapstruct.AfterMapping; -import org.mapstruct.Mapper; -import org.mapstruct.Mapping; -import org.mapstruct.MappingTarget; -import org.mapstruct.Mappings; -import springfox.documentation.schema.Example; - -import java.util.Collection; -import java.util.Map; -import java.util.TreeMap; - -@Mapper(componentModel = "spring", uses = VendorExtensionsMapper.class) -public interface ExamplesMapper { - default Map mapExamples(Collection from) { - Map examples = new TreeMap<>(); - for (Example each : from) { - examples.put( - each.getId(), - toOasExample(each)); - } - return examples; - } - - @AfterMapping - default void afterMappingParameter( - Example from, - @MappingTarget io.swagger.v3.oas.models.examples.Example target) { - target.extensions(new VendorExtensionsMapper().mapExtensions(from.getExtensions())); - } - - @Mappings({ - @Mapping(target = "$ref", ignore = true), - @Mapping(target = "extensions", ignore = true) - }) - io.swagger.v3.oas.models.examples.Example toOasExample(Example from); -} diff --git a/springfox-oas/src/main/java/springfox/documentation/oas/mappers/LicenseMapper.java b/springfox-oas/src/main/java/springfox/documentation/oas/mappers/LicenseMapper.java deleted file mode 100644 index 896164c4448..00000000000 --- a/springfox-oas/src/main/java/springfox/documentation/oas/mappers/LicenseMapper.java +++ /dev/null @@ -1,53 +0,0 @@ -/* - * - * Copyright 2017-2018 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ -package springfox.documentation.oas.mappers; - -import org.mapstruct.Mapper; -import org.mapstruct.Qualifier; -import springfox.documentation.service.ApiInfo; - -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -@Mapper(componentModel = "spring", implementationName = "OasLicenceMapper") -public class LicenseMapper { - - @License - public io.swagger.v3.oas.models.info.License apiInfoToLicense(ApiInfo from) { - if (from.getLicense() == null && from.getLicenseUrl() == null) { - return null; - } - return new io.swagger.v3.oas.models.info.License().name(from.getLicense()).url(from.getLicenseUrl()); - } - - - @Qualifier - @Target(ElementType.TYPE) - @Retention(RetentionPolicy.SOURCE) - @interface LicenseTranslator { - } - - @Qualifier - @Target(ElementType.METHOD) - @Retention(RetentionPolicy.SOURCE) - public @interface License { - } -} \ No newline at end of file diff --git a/springfox-oas/src/main/java/springfox/documentation/oas/mappers/MapSchema.java b/springfox-oas/src/main/java/springfox/documentation/oas/mappers/MapSchema.java deleted file mode 100644 index a7fa99d628c..00000000000 --- a/springfox-oas/src/main/java/springfox/documentation/oas/mappers/MapSchema.java +++ /dev/null @@ -1,67 +0,0 @@ -/** - * Copyright 2017 SmartBear Software - *

- * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - *

- * http://www.apache.org/licenses/LICENSE-2.0 - *

- * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package springfox.documentation.oas.mappers; - -import io.swagger.v3.oas.models.media.Schema; - -import java.util.Objects; - -/** - * MapSchema - */ - -public class MapSchema extends Schema { - - private Schema type; - - public MapSchema() { - super("object", null); - } - - public MapSchema type(Schema type) { - this.type = type; - return this; - } - - @Override - public boolean equals(java.lang.Object o) { - if (this == o) { - return true; - } - if (o == null || getClass() != o.getClass()) { - return false; - } - if (((MapSchema) o).type != this.type) { - return false; - } - return super.equals(o); - } - - @Override - public int hashCode() { - return Objects.hash(this.type); - } - - @Override - public String toString() { - StringBuilder sb = new StringBuilder(); - sb.append("class MapSchema {\n"); - sb.append(" ").append(this.type.toString()).append("\n"); - sb.append("}"); - return sb.toString(); - } -} diff --git a/springfox-oas/src/main/java/springfox/documentation/oas/mappers/MapSpecificationToSchemaConverter.java b/springfox-oas/src/main/java/springfox/documentation/oas/mappers/MapSpecificationToSchemaConverter.java deleted file mode 100644 index 6a6c3dfbc6d..00000000000 --- a/springfox-oas/src/main/java/springfox/documentation/oas/mappers/MapSpecificationToSchemaConverter.java +++ /dev/null @@ -1,23 +0,0 @@ -package springfox.documentation.oas.mappers; - -import io.swagger.v3.oas.models.media.MapSchema; -import io.swagger.v3.oas.models.media.Schema; -import org.mapstruct.factory.Mappers; -import org.springframework.core.convert.converter.Converter; -import springfox.documentation.schema.MapSpecification; -import springfox.documentation.service.ModelNamesRegistry; - -public class MapSpecificationToSchemaConverter implements Converter> { - private final ModelNamesRegistry modelNamesRegistry; - - public MapSpecificationToSchemaConverter(ModelNamesRegistry modelNamesRegistry) { - this.modelNamesRegistry = modelNamesRegistry; - } - - @Override - public Schema convert(MapSpecification source) { - Schema schema = Mappers.getMapper(SchemaMapper.class) - .mapFrom(source.getValue(), modelNamesRegistry); - return new MapSchema().additionalProperties(schema); - } -} diff --git a/springfox-oas/src/main/java/springfox/documentation/oas/mappers/ModelSpecificationInheritanceDeterminer.java b/springfox-oas/src/main/java/springfox/documentation/oas/mappers/ModelSpecificationInheritanceDeterminer.java deleted file mode 100644 index 241bb56a719..00000000000 --- a/springfox-oas/src/main/java/springfox/documentation/oas/mappers/ModelSpecificationInheritanceDeterminer.java +++ /dev/null @@ -1,44 +0,0 @@ -package springfox.documentation.oas.mappers; - -import io.swagger.v3.oas.models.media.ObjectSchema; -import io.swagger.v3.oas.models.media.Schema; -import springfox.documentation.schema.CompoundModelSpecification; -import springfox.documentation.schema.ModelKey; -import springfox.documentation.schema.ModelSpecification; -import springfox.documentation.schema.ReferenceModelSpecification; -import springfox.documentation.service.ModelNamesRegistry; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashMap; -import java.util.Map; -import java.util.Optional; - -public class ModelSpecificationInheritanceDeterminer { - private final ModelNamesRegistry namesRegistry; - private final Map parentLookup = new HashMap<>(); - - public ModelSpecificationInheritanceDeterminer(ModelNamesRegistry namesRegistry) { - this.namesRegistry = namesRegistry; - for (ModelSpecification each : namesRegistry.modelsByName().values()) { - Collection subclasses - = each.getCompound() - .map(CompoundModelSpecification::getSubclassReferences) - .orElse(new ArrayList<>()); - for (ReferenceModelSpecification children : subclasses) { - toRefModel(each).ifPresent(rm -> parentLookup.put(children.getKey(), rm)); - } - } - } - - private Optional toRefModel(ModelSpecification each) { - return each.key() - .flatMap(k -> - namesRegistry.nameByKey(k) - .map(n -> new ObjectSchema().$ref(n).type(null))); - } - - public Optional parent(ModelSpecification source) { - return source.key().map(parentLookup::get); - } -} \ No newline at end of file diff --git a/springfox-oas/src/main/java/springfox/documentation/oas/mappers/ReferenceModelSpecificationToSchemaConverter.java b/springfox-oas/src/main/java/springfox/documentation/oas/mappers/ReferenceModelSpecificationToSchemaConverter.java deleted file mode 100644 index 02b6dacdd3d..00000000000 --- a/springfox-oas/src/main/java/springfox/documentation/oas/mappers/ReferenceModelSpecificationToSchemaConverter.java +++ /dev/null @@ -1,31 +0,0 @@ -package springfox.documentation.oas.mappers; - -import io.swagger.v3.oas.models.media.ObjectSchema; -import io.swagger.v3.oas.models.media.Schema; -import org.springframework.core.convert.converter.Converter; -import springfox.documentation.schema.QualifiedModelName; -import springfox.documentation.schema.ReferenceModelSpecification; -import springfox.documentation.service.ModelNamesRegistry; - -public class ReferenceModelSpecificationToSchemaConverter implements Converter> { - private final ModelNamesRegistry modelNamesRegistry; - - public ReferenceModelSpecificationToSchemaConverter(ModelNamesRegistry modelNamesRegistry) { - this.modelNamesRegistry = modelNamesRegistry; - } - - @Override - public Schema convert(ReferenceModelSpecification source) { - ObjectSchema objectSchema = new ObjectSchema(); - - QualifiedModelName qualifiedModelName = source.getKey().getQualifiedModelName(); - if ("java.lang".equals(qualifiedModelName.getNamespace()) - && "object".equals(qualifiedModelName.getName())) { - return objectSchema; - } - return objectSchema - .type(null) - .$ref(modelNamesRegistry.nameByKey(source.getKey()) - .orElse("Error-" + qualifiedModelName)); - } -} diff --git a/springfox-oas/src/main/java/springfox/documentation/oas/mappers/ScalarModelToSchemaConverter.java b/springfox-oas/src/main/java/springfox/documentation/oas/mappers/ScalarModelToSchemaConverter.java deleted file mode 100644 index 75ccfd1f5ba..00000000000 --- a/springfox-oas/src/main/java/springfox/documentation/oas/mappers/ScalarModelToSchemaConverter.java +++ /dev/null @@ -1,54 +0,0 @@ -package springfox.documentation.oas.mappers; - -import io.swagger.v3.oas.models.media.BinarySchema; -import io.swagger.v3.oas.models.media.BooleanSchema; -import io.swagger.v3.oas.models.media.ByteArraySchema; -import io.swagger.v3.oas.models.media.DateSchema; -import io.swagger.v3.oas.models.media.DateTimeSchema; -import io.swagger.v3.oas.models.media.IntegerSchema; -import io.swagger.v3.oas.models.media.NumberSchema; -import io.swagger.v3.oas.models.media.ObjectSchema; -import io.swagger.v3.oas.models.media.Schema; -import io.swagger.v3.oas.models.media.StringSchema; -import io.swagger.v3.oas.models.media.UUIDSchema; -import org.springframework.core.convert.converter.Converter; -import springfox.documentation.schema.ScalarModelSpecification; -import springfox.documentation.schema.ScalarType; - -import java.util.HashMap; -import java.util.Map; -import java.util.function.Function; - -public class ScalarModelToSchemaConverter implements Converter> { - private static final Map>> - SCALAR_SCHEMA_FACTORY = new HashMap<>(); - - static { - SCALAR_SCHEMA_FACTORY.put(ScalarType.STRING, any -> new StringSchema()); - SCALAR_SCHEMA_FACTORY.put(ScalarType.BYTE, any -> new ByteArraySchema()); - SCALAR_SCHEMA_FACTORY.put(ScalarType.INTEGER, any -> new IntegerSchema()); - SCALAR_SCHEMA_FACTORY.put(ScalarType.LONG, any -> new IntegerSchema().format("int64")); - SCALAR_SCHEMA_FACTORY.put(ScalarType.BIGINTEGER, any -> new NumberSchema()); - SCALAR_SCHEMA_FACTORY.put(ScalarType.BIGDECIMAL, any -> new NumberSchema()); - SCALAR_SCHEMA_FACTORY.put(ScalarType.DOUBLE, any -> new NumberSchema()); - SCALAR_SCHEMA_FACTORY.put(ScalarType.FLOAT, any -> new NumberSchema()); - SCALAR_SCHEMA_FACTORY.put(ScalarType.BOOLEAN, any -> new BooleanSchema()); - SCALAR_SCHEMA_FACTORY.put(ScalarType.BINARY, any -> new BinarySchema()); - SCALAR_SCHEMA_FACTORY.put(ScalarType.DATE, any -> new DateSchema()); - SCALAR_SCHEMA_FACTORY.put(ScalarType.DATE_TIME, any -> new DateTimeSchema()); - SCALAR_SCHEMA_FACTORY.put(ScalarType.UUID, any -> new UUIDSchema()); - SCALAR_SCHEMA_FACTORY.put(ScalarType.URL, any -> new StringSchema().format("url")); - SCALAR_SCHEMA_FACTORY.put(ScalarType.URI, any -> new StringSchema().format("uri")); - SCALAR_SCHEMA_FACTORY.put(ScalarType.OBJECT, any -> new ObjectSchema()); - SCALAR_SCHEMA_FACTORY.put(ScalarType.PASSWORD, any -> new StringSchema().format("password")); - SCALAR_SCHEMA_FACTORY.put(ScalarType.EMAIL, any -> new StringSchema().format("email")); - SCALAR_SCHEMA_FACTORY.put(ScalarType.CURRENCY, any -> new NumberSchema().format("bigdecimal")); - } - - @Override - public Schema convert(ScalarModelSpecification source) { - return SCALAR_SCHEMA_FACTORY - .getOrDefault(source.getType(), any -> null) - .apply(source); - } -} diff --git a/springfox-oas/src/main/java/springfox/documentation/oas/mappers/SchemaMapper.java b/springfox-oas/src/main/java/springfox/documentation/oas/mappers/SchemaMapper.java deleted file mode 100644 index d3e7c090f04..00000000000 --- a/springfox-oas/src/main/java/springfox/documentation/oas/mappers/SchemaMapper.java +++ /dev/null @@ -1,444 +0,0 @@ -package springfox.documentation.oas.mappers; - -import io.swagger.v3.oas.models.media.ArraySchema; -import io.swagger.v3.oas.models.media.ComposedSchema; -import io.swagger.v3.oas.models.media.IntegerSchema; -import io.swagger.v3.oas.models.media.NumberSchema; -import io.swagger.v3.oas.models.media.ObjectSchema; -import io.swagger.v3.oas.models.media.Schema; -import io.swagger.v3.oas.models.media.StringSchema; -import io.swagger.v3.oas.models.media.XML; -import org.mapstruct.Context; -import org.mapstruct.Mapper; -import org.mapstruct.Named; -import springfox.documentation.schema.CollectionElementFacet; -import springfox.documentation.schema.ElementFacetSource; -import springfox.documentation.schema.EnumerationFacet; -import springfox.documentation.schema.ModelFacets; -import springfox.documentation.schema.ModelSpecification; -import springfox.documentation.schema.NumericElementFacet; -import springfox.documentation.schema.PropertySpecification; -import springfox.documentation.schema.StringElementFacet; -import springfox.documentation.service.ApiListing; -import springfox.documentation.service.ModelNamesRegistry; - -import java.math.BigDecimal; -import java.util.Comparator; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.Optional; -import java.util.TreeMap; -import java.util.function.Function; -import java.util.stream.Collectors; - -import static java.util.Collections.*; -import static java.util.Optional.*; -import static java.util.stream.Collectors.*; -import static springfox.documentation.builders.BuilderDefaults.*; - -@SuppressWarnings("rawtypes") -@Mapper(componentModel = "spring") -public abstract class SchemaMapper { - @Named("ModelsMapping") - public Map modelsFromApiListings(Map> apiListings) { - Map modelMap = new TreeMap<>(); - apiListings.values() - .forEach(listings -> listings - .forEach(each -> modelMap.putAll( - mapModels(each.getModelSpecifications(), each.getModelNamesRegistry())))); - return modelMap; - } - - protected Map mapModels( - Map specifications, - ModelNamesRegistry modelNamesRegistry) { - if (specifications == null) { - return null; - } - - Map map = new HashMap<>(Math.max((int) (specifications.size() / .75f) + 1, 16)); - - for (java.util.Map.Entry entry : specifications.entrySet()) { - String key = entry.getKey(); - Schema value = mapModel(entry.getValue(), modelNamesRegistry); - map.put(key, value); - } - - return map; - } - - @Named("ModelsMapping") - public Schema mapModel( - ModelSpecification source, - @Context ModelNamesRegistry namesRegistry) { - if (source == null) { - return null; - } - ModelSpecificationInheritanceDeterminer determiner = new ModelSpecificationInheritanceDeterminer(namesRegistry); - return determiner.parent(source) - .map(rm -> mapComposedModel( - rm, - source, - namesRegistry)) - .orElse(model(source, namesRegistry)); - } - - @SuppressWarnings({ - "CyclomaticComplexity", - "NPathComplexity", - "JavaNCSS", "unchecked"}) - private Schema model( - ModelSpecification source, - @Context ModelNamesRegistry namesRegistry) { - Optional facets = source.getFacets(); - Schema model = mapFrom(source, namesRegistry) - .description(facets.map(ModelFacets::getDescription).orElse(null)) -// .discriminator(source.getCompound() -// .map(CompoundModelSpecification::getDiscriminator) -// .orElse(null)) //TODO: Some work here - .example(facets.map(ModelFacets::getExamples).orElse(EMPTY_LIST).stream() - .findFirst().orElse(null)) - .name(source.getName()) - .xml(facets.map(ModelFacets::getXml).map(this::mapXml).orElse(null)); - - source.getCompound() - .ifPresent(c -> { - Map modelProperties = new TreeMap<>(Comparator.naturalOrder()); - Map properties = c.getProperties().stream() - .collect(toMap( - PropertySpecification::getName, - Function.identity())); - modelProperties.putAll(mapProperties(properties, namesRegistry)); - model.setProperties(modelProperties); - List requiredFields = properties.values().stream() - .filter(PropertySpecification::nullSafeIsRequired) - .map(PropertySpecification::getName) - .filter(Objects::nonNull) - .collect(toList()); - model.setRequired(requiredFields); - model.setType("object"); - model.setTitle(facets.map(ModelFacets::getTitle).orElse(null)); - }); - - - source.getScalar() - .ifPresent(s -> { - model.setType(s.getType().getType()); - model.setFormat(s.getType().getFormat()); - facets.flatMap(mf -> mf.elementFacet(EnumerationFacet.class)) - .ifPresent(ef -> model.setEnum(ef.getAllowedValues())); - facets.flatMap(mf -> mf.elementFacet(StringElementFacet.class)) - .ifPresent(sf -> { - model.setPattern(sf.getPattern()); - model.setMinLength(sf.getMinLength()); - model.setMaxLength(sf.getMaxLength()); - }); - facets.flatMap(mf -> mf.elementFacet(NumericElementFacet.class)) - .ifPresent(nf -> { - model.maximum(nf.getMaximum()); - model.minimum(nf.getMinimum()); - model.setExclusiveMaximum(nf.getExclusiveMaximum()); - model.setExclusiveMinimum(nf.getExclusiveMinimum()); - }); - }); - - source.getReference() - .ifPresent(r -> { - if (emptyToNull(r.getKey().getQualifiedModelName().getName()) != null) { //TODO: Find out why - ObjectSchema refModel = new ObjectSchema(); - refModel.type(null); - refModel.set$ref(namesRegistry.nameByKey(r.getKey()) - .orElse("ERROR - " + r.getKey().getQualifiedModelName())); - } - }); - - source.getCollection() - .ifPresent(c -> { - ModelSpecification itemSpec = c.getModel(); - ArraySchema arrayModel = new ArraySchema(); - arrayModel.description(facets.map(ModelFacets::getDescription).orElse(null)); - arrayModel.setExample(facets.map(ModelFacets::getExamples).orElse(EMPTY_LIST).stream() - .findFirst() - .orElse(null)); - if (itemSpec.getScalar().isPresent()) { - arrayModel.items( - new ScalarModelToSchemaConverter() - .convert(itemSpec.getScalar().get())); - } else if (itemSpec.getCompound().isPresent()) { - arrayModel.items( - new CompoundSpecificationToSchemaConverter(namesRegistry) - .convert(itemSpec.getCompound().get())); - } else if (itemSpec.getCollection().isPresent()) { - arrayModel.items( - new CollectionSpecificationToSchemaConverter(namesRegistry) - .convert(itemSpec.getCollection().get())); - } else if (itemSpec.getReference().isPresent()) { - arrayModel.items( - new ReferenceModelSpecificationToSchemaConverter(namesRegistry) - .convert(itemSpec.getReference().get())); - } - facets.flatMap(mf -> mf.elementFacet(CollectionElementFacet.class)) - .ifPresent(cf -> { - arrayModel.setMaxItems(cf.getMaxItems()); - arrayModel.setMinItems(cf.getMinItems()); - arrayModel.setUniqueItems(cf.getUniqueItems()); - }); - }); - - source.getMap() - .ifPresent(map -> { - ModelSpecification valueSpec = map.getValue(); - if (valueSpec.getScalar().isPresent()) { - model.additionalProperties( - new ScalarModelToSchemaConverter() - .convert(valueSpec.getScalar().get())); - } else if (valueSpec.getCompound().isPresent()) { - model.additionalProperties( - new CompoundSpecificationToSchemaConverter(namesRegistry) - .convert(valueSpec.getCompound().get())); - } else if (valueSpec.getCollection().isPresent()) { - model.additionalProperties( - new CollectionSpecificationToSchemaConverter(namesRegistry) - .convert(valueSpec.getCollection().get())); - } else if (valueSpec.getReference().isPresent()) { - model.additionalProperties( - new ReferenceModelSpecificationToSchemaConverter(namesRegistry) - .convert(valueSpec.getReference().get())); - } else { - model.additionalProperties(new ObjectSchema()); - } - }); - - return model; - } - - @SuppressWarnings("unchecked") - private Schema mapComposedModel( - Schema parent, - ModelSpecification source, - ModelNamesRegistry namesRegistry) { - ComposedSchema model = new ComposedSchema() - .addAllOfItem(parent) - .addAllOfItem(model(source, namesRegistry)); - - model.setDescription(source.getFacets().map(ModelFacets::getDescription).orElse(null)); - model.setExample(source.getFacets().map(ModelFacets::getExamples).orElse(EMPTY_LIST) - .stream().findFirst().orElse(null)); - model.setTitle(source.getName()); - - Map properties = source.getCompound() - .map(c -> c.getProperties().stream() - .collect(Collectors.toMap( - PropertySpecification::getName, - Function.identity()))) - .orElse(new HashMap<>()); - Map modelProperties = new TreeMap<>(Comparator.naturalOrder()); - modelProperties.putAll(mapProperties(properties, namesRegistry)); - model.setProperties(modelProperties); - return model; - } - - protected Map mapProperties( - Map properties, - ModelNamesRegistry modelNamesRegistry) { - return properties.entrySet().stream() - .sorted(Map.Entry.comparingByValue( - Comparator.comparing(PropertySpecification::getPosition) - .thenComparing(PropertySpecification::getName))) - .collect(toMap( - Map.Entry::getKey, - e -> fromProperty(e.getValue(), modelNamesRegistry), - (p1, p2) -> p1, - TreeMap::new)); - } - - @SuppressWarnings("unchecked") - private Schema fromProperty( - PropertySpecification source, - ModelNamesRegistry modelNamesRegistry) { - Schema property = model(source.getType(), modelNamesRegistry); - - ModelFacets facets = source.getType().getFacets().orElse(null); - maybeAddFacets(property, facets); - maybeAddFacets(property, source); - - if (property instanceof ArraySchema) { - ArraySchema arrayProperty = (ArraySchema) property; - maybeAddFacets( - arrayProperty.getItems(), - source.getType().getCollection() - .flatMap(c -> c.getModel().getFacets()) - .orElse(null)); - } - - if (property instanceof MapSchema) { - MapSchema mapProperty = (MapSchema) property; - maybeAddFacets( - (Schema) mapProperty.getAdditionalProperties(), - source.getType().getMap() - .flatMap(c -> c.getValue().getFacets()) - .orElse(null)); - } - - if (property instanceof StringSchema) { - StringSchema stringProperty = (StringSchema) property; - stringProperty.setDefault(source.getDefaultValue() != null ? String.valueOf(source.getDefaultValue()) : null); - } - - Map extensions = new VendorExtensionsMapper() - .mapExtensions(source.getVendorExtensions()); - - if (property != null) { - property.setDescription(source.getDescription()); - property.setName(source.getName()); - property.setReadOnly(source.getReadOnly()); -// property.setAllowEmptyValue(source.getAllowEmptyValue()); - property.setExample(source.getExample()); - property.setExtensions(extensions); - property.setXml(mapXml(source.getXml())); - } - - return property; - } - - private XML mapXml(springfox.documentation.schema.Xml xml) { - if (xml == null) { - return null; - } - return new XML() - .name(xml.getName()) - .attribute(xml.getAttribute()) - .namespace(xml.getNamespace()) - .prefix(xml.getPrefix()) - .wrapped(xml.getWrapped()); - } - - public Schema mapFrom( - ModelSpecification modelSpecification, - @Context ModelNamesRegistry modelNamesRegistry) { - Schema schema; - schema = modelSpecification.getScalar() - .map(sm -> new ScalarModelToSchemaConverter().convert(sm)) - .orElse(null); - - if (schema == null) { - schema = modelSpecification.getCompound() - .map(cm -> new CompoundSpecificationToSchemaConverter(modelNamesRegistry).convert(cm)) - .orElse(null); - } - - if (schema == null) { - schema = modelSpecification.getMap() - .map(mm -> new MapSpecificationToSchemaConverter(modelNamesRegistry).convert(mm)) - .orElse(null); - } - - if (schema == null) { - schema = modelSpecification.getCollection() - .map(cm -> new CollectionSpecificationToSchemaConverter(modelNamesRegistry) - .convert(cm)) - .orElse(null); - } - - if (schema == null) { - schema = modelSpecification.getReference() - .filter(r -> emptyToNull(r.getKey().getQualifiedModelName().getName()) != null) - .map(cm -> new ReferenceModelSpecificationToSchemaConverter(modelNamesRegistry) - .convert(cm)) - .orElse(null); - } - - if (schema != null) { - schema.setName(modelSpecification.getName()); - } - - return schema; - } - - - @SuppressWarnings({ - "NPathComplexity", - "CyclomaticComplexity", - "unchecked", - "UnusedReturnValue"}) - static Schema maybeAddFacets( - Schema property, - ElementFacetSource facets) { - if (facets == null) { - return property; - } - facets.elementFacet(EnumerationFacet.class).ifPresent(f -> { - if (property instanceof StringSchema) { - StringSchema stringProperty = (StringSchema) property; - stringProperty.setEnum(f.getAllowedValues()); - } else if (property instanceof IntegerSchema) { - IntegerSchema integerProperty = (IntegerSchema) property; - List convert = convert(f.getAllowedValues(), BigDecimal.class); - integerProperty.setEnum((List) convert); - } else if (property instanceof NumberSchema) { - NumberSchema longProperty = (NumberSchema) property; - longProperty.setEnum(convert(f.getAllowedValues(), BigDecimal.class)); - } - }); - if (property instanceof NumberSchema) { - facets.elementFacet(NumericElementFacet.class).ifPresent(f -> { - NumberSchema numeric = (NumberSchema) property; - numeric.setMaximum(f.getMaximum()); - numeric.exclusiveMaximum(f.getExclusiveMaximum()); - numeric.setMinimum(f.getMinimum()); - numeric.exclusiveMinimum(f.getExclusiveMinimum()); - }); - } - if (property instanceof ArraySchema) { - facets.elementFacet(CollectionElementFacet.class).ifPresent(f -> { - ArraySchema arrayProperty = (ArraySchema) property; - arrayProperty.setMinItems(f.getMinItems()); - arrayProperty.setMaxItems(f.getMaxItems()); - }); - } - if (property instanceof StringSchema) { - StringSchema stringProperty = (StringSchema) property; - facets.elementFacet(StringElementFacet.class).ifPresent(f -> { - stringProperty.maxLength(f.getMaxLength()); - stringProperty.minLength(f.getMinLength()); - if (f.getPattern() != null) { - stringProperty.pattern(f.getPattern()); - } - }); - } - return property; - } - - @SuppressWarnings("SameParameterValue") - private static List convert( - List values, - Class toType) { - return values.stream().map(converterOfType(toType)) - .filter(Optional::isPresent).map(Optional::get) - .collect(toList()); - } - - @SuppressWarnings("unchecked") - private static Function> converterOfType(final Class toType) { - return (Function>) input -> { - try { - if (Integer.class.equals(toType)) { - return (Optional) of(Integer.valueOf(input)); - } else if (Long.class.equals(toType)) { - return (Optional) of(Long.valueOf(input)); - } else if (Double.class.equals(toType)) { - return (Optional) of(Double.valueOf(input)); - } else if (Float.class.equals(toType)) { - return (Optional) of(Float.valueOf(input)); - } else if (BigDecimal.class.equals(toType)) { - return (Optional) of(new BigDecimal(input)); - } - } catch (NumberFormatException ignored) { - } - return empty(); - }; - } - -} diff --git a/springfox-oas/src/main/java/springfox/documentation/oas/mappers/SecurityMapper.java b/springfox-oas/src/main/java/springfox/documentation/oas/mappers/SecurityMapper.java deleted file mode 100644 index 53aabba437a..00000000000 --- a/springfox-oas/src/main/java/springfox/documentation/oas/mappers/SecurityMapper.java +++ /dev/null @@ -1,28 +0,0 @@ -package springfox.documentation.oas.mappers; - -import io.swagger.v3.oas.models.security.SecurityRequirement; -import org.mapstruct.Mapper; -import springfox.documentation.service.AuthorizationScope; - -import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; - -@Mapper(componentModel = "spring", implementationName = "OasSecurityMapperImpl") -public class SecurityMapper { - - public List mapFrom(Map> authorizationScopes) { - return authorizationScopes.entrySet().stream() - .map(SecurityMapper::mapFrom) - .collect(Collectors.toList()); - } - - private static SecurityRequirement mapFrom(Map.Entry> entry) { - SecurityRequirement requirement = new SecurityRequirement(); - return requirement.addList( - entry.getKey(), - entry.getValue().stream() - .map(AuthorizationScope::getScope) - .collect(Collectors.toList())); - } -} diff --git a/springfox-oas/src/main/java/springfox/documentation/oas/mappers/SecuritySchemeMapper.java b/springfox-oas/src/main/java/springfox/documentation/oas/mappers/SecuritySchemeMapper.java deleted file mode 100644 index 249ef6e09d5..00000000000 --- a/springfox-oas/src/main/java/springfox/documentation/oas/mappers/SecuritySchemeMapper.java +++ /dev/null @@ -1,91 +0,0 @@ -package springfox.documentation.oas.mappers; - -import io.swagger.v3.oas.models.security.OAuthFlow; -import io.swagger.v3.oas.models.security.OAuthFlows; -import io.swagger.v3.oas.models.security.Scopes; -import io.swagger.v3.oas.models.security.SecurityScheme; -import org.mapstruct.Mapper; -import springfox.documentation.service.ApiKey; -import springfox.documentation.service.HttpAuthenticationScheme; -import springfox.documentation.service.OAuth2Scheme; -import springfox.documentation.service.OpenIdConnectScheme; - -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Mapper(componentModel = "spring") -public class SecuritySchemeMapper { - Map map(List schemes) { - Map mapped = new HashMap<>(); - schemes.forEach(each -> mapScheme(mapped, each)); - return mapped; - } - - void mapScheme(Map map, springfox.documentation.service.SecurityScheme scheme) { - SecurityScheme mapped = null; - SecurityScheme securityScheme = new SecurityScheme() - .extensions(new VendorExtensionsMapper().mapExtensions(scheme.getVendorExtensions())); - if (scheme instanceof HttpAuthenticationScheme) { - mapped = securityScheme - .type(SecurityScheme.Type.HTTP) - .description(scheme.getDescription()) - .bearerFormat(((HttpAuthenticationScheme) scheme).getBearerFormat()) - .scheme(((HttpAuthenticationScheme) scheme).getScheme()); - } else if (scheme instanceof OAuth2Scheme) { - OAuthFlows flows = new OAuthFlows(); - Scopes scopes = new Scopes(); - ((OAuth2Scheme) scheme).getScopes() - .forEach(s -> scopes.addString(s.getScope(), s.getDescription())); - OAuthFlow flow = new OAuthFlow() - .authorizationUrl(((OAuth2Scheme) scheme).getAuthorizationUrl()) - .refreshUrl(((OAuth2Scheme) scheme).getRefreshUrl()) - .tokenUrl(((OAuth2Scheme) scheme).getTokenUrl()) - .scopes(scopes); - switch (((OAuth2Scheme) scheme).getFlowType()) { - case "password": - flows.password(flow); - break; - case "clientCredentials": - flows.clientCredentials(flow); - break; - case "authorizationCode": - flows.authorizationCode(flow); - break; - case "implicit": - default: - flows.implicit(flow); - break; - } - mapped = securityScheme - .type(SecurityScheme.Type.OAUTH2) - .description(scheme.getDescription()) - .flows(flows); - } else if (scheme instanceof ApiKey) { - mapped = securityScheme - .type(SecurityScheme.Type.APIKEY) - .name(scheme.getName()) - .in(mapIn(((ApiKey) scheme).getPassAs())); - } else if (scheme instanceof OpenIdConnectScheme) { - mapped = securityScheme - .type(SecurityScheme.Type.OPENIDCONNECT) - .name(scheme.getName()) - .openIdConnectUrl(((OpenIdConnectScheme) scheme).getOpenIdConnectUrl()); - } - if (mapped != null) { - map.put(scheme.getName(), mapped); - } - } - - private SecurityScheme.In mapIn(String passAs) { - switch (passAs.toLowerCase()) { - case "header": - return SecurityScheme.In.HEADER; - case "cookie": - return SecurityScheme.In.COOKIE; - case "query": - default: - return SecurityScheme.In.QUERY; - } - } -} diff --git a/springfox-oas/src/main/java/springfox/documentation/oas/mappers/ServiceModelToOpenApiMapper.java b/springfox-oas/src/main/java/springfox/documentation/oas/mappers/ServiceModelToOpenApiMapper.java deleted file mode 100644 index a92ec2ae591..00000000000 --- a/springfox-oas/src/main/java/springfox/documentation/oas/mappers/ServiceModelToOpenApiMapper.java +++ /dev/null @@ -1,406 +0,0 @@ -/* - * - * Copyright 2017-2018 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ -package springfox.documentation.oas.mappers; - -import io.swagger.v3.oas.models.ExternalDocumentation; -import io.swagger.v3.oas.models.OpenAPI; -import io.swagger.v3.oas.models.Operation; -import io.swagger.v3.oas.models.PathItem; -import io.swagger.v3.oas.models.Paths; -import io.swagger.v3.oas.models.headers.Header; -import io.swagger.v3.oas.models.info.Contact; -import io.swagger.v3.oas.models.info.Info; -import io.swagger.v3.oas.models.media.Content; -import io.swagger.v3.oas.models.media.Encoding; -import io.swagger.v3.oas.models.media.MediaType; -import io.swagger.v3.oas.models.media.Schema; -import io.swagger.v3.oas.models.parameters.Parameter; -import io.swagger.v3.oas.models.responses.ApiResponse; -import io.swagger.v3.oas.models.responses.ApiResponses; -import io.swagger.v3.oas.models.servers.Server; -import io.swagger.v3.oas.models.servers.ServerVariable; -import io.swagger.v3.oas.models.servers.ServerVariables; -import io.swagger.v3.oas.models.tags.Tag; -import org.mapstruct.AfterMapping; -import org.mapstruct.Context; -import org.mapstruct.Mapper; -import org.mapstruct.Mapping; -import org.mapstruct.MappingTarget; -import org.mapstruct.Mappings; -import org.mapstruct.Named; -import org.mapstruct.factory.Mappers; -import org.slf4j.Logger; -import org.springframework.http.HttpMethod; -import org.springframework.util.LinkedMultiValueMap; -import org.springframework.util.MultiValueMap; -import springfox.documentation.schema.CollectionElementFacet; -import springfox.documentation.schema.ElementFacet; -import springfox.documentation.schema.EnumerationFacet; -import springfox.documentation.schema.Example; -import springfox.documentation.schema.NumericElementFacet; -import springfox.documentation.schema.StringElementFacet; -import springfox.documentation.service.ApiDescription; -import springfox.documentation.service.ApiInfo; -import springfox.documentation.service.ApiListing; -import springfox.documentation.service.Documentation; -import springfox.documentation.service.ModelNamesRegistry; -import springfox.documentation.service.ParameterStyle; -import springfox.documentation.service.Representation; -import springfox.documentation.service.RequestBody; -import springfox.documentation.service.RequestParameter; -import springfox.documentation.service.SimpleParameterSpecification; - -import java.util.Collection; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Optional; -import java.util.Set; -import java.util.SortedSet; -import java.util.TreeMap; -import java.util.function.Function; -import java.util.stream.Collectors; - -import static org.slf4j.LoggerFactory.*; -import static springfox.documentation.builders.BuilderDefaults.*; - -@Mapper(componentModel = "spring", - uses = { - VendorExtensionsMapper.class, - LicenseMapper.class, - ExamplesMapper.class, - SecurityMapper.class, - SchemaMapper.class, - StyleEnumMapper.class, - SecuritySchemeMapper.class - }) -public abstract class ServiceModelToOpenApiMapper { - private static final Logger LOGGER = getLogger(ServiceModelToOpenApiMapper.class); - - @Mappings({ - @Mapping(target = "openapi", constant = "3.0.3"), - @Mapping(target = "info", source = "resourceListing.info"), - @Mapping(target = "externalDocs", source = "externalDocumentation"), - @Mapping(target = "security", ignore = true), - @Mapping(target = "paths", source = "apiListings", qualifiedByName = {"PathsMapping"}), - @Mapping(target = "components.schemas", source = "apiListings", qualifiedByName = {"ModelsMapping"}), - @Mapping(target = "components.securitySchemes", source = "resourceListing.securitySchemes"), - @Mapping(target = "extensions", source = "vendorExtensions") - }) - public abstract OpenAPI mapDocumentation(Documentation from); - - @Mappings({ - @Mapping(target = "operationId", source = "uniqueId"), - @Mapping(target = "security", source = "securityReferences"), - @Mapping(target = "extensions", source = "vendorExtensions"), - @Mapping(target = "parameters", source = "queryParameters"), - @Mapping(target = "requestBody", source = "body"), - @Mapping(target = "description", source = "notes"), - @Mapping(target = "callbacks", ignore = true), - @Mapping(target = "servers", ignore = true), - @Mapping(target = "externalDocs", ignore = true) - }) - abstract Operation mapOperation( - springfox.documentation.service.Operation from, - @Context ModelNamesRegistry modelNamesRegistry); - - @Mappings({ - @Mapping(target = "schema", source = "parameterSpecification.query"), - @Mapping(target = "content", ignore = true), - @Mapping(target = "example", ignore = true), - @Mapping(target = "in", source = "in.in"), - @Mapping(target = "allowEmptyValue", - expression = - "java(from.getParameterSpecification().getQuery()" - + ".map(q -> q.getAllowEmptyValue())" - + ".orElse(null))"), - @Mapping(target = "style", expression = "java(from.getParameterSpecification().getQuery()" - + ".map(q -> parameterStyle(q.getStyle()))" - + ".orElse(null))"), - @Mapping(target = "explode", - expression = "java(from.getParameterSpecification().getQuery()" - + ".map(q -> q.getExplode())" - + ".orElse(null))"), - @Mapping(target = "allowReserved", - expression = - "java(from.getParameterSpecification().getQuery()" - + ".map(q -> q.getAllowReserved())" - + ".orElse(null))"), - @Mapping(target = "$ref", ignore = true) - }) - abstract Parameter mapParameter( - RequestParameter from, - @Context ModelNamesRegistry modelNamesRegistry); - - @SuppressWarnings("unchecked") - @AfterMapping - public void afterMappingParameter( - RequestParameter from, - @MappingTarget Parameter target) { - from.getParameterSpecification().getQuery().ifPresent(query -> { - for (ElementFacet facet : query.getFacets()) { - if (facet instanceof NumericElementFacet) { - target.getSchema().maximum(((NumericElementFacet) facet).getMaximum()); - target.getSchema().minimum(((NumericElementFacet) facet).getMinimum()); - target.getSchema().exclusiveMaximum(((NumericElementFacet) facet).getExclusiveMaximum()); - target.getSchema().exclusiveMinimum(((NumericElementFacet) facet).getExclusiveMinimum()); - } else if (facet instanceof EnumerationFacet) { - target.getSchema().setEnum(((EnumerationFacet) facet).getAllowedValues()); - } else if (facet instanceof StringElementFacet) { - target.getSchema().setPattern(((StringElementFacet) facet).getPattern()); - target.getSchema().setMaxLength(((StringElementFacet) facet).getMaxLength()); - target.getSchema().setMinLength(((StringElementFacet) facet).getMinLength()); - } else if (facet instanceof CollectionElementFacet) { - target.getSchema().minItems(((CollectionElementFacet) facet).getMinItems()); - target.getSchema().maxItems(((CollectionElementFacet) facet).getMaxItems()); - target.getSchema().uniqueItems(((CollectionElementFacet) facet).getUniqueItems()); - } - } - }); - } - - protected Parameter.StyleEnum parameterStyle(ParameterStyle from) { - if (from != null) { - return Parameter.StyleEnum.valueOf(from.name()); - } - return null; - } - - protected Schema fromSimpleParameter( - Optional value, - @Context ModelNamesRegistry modelNamesRegistry) { - return value.map(s -> Mappers.getMapper(SchemaMapper.class) - .mapModel(s.getModel(), modelNamesRegistry)) - .orElse(null); - } - - protected ApiResponses map( - Set from, - @Context ModelNamesRegistry modelNamesRegistry) { - ApiResponses responses = new ApiResponses(); - for (springfox.documentation.service.Response each : from) { - ApiResponse response = new ApiResponse() - .description(each.getDescription()); - Content content = new Content(); - ExamplesMapper exampleMapper = Mappers.getMapper(ExamplesMapper.class); - MultiValueMap examplesByMediaType - = new LinkedMultiValueMap<>(); - for (Example example : each.getExamples()) { - examplesByMediaType.add(example.getMediaType().orElse("*/*"), example); - } - Map representations - = each.getRepresentations().stream() - .collect(Collectors.toMap( - e -> e.getMediaType().toString(), - Function.identity(), - (o1, o2) -> o1, TreeMap::new)); - Set mediaTypes = new HashSet<>(representations.keySet()); - mediaTypes.addAll(examplesByMediaType.keySet()); - for (String eachMediaType : mediaTypes) { - MediaType mediaType = fromRepresentation( - representations.getOrDefault(eachMediaType, null), - modelNamesRegistry); - if (mediaType == null) { - mediaType = new MediaType(); - } - mediaType.examples(exampleMapper.mapExamples(nullToEmptyList(examplesByMediaType.get(eachMediaType)))); - content.addMediaType( - eachMediaType, - mediaType); - } - response.setContent(content); - response.setHeaders(fromHeaders(each.getHeaders(), modelNamesRegistry)); - new VendorExtensionsMapper() - .mapExtensions(each.getVendorExtensions()) - .forEach(response::addExtension); - responses.put(String.valueOf(each.getCode()), response); - } - return responses; - } - - protected io.swagger.v3.oas.models.parameters.RequestBody map( - RequestBody from, - @Context ModelNamesRegistry modelNamesRegistry) { - if (from == null) { - return null; - } - io.swagger.v3.oas.models.parameters.RequestBody mapped = new io.swagger.v3.oas.models.parameters.RequestBody(); - Content content = new Content(); - for (Representation representation : from.getRepresentations()) { - content.addMediaType( - representation.getMediaType().toString(), - fromRepresentation(representation, modelNamesRegistry)); - } - mapped.content(content); - return mapped; - } - - @Named("PathsMapping") - Paths mapPaths(Map> apiListings) { - Paths paths = new Paths(); - apiListings.values() - .stream() - .flatMap(Collection::stream) - .forEachOrdered(each -> { - for (ApiDescription api : each.getApis()) { - paths.addPathItem( - api.getPath(), - mapOperations( - api, - paths.get(api.getPath()), - each.getModelNamesRegistry())); - } - }); - return paths; - } - - private PathItem mapOperations( - ApiDescription api, - PathItem existingPath, - ModelNamesRegistry modelNamesRegistry) { - PathItem path = existingPath; - if (existingPath == null) { - path = new PathItem(); - } - for (springfox.documentation.service.Operation each : nullToEmptyList(api.getOperations())) { - LOGGER.debug("Mapping operation {}", api.getPath()); - Operation operation = mapOperation(each, modelNamesRegistry); - path.operation( - mapHttpMethod(each.getMethod()), - operation); - } - return path; - } - - private PathItem.HttpMethod mapHttpMethod(HttpMethod method){ - return PathItem.HttpMethod.valueOf(method.name()); - } - - private Content map( - SortedSet value, - ModelNamesRegistry modelNamesRegistry) { - Content content = new Content(); - for (Representation each : value) { - content.addMediaType(each.getMediaType().toString(), fromRepresentation(each, modelNamesRegistry)); - } - return content; - } - - @Mappings({ - @Mapping(target = "schema", source = "model", qualifiedByName = "ModelsMapping"), - @Mapping(target = "encoding", source = "encodings"), - @Mapping(target = "examples", ignore = true), - @Mapping(target = "example", ignore = true), - @Mapping(target = "extensions", source = "model.facetExtensions") - }) - protected abstract MediaType fromRepresentation( - Representation each, - @Context ModelNamesRegistry modelNamesRegistry); - - protected Map fromEncodings( - Collection encodings, - @Context ModelNamesRegistry namesRegistry) { - return encodings.stream() - .collect(Collectors.toMap( - springfox.documentation.service.Encoding::getPropertyRef, - e -> mapEncoding(e, namesRegistry))); - } - - @Mappings({ - @Mapping(target = "style", source = "style", qualifiedByName = { - "StyleEnumSelector", - "EncodingStyleEnum"}) - }) - protected abstract Encoding mapEncoding( - springfox.documentation.service.Encoding from, - @Context ModelNamesRegistry modelNamesRegistry); - - protected Map fromHeaders( - Collection headers, - @Context ModelNamesRegistry modelNamesRegistry) { - return headers.stream() - .collect(Collectors.toMap( - springfox.documentation.service.Header::getName, - h -> mapHeader(h, modelNamesRegistry))); - } - - // - @Mappings({ - @Mapping(target = "style", ignore = true), - @Mapping(target = "deprecated", ignore = true), - @Mapping(target = "explode", ignore = true), - @Mapping(target = "schema", source = "modelSpecification"), - @Mapping(target = "required", source = "required"), - @Mapping(target = "examples", ignore = true), - @Mapping(target = "example", ignore = true), - @Mapping(target = "content", ignore = true), - @Mapping(target = "extensions", ignore = true), - @Mapping(target = "$ref", ignore = true), - }) - protected abstract Header mapHeader( - springfox.documentation.service.Header from, - @Context ModelNamesRegistry modelNamesRegistry); - - @Mappings({ - @Mapping(target = "license", source = "from", - qualifiedBy = { - LicenseMapper.LicenseTranslator.class, - LicenseMapper.License.class}), - @Mapping(target = "contact", source = "from.contact"), - @Mapping(target = "termsOfService", source = "termsOfServiceUrl"), - @Mapping(target = "extensions", source = "vendorExtensions") - }) - protected abstract Info mapApiInfo(ApiInfo from); - - @Mappings({ - @Mapping(target = "extensions", ignore = true) - }) - protected abstract Contact map(springfox.documentation.service.Contact from); - - @Mappings({ - @Mapping(target = "externalDocs", ignore = true), - @Mapping(target = "extensions", source = "vendorExtensions"), - }) - protected abstract Tag mapTag(springfox.documentation.service.Tag from); - - @Mappings({ - @Mapping(target = "extensions", source = "extensions") - }) - protected abstract Server mapServer(springfox.documentation.service.Server from); - - protected ServerVariables serverVariableMap( - Collection serverVariables) { - ServerVariables variables = new ServerVariables(); - variables.putAll(serverVariables.stream() - .collect(Collectors.toMap( - springfox.documentation.service.ServerVariable::getName, - this::mapServerVariable))); - return variables; - } - - @Mappings({ - @Mapping(target = "enum", source = "allowedValues"), - @Mapping(target = "default", source = "defaultValue"), - @Mapping(target = "_enum", ignore = true), - @Mapping(target = "_default", ignore = true) - }) - protected abstract ServerVariable mapServerVariable(springfox.documentation.service.ServerVariable from); - - protected abstract ExternalDocumentation mapExternalDocs(springfox.documentation.common.ExternalDocumentation from); -} diff --git a/springfox-oas/src/main/java/springfox/documentation/oas/mappers/StyleEnumMapper.java b/springfox-oas/src/main/java/springfox/documentation/oas/mappers/StyleEnumMapper.java deleted file mode 100644 index 3c57a20e89d..00000000000 --- a/springfox-oas/src/main/java/springfox/documentation/oas/mappers/StyleEnumMapper.java +++ /dev/null @@ -1,41 +0,0 @@ -package springfox.documentation.oas.mappers; - -import io.swagger.v3.oas.models.headers.Header; -import io.swagger.v3.oas.models.media.Encoding; -import org.mapstruct.Mapper; -import org.mapstruct.MappingConstants; -import org.mapstruct.Named; -import org.mapstruct.ValueMapping; -import org.mapstruct.ValueMappings; -import springfox.documentation.service.ParameterStyle; - -@Mapper(componentModel = "spring") -@Named("StyleEnumSelector") -public abstract class StyleEnumMapper { - - @Named("HeaderStyleEnum") - @ValueMappings({ - @ValueMapping(source = "DEFAULT", target = MappingConstants.NULL), - @ValueMapping(source = "SIMPLE", target = "SIMPLE"), - @ValueMapping(source = "MATRIX", target = MappingConstants.NULL), - @ValueMapping(source = "LABEL", target = MappingConstants.NULL), - @ValueMapping(source = "FORM", target = MappingConstants.NULL), - @ValueMapping(source = "SPACEDELIMITED", target = MappingConstants.NULL), - @ValueMapping(source = "PIPEDELIMITED", target = MappingConstants.NULL), - @ValueMapping(source = "DEEPOBJECT", target = MappingConstants.NULL), - }) - public abstract Header.StyleEnum headerStyle(ParameterStyle from); - - @Named("EncodingStyleEnum") - @ValueMappings({ - @ValueMapping(source = "DEFAULT", target = MappingConstants.NULL), - @ValueMapping(source = "SIMPLE", target = MappingConstants.NULL), - @ValueMapping(source = "MATRIX", target = MappingConstants.NULL), - @ValueMapping(source = "LABEL", target = MappingConstants.NULL), - @ValueMapping(source = "FORM", target = MappingConstants.NULL), - @ValueMapping(source = "SPACEDELIMITED", target = "SPACE_DELIMITED"), - @ValueMapping(source = "PIPEDELIMITED", target = "PIPE_DELIMITED"), - @ValueMapping(source = "DEEPOBJECT", target = "DEEP_OBJECT"), - }) - public abstract Encoding.StyleEnum encodingStyle(ParameterStyle from); -} diff --git a/springfox-oas/src/main/java/springfox/documentation/oas/mappers/VendorExtensionsMapper.java b/springfox-oas/src/main/java/springfox/documentation/oas/mappers/VendorExtensionsMapper.java deleted file mode 100644 index 25bbd8ced6a..00000000000 --- a/springfox-oas/src/main/java/springfox/documentation/oas/mappers/VendorExtensionsMapper.java +++ /dev/null @@ -1,107 +0,0 @@ -/* - * - * Copyright 2015-2019 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ -package springfox.documentation.oas.mappers; - -import org.mapstruct.Mapper; -import springfox.documentation.service.ListVendorExtension; -import springfox.documentation.service.ObjectVendorExtension; -import springfox.documentation.service.StringVendorExtension; -import springfox.documentation.service.VendorExtension; - -import java.util.Collection; -import java.util.HashMap; -import java.util.Map; -import java.util.TreeMap; -import java.util.function.Function; - -import static java.util.stream.Collectors.*; -import static org.springframework.util.StringUtils.*; - -@Mapper(componentModel = "spring", implementationName = "OasVendorExtensionsMapperImpl") -public class VendorExtensionsMapper { - - public Map mapExtensions(Collection from) { - if (from == null) { - return new HashMap<>(); - } - Map extensions = new TreeMap<>(); - Iterable listExtensions = from.stream() - .filter(ListVendorExtension.class::isInstance) - .map(each -> (ListVendorExtension) each) - .collect(toList()); - for (ListVendorExtension each : listExtensions) { - extensions.put( - each.getName(), - each.getValue()); - } - Iterable> objectExtensions = from.stream() - .filter(ObjectVendorExtension.class::isInstance) - .map(each -> (ObjectVendorExtension) each) - .map(toExtensionMap()).collect(toList()); - for (Map each : objectExtensions) { - extensions.putAll(each); - } - Iterable propertyExtensions = from.stream() - .filter(StringVendorExtension.class::isInstance) - .map(each -> (StringVendorExtension) each) - .collect(toList()); - for (StringVendorExtension each : propertyExtensions) { - extensions.put( - each.getName(), - each.getValue()); - } - return extensions; - } - - private Function> toExtensionMap() { - return input -> { - if (!hasLength(input.getName())) { - Map map = new HashMap<>(); - map.put( - input.getName(), - mapExtensions(input.getValue())); - return map; - } - return propertiesAsMap(input); - }; - } - - private Map propertiesAsMap(ObjectVendorExtension input) { - Map properties = new HashMap<>(); - Iterable stringExtensions = - input.getValue().stream() - .filter(StringVendorExtension.class::isInstance) - .map(each -> (StringVendorExtension) each) - .collect(toList()); - for (StringVendorExtension property : stringExtensions) { - properties.put( - property.getName(), - property.getValue()); - } - Iterable objectExtensions = - input.getValue().stream().filter(ObjectVendorExtension.class::isInstance) - .map(each -> (ObjectVendorExtension) each).collect(toList()); - for (ObjectVendorExtension property : objectExtensions) { - properties.put( - property.getName(), - mapExtensions(property.getValue())); - } - return properties; - } -} diff --git a/springfox-oas/src/main/java/springfox/documentation/oas/web/ForwardedHeaderExtractingRequest.java b/springfox-oas/src/main/java/springfox/documentation/oas/web/ForwardedHeaderExtractingRequest.java deleted file mode 100644 index 5c82cfadf4a..00000000000 --- a/springfox-oas/src/main/java/springfox/documentation/oas/web/ForwardedHeaderExtractingRequest.java +++ /dev/null @@ -1,95 +0,0 @@ -/* - * - * Copyright 2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -/* - * ATTRIBUTION: Taken from spring framework codebase - */ -package springfox.documentation.oas.web; - -import jakarta.servlet.http.HttpServletRequest; -import org.springframework.http.HttpRequest; -import org.springframework.http.server.ServletServerHttpRequest; -import org.springframework.web.util.UriComponents; -import org.springframework.web.util.UriComponentsBuilder; -import org.springframework.web.util.UrlPathHelper; - -import java.util.function.Supplier; - -class ForwardedHeaderExtractingRequest { - - private final String scheme; - private final boolean secure; - private final String host; - private final int port; - private final ForwardedPrefixExtractor forwardedPrefixExtractor; - - ForwardedHeaderExtractingRequest( - HttpServletRequest request, - UrlPathHelper pathHelper) { - - HttpRequest httpRequest = new ServletServerHttpRequest(request); - UriComponents uriComponents = UriComponentsBuilder.fromHttpRequest(httpRequest).build(); - int port = uriComponents.getPort(); - - this.scheme = uriComponents.getScheme(); - this.secure = "https".equals(this.scheme); - this.host = uriComponents.getHost(); - this.port = (port == -1 ? (this.secure ? 443 : 80) : port); - - String baseUrl = this.scheme + "://" + this.host + (port == -1 ? "" : ":" + port); - Supplier delegateRequest = () -> request; - this.forwardedPrefixExtractor = new ForwardedPrefixExtractor(delegateRequest, pathHelper, baseUrl); - } - - - public String getScheme() { - return this.scheme; - } - - public String getServerName() { - return this.host; - } - - public int getServerPort() { - return this.port; - } - - public boolean isSecure() { - return this.secure; - } - - public String getContextPath() { - return this.forwardedPrefixExtractor.getContextPath(); - } - - public String getRequestURI() { - return this.forwardedPrefixExtractor.getRequestUri(); - } - - public StringBuffer getRequestURL() { - return this.forwardedPrefixExtractor.getRequestUrl(); - } - - public String adjustedRequestURL() { - return String.format("%s://%s:%s", - getScheme(), - getServerName(), - getServerPort()); - } -} \ No newline at end of file diff --git a/springfox-oas/src/main/java/springfox/documentation/oas/web/ForwardedPrefixExtractor.java b/springfox-oas/src/main/java/springfox/documentation/oas/web/ForwardedPrefixExtractor.java deleted file mode 100644 index bfcfd356659..00000000000 --- a/springfox-oas/src/main/java/springfox/documentation/oas/web/ForwardedPrefixExtractor.java +++ /dev/null @@ -1,122 +0,0 @@ -/* - * - * Copyright 2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -/* - * ATTRIBUTION: Taken from spring framework codebase - */ - -package springfox.documentation.oas.web; - -import org.springframework.web.util.UrlPathHelper; - -import jakarta.servlet.http.HttpServletRequest; -import java.util.Enumeration; -import java.util.function.Supplier; - -/** - * Responsible for the contextPath, requestURI, and requestURL with forwarded - * headers in mind, and also taking into account changes to the path of the - * underlying delegate request (e.g. on a Servlet FORWARD). - */ -class ForwardedPrefixExtractor { - - private final Supplier delegate; - - private final UrlPathHelper pathHelper; - - private final String baseUrl; - - private String actualRequestUri; - - private final String forwardedPrefix; - - private String requestUri; - - private String requestUrl; - - - ForwardedPrefixExtractor( - Supplier delegateRequest, - UrlPathHelper pathHelper, - String baseUrl) { - - this.delegate = delegateRequest; - this.pathHelper = pathHelper; - this.baseUrl = baseUrl; - this.actualRequestUri = delegateRequest.get().getRequestURI(); - - this.forwardedPrefix = initForwardedPrefix(delegateRequest.get()); - this.requestUri = initRequestUri(); - this.requestUrl = initRequestUrl(); // Keep the order: depends on requestUri - } - - private static String initForwardedPrefix(HttpServletRequest request) { - String result = null; - Enumeration names = request.getHeaderNames(); - while (names.hasMoreElements()) { - String name = names.nextElement(); - if ("X-Forwarded-Prefix".equalsIgnoreCase(name)) { - result = request.getHeader(name); - } - } - if (result != null) { - while (result.endsWith("/")) { - result = result.substring(0, result.length() - 1); - } - } - return result; - } - - private String initRequestUri() { - if (this.forwardedPrefix != null) { - return this.forwardedPrefix + this.pathHelper.getPathWithinApplication(this.delegate.get()); - } - return null; - } - - private String initRequestUrl() { - return this.baseUrl + (this.requestUri != null ? this.requestUri : this.delegate.get().getRequestURI()); - } - - - public String getContextPath() { - return this.forwardedPrefix == null ? this.delegate.get().getContextPath() : this.forwardedPrefix; - } - - public String getRequestUri() { - if (this.requestUri == null) { - return this.delegate.get().getRequestURI(); - } - recalculatePathsIfNecessary(); - return this.requestUri; - } - - public StringBuffer getRequestUrl() { - recalculatePathsIfNecessary(); - return new StringBuffer(this.requestUrl); - } - - private void recalculatePathsIfNecessary() { - if (!this.actualRequestUri.equals(this.delegate.get().getRequestURI())) { - // Underlying path change (e.g. Servlet FORWARD). - this.actualRequestUri = this.delegate.get().getRequestURI(); - this.requestUri = initRequestUri(); - this.requestUrl = initRequestUrl(); // Keep the order: depends on requestUri - } - } -} diff --git a/springfox-oas/src/main/java/springfox/documentation/oas/web/OpenApiControllerWebFlux.java b/springfox-oas/src/main/java/springfox/documentation/oas/web/OpenApiControllerWebFlux.java deleted file mode 100644 index 8b098064c6d..00000000000 --- a/springfox-oas/src/main/java/springfox/documentation/oas/web/OpenApiControllerWebFlux.java +++ /dev/null @@ -1,98 +0,0 @@ -/* - * - * Copyright 2017-2018 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.oas.web; - -import io.swagger.v3.oas.models.OpenAPI; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication; -import org.springframework.context.annotation.Conditional; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.http.server.reactive.ServerHttpRequest; -import org.springframework.plugin.core.PluginRegistry; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RestController; -import springfox.documentation.annotations.ApiIgnore; -import springfox.documentation.oas.mappers.ServiceModelToOpenApiMapper; -import springfox.documentation.service.Documentation; -import springfox.documentation.spi.DocumentationType; -import springfox.documentation.spring.web.DocumentationCache; -import springfox.documentation.spring.web.OnReactiveWebApplication; -import springfox.documentation.spring.web.json.Json; -import springfox.documentation.spring.web.json.JsonSerializer; -import springfox.documentation.spring.web.plugins.Docket; - -import java.util.List; -import java.util.Optional; - -import static org.springframework.util.MimeTypeUtils.*; -import static springfox.documentation.oas.web.SpecGeneration.*; - -@ApiIgnore -@RestController -@RequestMapping(OPEN_API_SPECIFICATION_PATH) -@ConditionalOnWebApplication(type = ConditionalOnWebApplication.Type.REACTIVE) -@Conditional(OnReactiveWebApplication.class) -public class OpenApiControllerWebFlux { - - private final DocumentationCache documentationCache; - private final ServiceModelToOpenApiMapper mapper; - private final JsonSerializer jsonSerializer; - private final PluginRegistry transformations; - - @Autowired - public OpenApiControllerWebFlux( - DocumentationCache documentationCache, - ServiceModelToOpenApiMapper mapper, - JsonSerializer jsonSerializer, - @Qualifier("webFluxOpenApiTransformationFilterRegistry") - PluginRegistry transformations) { - this.documentationCache = documentationCache; - this.mapper = mapper; - this.jsonSerializer = jsonSerializer; - this.transformations = transformations; - } - - @GetMapping( - produces = { - APPLICATION_JSON_VALUE, - HAL_MEDIA_TYPE}) - public ResponseEntity getDocumentation( - @RequestParam(value = "group", required = false) String swaggerGroup, - ServerHttpRequest serverRequest) { - String groupName = Optional.ofNullable(swaggerGroup).orElse(Docket.DEFAULT_GROUP_NAME); - Documentation documentation = documentationCache.documentationByGroup(groupName); - if (documentation == null) { - return new ResponseEntity<>(HttpStatus.NOT_FOUND); - } - OpenAPI oas = mapper.mapDocumentation(documentation); - OpenApiTransformationContext context - = new OpenApiTransformationContext<>(oas, serverRequest); - List filters = transformations.getPluginsFor(DocumentationType.SWAGGER_2); - for (WebFluxOpenApiTransformationFilter each : filters) { - context = context.next(each.transform(context)); - } - return new ResponseEntity<>(jsonSerializer.toJson(context.getSpecification()), HttpStatus.OK); - } - -} diff --git a/springfox-oas/src/main/java/springfox/documentation/oas/web/OpenApiControllerWebMvc.java b/springfox-oas/src/main/java/springfox/documentation/oas/web/OpenApiControllerWebMvc.java deleted file mode 100644 index bce0c018ec9..00000000000 --- a/springfox-oas/src/main/java/springfox/documentation/oas/web/OpenApiControllerWebMvc.java +++ /dev/null @@ -1,100 +0,0 @@ -/* - * - * Copyright 2017-2018 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.oas.web; - -import io.swagger.v3.oas.models.OpenAPI; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication; -import org.springframework.context.annotation.Conditional; -import org.springframework.core.Ordered; -import org.springframework.core.annotation.Order; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.plugin.core.PluginRegistry; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RestController; -import springfox.documentation.annotations.ApiIgnore; -import springfox.documentation.oas.mappers.ServiceModelToOpenApiMapper; -import springfox.documentation.service.Documentation; -import springfox.documentation.spi.DocumentationType; -import springfox.documentation.spring.web.DocumentationCache; -import springfox.documentation.spring.web.OnServletBasedWebApplication; -import springfox.documentation.spring.web.json.Json; -import springfox.documentation.spring.web.json.JsonSerializer; -import springfox.documentation.spring.web.plugins.Docket; - -import jakarta.servlet.http.HttpServletRequest; -import java.util.List; -import java.util.Optional; - -import static org.springframework.util.MimeTypeUtils.*; -import static springfox.documentation.oas.web.SpecGeneration.*; - -@ApiIgnore -@RestController -@RequestMapping(OPEN_API_SPECIFICATION_PATH) -@ConditionalOnWebApplication(type = ConditionalOnWebApplication.Type.SERVLET) -@Conditional(OnServletBasedWebApplication.class) -@Order(Ordered.HIGHEST_PRECEDENCE) -public class OpenApiControllerWebMvc { - - private final DocumentationCache documentationCache; - private final ServiceModelToOpenApiMapper mapper; - private final JsonSerializer jsonSerializer; - private final PluginRegistry transformations; - - @Autowired - public OpenApiControllerWebMvc( - DocumentationCache documentationCache, - ServiceModelToOpenApiMapper mapper, - JsonSerializer jsonSerializer, - @Qualifier("webMvcOpenApiTransformationFilterRegistry") - PluginRegistry transformations) { - this.documentationCache = documentationCache; - this.mapper = mapper; - this.jsonSerializer = jsonSerializer; - this.transformations = transformations; - } - - @GetMapping( - produces = { - APPLICATION_JSON_VALUE, - HAL_MEDIA_TYPE}) - public ResponseEntity getDocumentation( - @RequestParam(value = "group", required = false) String group, - HttpServletRequest servletRequest) { - String groupName = Optional.ofNullable(group).orElse(Docket.DEFAULT_GROUP_NAME); - Documentation documentation = documentationCache.documentationByGroup(groupName); - if (documentation == null) { - return new ResponseEntity<>(HttpStatus.NOT_FOUND); - } - OpenAPI oas = mapper.mapDocumentation(documentation); - OpenApiTransformationContext context - = new OpenApiTransformationContext<>(oas, servletRequest); - List filters = transformations.getPluginsFor(DocumentationType.OAS_30); - for (WebMvcOpenApiTransformationFilter each : filters) { - context = context.next(each.transform(context)); - } - return new ResponseEntity<>(jsonSerializer.toJson(oas), HttpStatus.OK); - } -} diff --git a/springfox-oas/src/main/java/springfox/documentation/oas/web/OpenApiTransformationContext.java b/springfox-oas/src/main/java/springfox/documentation/oas/web/OpenApiTransformationContext.java deleted file mode 100644 index 3972231a28d..00000000000 --- a/springfox-oas/src/main/java/springfox/documentation/oas/web/OpenApiTransformationContext.java +++ /dev/null @@ -1,27 +0,0 @@ -package springfox.documentation.oas.web; - -import io.swagger.v3.oas.models.OpenAPI; - -import java.util.Optional; - -public class OpenApiTransformationContext { - private final OpenAPI specification; - private final T request; - - OpenApiTransformationContext(OpenAPI specification, T request) { - this.specification = specification; - this.request = request; - } - - public OpenAPI getSpecification() { - return specification; - } - - public Optional request() { - return Optional.ofNullable(request); - } - - public OpenApiTransformationContext next(OpenAPI specification) { - return new OpenApiTransformationContext<>(specification, request); - } -} diff --git a/springfox-oas/src/main/java/springfox/documentation/oas/web/OpenApiTransformationFilter.java b/springfox-oas/src/main/java/springfox/documentation/oas/web/OpenApiTransformationFilter.java deleted file mode 100644 index 92c1f48ba09..00000000000 --- a/springfox-oas/src/main/java/springfox/documentation/oas/web/OpenApiTransformationFilter.java +++ /dev/null @@ -1,9 +0,0 @@ -package springfox.documentation.oas.web; - -import io.swagger.v3.oas.models.OpenAPI; -import org.springframework.plugin.core.Plugin; -import springfox.documentation.spi.DocumentationType; - -public interface OpenApiTransformationFilter extends Plugin { - OpenAPI transform(OpenApiTransformationContext context); -} diff --git a/springfox-oas/src/main/java/springfox/documentation/oas/web/SpecGeneration.java b/springfox-oas/src/main/java/springfox/documentation/oas/web/SpecGeneration.java deleted file mode 100644 index 636ba768727..00000000000 --- a/springfox-oas/src/main/java/springfox/documentation/oas/web/SpecGeneration.java +++ /dev/null @@ -1,46 +0,0 @@ -package springfox.documentation.oas.web; - -import io.swagger.v3.oas.models.servers.Server; -import org.slf4j.Logger; - -import java.io.UnsupportedEncodingException; -import java.net.URI; -import java.net.URISyntaxException; -import java.net.URLDecoder; -import java.nio.charset.StandardCharsets; - -import static org.slf4j.LoggerFactory.*; - -public class SpecGeneration { - private static final Logger LOGGER = getLogger(SpecGeneration.class); - public static final String OPEN_API_SPECIFICATION_PATH - = "${springfox.documentation.open-api.v3.path:/v3/api-docs}"; - protected static final String HAL_MEDIA_TYPE = "application/hal+json"; - - private SpecGeneration() { - throw new UnsupportedOperationException(); - } - - public static Server inferredServer( - String requestPrefix, - String requestUrl) { - String serverUrl = requestUrl.replace(requestPrefix, ""); - try { - URI url = new URI(requestUrl); - serverUrl = String.format("%s://%s:%s", url.getScheme(), url.getHost(), url.getPort()); - } catch (URISyntaxException e) { - LOGGER.error("Unable to parse request url:" + requestUrl); - } - return new Server() - .url(serverUrl) - .description("Inferred Url"); - } - - public static String decode(String requestURI) { - try { - return URLDecoder.decode(requestURI, StandardCharsets.UTF_8.toString()); - } catch (UnsupportedEncodingException e) { - return requestURI; - } - } -} diff --git a/springfox-oas/src/main/java/springfox/documentation/oas/web/WebFluxBasePathAndHostnameTransformationFilter.java b/springfox-oas/src/main/java/springfox/documentation/oas/web/WebFluxBasePathAndHostnameTransformationFilter.java deleted file mode 100644 index e525e275c58..00000000000 --- a/springfox-oas/src/main/java/springfox/documentation/oas/web/WebFluxBasePathAndHostnameTransformationFilter.java +++ /dev/null @@ -1,49 +0,0 @@ -package springfox.documentation.oas.web; - -import io.swagger.v3.oas.models.OpenAPI; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.core.Ordered; -import org.springframework.core.annotation.Order; -import org.springframework.http.server.reactive.ServerHttpRequest; -import org.springframework.util.StringUtils; -import org.springframework.web.server.adapter.ForwardedHeaderTransformer; -import springfox.documentation.spi.DocumentationType; - -import java.io.UnsupportedEncodingException; -import java.net.URLDecoder; -import java.nio.charset.StandardCharsets; -import java.util.Collections; - -import static springfox.documentation.oas.web.SpecGeneration.*; - -@Order(Ordered.HIGHEST_PRECEDENCE) -public class WebFluxBasePathAndHostnameTransformationFilter implements WebFluxOpenApiTransformationFilter { - private final String requestPrefix; - - public WebFluxBasePathAndHostnameTransformationFilter(@Value(OPEN_API_SPECIFICATION_PATH) String oasPath) { - this.requestPrefix = StringUtils.trimTrailingCharacter(oasPath, '/'); - } - - @Override - public OpenAPI transform(OpenApiTransformationContext context) { - OpenAPI openApi = context.getSpecification(); - context.request().ifPresent(request -> { - String requestUrl = decode(new ForwardedHeaderTransformer().apply(request).getURI().toString()); - openApi.servers(Collections.singletonList(inferredServer(requestPrefix, requestUrl))); - }); - return openApi; - } - - protected String decode(String requestURI) { - try { - return URLDecoder.decode(requestURI, StandardCharsets.UTF_8.toString()); - } catch (UnsupportedEncodingException e) { - return requestURI; - } - } - - @Override - public boolean supports(DocumentationType delimiter) { - return delimiter == DocumentationType.OAS_30; - } -} diff --git a/springfox-oas/src/main/java/springfox/documentation/oas/web/WebFluxOpenApiTransformationFilter.java b/springfox-oas/src/main/java/springfox/documentation/oas/web/WebFluxOpenApiTransformationFilter.java deleted file mode 100644 index b78ede9e563..00000000000 --- a/springfox-oas/src/main/java/springfox/documentation/oas/web/WebFluxOpenApiTransformationFilter.java +++ /dev/null @@ -1,6 +0,0 @@ -package springfox.documentation.oas.web; - -import org.springframework.http.server.reactive.ServerHttpRequest; - -public interface WebFluxOpenApiTransformationFilter extends OpenApiTransformationFilter { -} diff --git a/springfox-oas/src/main/java/springfox/documentation/oas/web/WebMvcBasePathAndHostnameTransformationFilter.java b/springfox-oas/src/main/java/springfox/documentation/oas/web/WebMvcBasePathAndHostnameTransformationFilter.java deleted file mode 100644 index 25010afac9f..00000000000 --- a/springfox-oas/src/main/java/springfox/documentation/oas/web/WebMvcBasePathAndHostnameTransformationFilter.java +++ /dev/null @@ -1,43 +0,0 @@ -package springfox.documentation.oas.web; - -import io.swagger.v3.oas.models.OpenAPI; -import org.slf4j.Logger; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.core.Ordered; -import org.springframework.core.annotation.Order; -import org.springframework.util.StringUtils; -import org.springframework.web.util.UrlPathHelper; -import springfox.documentation.spi.DocumentationType; - -import jakarta.servlet.http.HttpServletRequest; - -import java.util.Collections; - -import static org.slf4j.LoggerFactory.*; -import static springfox.documentation.oas.web.SpecGeneration.*; - -@Order(Ordered.HIGHEST_PRECEDENCE) -public class WebMvcBasePathAndHostnameTransformationFilter implements WebMvcOpenApiTransformationFilter { - private static final Logger LOGGER = getLogger(WebMvcBasePathAndHostnameTransformationFilter.class); - private final String requestPrefix; - - public WebMvcBasePathAndHostnameTransformationFilter(@Value(OPEN_API_SPECIFICATION_PATH) String oasPath) { - this.requestPrefix = StringUtils.trimTrailingCharacter(oasPath, '/'); - } - - @Override - public OpenAPI transform(OpenApiTransformationContext context) { - OpenAPI openApi = context.getSpecification(); - context.request().ifPresent(servletRequest -> { - ForwardedHeaderExtractingRequest filter - = new ForwardedHeaderExtractingRequest(servletRequest, new UrlPathHelper()); - openApi.servers(Collections.singletonList(inferredServer(requestPrefix, filter.adjustedRequestURL()))); - }); - return openApi; - } - - @Override - public boolean supports(DocumentationType delimiter) { - return delimiter == DocumentationType.OAS_30; - } -} diff --git a/springfox-oas/src/main/java/springfox/documentation/oas/web/WebMvcOpenApiTransformationFilter.java b/springfox-oas/src/main/java/springfox/documentation/oas/web/WebMvcOpenApiTransformationFilter.java deleted file mode 100644 index 838e36ee58b..00000000000 --- a/springfox-oas/src/main/java/springfox/documentation/oas/web/WebMvcOpenApiTransformationFilter.java +++ /dev/null @@ -1,6 +0,0 @@ -package springfox.documentation.oas.web; - -import jakarta.servlet.http.HttpServletRequest; - -public interface WebMvcOpenApiTransformationFilter extends OpenApiTransformationFilter { -} diff --git a/springfox-oas/src/test/groovy/spring/documentation/oas/ComplexTypeSpec.groovy b/springfox-oas/src/test/groovy/spring/documentation/oas/ComplexTypeSpec.groovy deleted file mode 100644 index 4e93359e5e1..00000000000 --- a/springfox-oas/src/test/groovy/spring/documentation/oas/ComplexTypeSpec.groovy +++ /dev/null @@ -1,140 +0,0 @@ -/* - * - * Copyright 2015-2018 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package spring.documentation.oas - -import com.fasterxml.classmate.TypeResolver -import io.swagger.v3.oas.models.media.IntegerSchema -import io.swagger.v3.oas.models.media.NumberSchema -import io.swagger.v3.oas.models.media.ObjectSchema -import io.swagger.v3.oas.models.media.StringSchema -import org.mapstruct.factory.Mappers -import spock.lang.Shared -import spock.lang.Specification -import springfox.documentation.oas.mappers.SchemaMapper -import springfox.documentation.schema.DefaultGenericTypeNamingStrategy -import springfox.documentation.schema.ModelTestingSupport -import springfox.documentation.schema.mixins.ModelProviderSupport - -class ComplexTypeSpec extends Specification implements ModelProviderSupport, ModelTestingSupport, ModelRegistrySupport { - @Shared - def resolver = new TypeResolver() - @Shared - def namingStrategy = new DefaultGenericTypeNamingStrategy() - - def "Property #property on ComplexType is inferred correctly"() { - given: - def provider = defaultModelSpecificationProvider() - def type = complexType() - def (asInput, asReturn, modelNamesRegistry) = - requestResponseAndNamesRegistry(provider, type) - - when: - def request = Mappers.getMapper(SchemaMapper).mapFrom( - asInput, - modelNamesRegistry) - def response = Mappers.getMapper(SchemaMapper).mapFrom( - asReturn, - modelNamesRegistry) - - then: - request.getType() == "object" - request.getName() == "ComplexType" - request.getProperties().containsKey(property) - request.properties[property] == requestType - - response.getType() == "object" - response.getName() == "ComplexType" - response.getProperties().containsKey(property) - response.properties[property] == responseType - - where: - property | requestType | responseType - "name" | new StringSchema() | new StringSchema() - "age" | new IntegerSchema() | new IntegerSchema() - "category" | new ObjectSchema().type(null).$ref("Category") | new ObjectSchema().type(null).$ref("Category") - "customType" | new NumberSchema().format("bigdecimal") | new NumberSchema().format("bigdecimal") - } - - def "recursive type properties are inferred correctly"() { - given: - def complexType = resolver.resolve(recursiveType()) - def provider = defaultModelSpecificationProvider() - def (asInput, asReturn, modelNamesRegistry) = - requestResponseAndNamesRegistry(provider, complexType) - - when: - def request = Mappers.getMapper(SchemaMapper).mapFrom( - asInput, - modelNamesRegistry) - def response = Mappers.getMapper(SchemaMapper).mapFrom( - asReturn, - modelNamesRegistry) - - then: - request.getType() == "object" - request.getName() == "RecursiveType" - request.getProperties().containsKey(property) - request.properties[property] == type - - response.getType() == "object" - response.getName() == "RecursiveType" - response.getProperties().containsKey(property) - response.properties[property] == type - - where: - property | type - "parent" | new ObjectSchema().type(null).$ref("RecursiveType") - } - - def "Inherited property #property is inferred correctly"() { - given: - def complexType = resolver.resolve(inheritedComplexType()) - def provider = defaultModelSpecificationProvider() - def (asInput, asReturn, modelNamesRegistry) = - requestResponseAndNamesRegistry(provider, complexType) - - when: - def request = Mappers.getMapper(SchemaMapper).mapFrom( - asInput, - modelNamesRegistry) - def response = Mappers.getMapper(SchemaMapper).mapFrom( - asReturn, - modelNamesRegistry) - - then: - request.getType() == "object" - request.getName() == "InheritedComplexType" - request.getProperties().containsKey(property) - request.properties[property] == requestType - - response.getType() == "object" - response.getName() == "InheritedComplexType" - response.getProperties().containsKey(property) - response.properties[property] == responseType - - where: - property | requestType | responseType - "name" | new StringSchema() | new StringSchema() - "age" | new IntegerSchema() | new IntegerSchema() - "category" | new ObjectSchema().type(null).$ref("Category")| new ObjectSchema().type(null).$ref("Category") - "customType" | new NumberSchema().format("bigdecimal") | new NumberSchema().format("bigdecimal") - "inheritedProperty" | new StringSchema() | new StringSchema() - } -} diff --git a/springfox-oas/src/test/groovy/spring/documentation/oas/ContainerTypesSpec.groovy b/springfox-oas/src/test/groovy/spring/documentation/oas/ContainerTypesSpec.groovy deleted file mode 100644 index 984f1e75249..00000000000 --- a/springfox-oas/src/test/groovy/spring/documentation/oas/ContainerTypesSpec.groovy +++ /dev/null @@ -1,189 +0,0 @@ -/* - * - * Copyright 2015-2018 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ -package spring.documentation.oas - -import com.fasterxml.classmate.TypeResolver -import io.swagger.v3.oas.models.media.ArraySchema -import io.swagger.v3.oas.models.media.ByteArraySchema -import io.swagger.v3.oas.models.media.IntegerSchema -import io.swagger.v3.oas.models.media.MapSchema -import io.swagger.v3.oas.models.media.ObjectSchema -import io.swagger.v3.oas.models.media.StringSchema -import org.mapstruct.factory.Mappers -import spock.lang.Shared -import spock.lang.Unroll -import springfox.documentation.oas.mappers.SchemaMapper -import springfox.documentation.schema.DefaultGenericTypeNamingStrategy -import springfox.documentation.schema.ModelTestingSupport -import springfox.documentation.schema.SchemaSpecification - -class ContainerTypesSpec extends SchemaSpecification implements ModelTestingSupport, ModelRegistrySupport { - @Shared - def resolver = new TypeResolver() - @Shared - def namingStrategy = new DefaultGenericTypeNamingStrategy() - - @Unroll - def "Model property #property of type List, is inferred correctly"() { - given: - def sut = resolver.resolve(typeWithLists()) - def (asInput, asReturn, modelNamesRegistry) = - requestResponseAndNamesRegistry(modelSpecificationProvider, sut) - - when: - def request = Mappers.getMapper(SchemaMapper).mapFrom( - asInput, - modelNamesRegistry) - def response = Mappers.getMapper(SchemaMapper).mapFrom( - asReturn, - modelNamesRegistry) - - then: - request.getType() == "object" - request.getName() == "ListsContainer" - request.getProperties().containsKey(property) - request.properties[property] == type - - response.getType() == "object" - response.getName() == "ListsContainer" - response.getProperties().containsKey(property) - response.properties[property] == type - - where: - property | type - "complexTypes" | new ArraySchema().items(new ObjectSchema().type(null).$ref("ComplexType")) - "enums" | new ArraySchema().items(new StringSchema()) //TODO: enum - "aliasOfIntegers" | new ArraySchema().items(new IntegerSchema()) - "strings" | new ArraySchema().items(new StringSchema()) - "objects" | new ArraySchema().items(new ObjectSchema()) - "substituted" | new ArraySchema().items(new ObjectSchema().type(null).$ref("Substituted")) - } - - @Unroll - def "Model property #property of type SET, is inferred correctly"() { - given: - def sut = resolver.resolve(typeWithSets()) - def (asInput, asReturn, modelNamesRegistry) = - requestResponseAndNamesRegistry(modelSpecificationProvider, sut) - - when: - def request = Mappers.getMapper(SchemaMapper).mapFrom( - asInput, - modelNamesRegistry) - def response = Mappers.getMapper(SchemaMapper).mapFrom( - asReturn, - modelNamesRegistry) - - then: - request.getType() == "object" - request.getName() == "SetsContainer" - request.getProperties().containsKey(property) - request.properties[property] == type - - response.getType() == "object" - response.getName() == "SetsContainer" - response.getProperties().containsKey(property) - response.properties[property] == type - - where: - property | type - "complexTypes" | new ArraySchema().items(new ObjectSchema().type(null).$ref("ComplexType")).uniqueItems(true) - "enums" | new ArraySchema().items(new StringSchema()).uniqueItems(true) //TODO: enum - "aliasOfIntegers" | new ArraySchema().items(new IntegerSchema()).uniqueItems(true) - "strings" | new ArraySchema().items(new StringSchema()).uniqueItems(true) - "objects" | new ArraySchema().items(new ObjectSchema()).uniqueItems(true) - } - - @Unroll - def "Model properties of type Arrays are inferred correctly for #property"() { - given: - def sut = resolver.resolve(typeWithArrays()) - def (asInput, asReturn, modelNamesRegistry) = requestResponseAndNamesRegistry(modelSpecificationProvider, sut) - - when: - def request = Mappers.getMapper(SchemaMapper).mapFrom( - asInput, - modelNamesRegistry) - def response = Mappers.getMapper(SchemaMapper).mapFrom( - asReturn, - modelNamesRegistry) - - then: - request.getType() == "object" - request.getName() == "ArraysContainer" - request.getProperties().containsKey(property) - request.properties[property] == type - - response.getType() == "object" - response.getName() == "ArraysContainer" - response.getProperties().containsKey(property) - response.properties[property] == type - - where: - property | type - "complexTypes" | new ArraySchema().items(new ObjectSchema().type(null).$ref("ComplexType")) - "enums" | new ArraySchema().items(new StringSchema()) //TODO: enum - "aliasOfIntegers" | new ArraySchema().items(new IntegerSchema()) - "strings" | new ArraySchema().items(new StringSchema()) - "objects" | new ArraySchema().items(new ObjectSchema()) - "bytes" | new ByteArraySchema() - "substituted" | new ArraySchema().items(new ObjectSchema().type(null).$ref("Substituted")) - "arrayOfArrayOfInts" | new ArraySchema().items(new ArraySchema().items(new IntegerSchema())) - "arrayOfListOfStrings" | new ArraySchema().items(new ArraySchema().items(new StringSchema())) - } - - @Unroll - def "Map Model properties #property is inferred correctly for OpenAPI 3.0"() { - given: - def sut = resolver.resolve(mapsContainer()) - - def (asInput, asReturn, modelNamesRegistry) = - requestResponseAndNamesRegistry(modelSpecificationProvider, sut) - - when: - def request = Mappers.getMapper(SchemaMapper).mapFrom( - asInput, - modelNamesRegistry) - def response = Mappers.getMapper(SchemaMapper).mapFrom( - asReturn, - modelNamesRegistry) - - then: - request.getType() == "object" - request.getName() == "MapsContainer" - request.getProperties().containsKey(property) - request.properties[property] == type - - response.getType() == "object" - response.getName() == "MapsContainer" - response.getProperties().containsKey(property) - response.properties[property] == type - - where: - property | type - "enumToSimpleType" | new MapSchema().additionalProperties(new ObjectSchema().type(null).$ref("SimpleType")) - "stringToSimpleType" | new MapSchema().additionalProperties(new ObjectSchema().type(null).$ref("SimpleType")) - "complexToSimpleType" | new MapSchema().additionalProperties(new ObjectSchema().type(null).$ref("SimpleType")) - "complexToString" | new MapSchema().additionalProperties(new StringSchema()) - "mapOfmapOfStringToSimpleType" | new MapSchema().additionalProperties( - new MapSchema().additionalProperties( - new ObjectSchema().type(null).$ref("SimpleType"))) - } -} - \ No newline at end of file diff --git a/springfox-oas/src/test/groovy/spring/documentation/oas/ModelRegistrySupport.groovy b/springfox-oas/src/test/groovy/spring/documentation/oas/ModelRegistrySupport.groovy deleted file mode 100644 index 4597f0c2998..00000000000 --- a/springfox-oas/src/test/groovy/spring/documentation/oas/ModelRegistrySupport.groovy +++ /dev/null @@ -1,69 +0,0 @@ -package spring.documentation.oas - -import com.fasterxml.classmate.TypeResolver -import spock.lang.Shared -import springfox.documentation.schema.AlternateTypesSupport -import springfox.documentation.schema.DefaultGenericTypeNamingStrategy -import springfox.documentation.schema.ModelSpecification -import springfox.documentation.service.ModelNamesRegistry -import springfox.documentation.spring.web.scanners.DefaultModelNamesRegistryFactory -import springfox.documentation.spring.web.scanners.ModelSpecificationRegistryBuilder - -import static java.util.Collections.* -import static springfox.documentation.spi.DocumentationType.* -import static springfox.documentation.spi.schema.contexts.ModelContext.* - -trait ModelRegistrySupport extends AlternateTypesSupport { - def modelRegistryBuilder = new ModelSpecificationRegistryBuilder() - @Shared - def resolver = new TypeResolver() - @Shared - def namingStrategy = new DefaultGenericTypeNamingStrategy() - - ModelNamesRegistry modelNamesRegistry(ModelSpecification... specifications) { - modelNamesRegistry(Arrays.asList(specifications)) - } - - ModelNamesRegistry modelNamesRegistry(Collection specifications) { - specifications.each { - modelRegistryBuilder.add(it) - } - new DefaultModelNamesRegistryFactory().modelNamesRegistry(modelRegistryBuilder.build()) - } - - def requestResponseAndNamesRegistry(provider, type) { - def inputParam = inputParam( - "0_0", - "group", - resolver.resolve(type), - Optional.empty(), - new HashSet<>(), - OAS_30, - alternateTypeProvider(), - namingStrategy, - emptySet()) - def returnParam = returnValue( - "0_0", - "group", - resolver.resolve(type), - Optional.empty(), - OAS_30, - alternateTypeProvider(), - namingStrategy, - emptySet()) - ModelSpecification asInput = provider.modelSpecificationsFor( - inputParam).get() - def inputDependencies = provider.modelDependenciesSpecifications(inputParam) - - ModelSpecification asReturn = provider.modelSpecificationsFor( - returnParam).get() - def returnDependencies = provider.modelDependenciesSpecifications(returnParam) - - def models = [asInput, asReturn] - models.addAll(inputDependencies) - models.addAll(returnDependencies) - - [asInput, asReturn, modelNamesRegistry(models)] - } - -} diff --git a/springfox-oas/src/test/groovy/spring/documentation/oas/SimpleTypeSpec.groovy b/springfox-oas/src/test/groovy/spring/documentation/oas/SimpleTypeSpec.groovy deleted file mode 100644 index e003e1721bf..00000000000 --- a/springfox-oas/src/test/groovy/spring/documentation/oas/SimpleTypeSpec.groovy +++ /dev/null @@ -1,133 +0,0 @@ -/* - * - * Copyright 2015-2018 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ -package spring.documentation.oas - -import com.fasterxml.classmate.TypeResolver -import io.swagger.v3.oas.models.media.BooleanSchema -import io.swagger.v3.oas.models.media.ByteArraySchema -import io.swagger.v3.oas.models.media.DateSchema -import io.swagger.v3.oas.models.media.DateTimeSchema -import io.swagger.v3.oas.models.media.IntegerSchema -import io.swagger.v3.oas.models.media.NumberSchema -import io.swagger.v3.oas.models.media.Schema -import io.swagger.v3.oas.models.media.StringSchema -import io.swagger.v3.oas.models.media.UUIDSchema -import org.mapstruct.factory.Mappers -import spock.lang.Shared -import spock.lang.Unroll -import springfox.documentation.oas.mappers.SchemaMapper -import springfox.documentation.schema.CodeGenGenericTypeNamingStrategy -import springfox.documentation.schema.ModelSpecification -import springfox.documentation.schema.ModelTestingSupport -import springfox.documentation.schema.SchemaSpecification -import springfox.documentation.service.ModelNamesRegistry - -import static java.util.Collections.* -import static springfox.documentation.spi.DocumentationType.* -import static springfox.documentation.spi.schema.contexts.ModelContext.* - -class SimpleTypeSpec extends SchemaSpecification implements ModelTestingSupport, ModelRegistrySupport { - @Shared - def resolver = new TypeResolver() - @Shared - def namingStrategy = new CodeGenGenericTypeNamingStrategy() - - @Unroll - def "simple type is rendered as [#type]"() { - given: - def simpleType = simpleType() - def (asInput, asReturn, modelNamesRegistry) = - requestResponseAndNamesRegistry(modelSpecificationProvider, simpleType) - - when: - def request = Mappers.getMapper(SchemaMapper).mapFrom( - asInput, - modelNamesRegistry) - def response = Mappers.getMapper(SchemaMapper).mapFrom( - asReturn, - modelNamesRegistry) - - then: - request.getType() == "object" - request.getName() == "SimpleType" - request.getProperties().containsKey(property) - request.properties[property] == type - - response.getType() == "object" - response.getName() == "SimpleType" - response.getProperties().containsKey(property) - response.properties[property] == type - - where: - property | type - "aString" | new StringSchema() - "aByte" | new ByteArraySchema() - "aBoolean" | new BooleanSchema() - "aShort" | new IntegerSchema() - "anInt" | new IntegerSchema() - "aLong" | new IntegerSchema().format("int64") - "aFloat" | new NumberSchema() - "aDouble" | new NumberSchema() - "anObjectByte" | new ByteArraySchema() - "anObjectBoolean" | new BooleanSchema() - "anObjectShort" | new IntegerSchema() - "anObjectInt" | new IntegerSchema() - "anObjectLong" | new IntegerSchema().format("int64") - "anObjectFloat" | new NumberSchema() - "anObjectDouble" | new NumberSchema() - "uuid" | new UUIDSchema() - "aDate" | new DateTimeSchema() - "aSqlDate" | new DateSchema() - } - - - def "Types with properties aliased using JsonProperty annotation"() { - given: - def (asInput, asReturn, modelNamesRegistry) = - requestResponseAndNamesRegistry(modelSpecificationProvider, typeWithJsonPropertyAnnotation()) - - when: - def request = Mappers.getMapper(SchemaMapper).mapFrom( - asInput, - modelNamesRegistry) - def response = Mappers.getMapper(SchemaMapper).mapFrom( - asReturn, - modelNamesRegistry) - - then: - request.getType() == "object" - request.getName() == "TypeWithJsonProperty" - request.getProperties().containsKey(property) - request.properties[property] == type - - response.getType() == "object" - response.getName() == "TypeWithJsonProperty" - response.getProperties().containsKey(property) - response.properties[property] == type - - where: - property | type - "some_custom_odd_ball_name" | new StringSchema() - } - - Schema stringSchema(String name) { - new StringSchema() - .name(name) - } -} diff --git a/springfox-petstore-webflux/build.gradle b/springfox-petstore-webflux/build.gradle deleted file mode 100644 index c5a02bdee3b..00000000000 --- a/springfox-petstore-webflux/build.gradle +++ /dev/null @@ -1,13 +0,0 @@ -dependencies { - implementation libs.core - implementation libs.spring - implementation libs.springProvidedWithMvc - compileOnly "org.springframework:spring-webflux:$springWeb" - - implementation libs.swagger2Core - - implementation project(':springfox-spi') - implementation project(':springfox-core') - implementation project(':springfox-spring-web') - implementation project(':springfox-spring-webflux') -} \ No newline at end of file diff --git a/springfox-petstore-webflux/src/main/java/springfox/petstore/webflux/PetStoreConfiguration.java b/springfox-petstore-webflux/src/main/java/springfox/petstore/webflux/PetStoreConfiguration.java deleted file mode 100644 index d388c1cbfb1..00000000000 --- a/springfox-petstore-webflux/src/main/java/springfox/petstore/webflux/PetStoreConfiguration.java +++ /dev/null @@ -1,83 +0,0 @@ -/* - * - * Copyright 2017-2019 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ -package springfox.petstore.webflux; - -import com.fasterxml.classmate.TypeResolver; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.http.ResponseEntity; -import reactor.core.publisher.Flux; -import reactor.core.publisher.Mono; -import springfox.documentation.schema.AlternateTypeRules; -import springfox.documentation.schema.WildcardType; -import springfox.documentation.service.SecurityScheme; -import springfox.documentation.spi.DocumentationType; -import springfox.documentation.spring.web.plugins.Docket; - -import java.util.Arrays; -import java.util.List; -import java.util.stream.Stream; - -import static java.util.stream.Collectors.*; -import static springfox.documentation.builders.PathSelectors.*; - -@Configuration -public class PetStoreConfiguration { - - private final TypeResolver resolver; - - public PetStoreConfiguration(TypeResolver resolver) { - this.resolver = resolver; - } - - @Bean - Docket petstore(List authorizationTypes) { - return new Docket(DocumentationType.SWAGGER_2) - .groupName("petstore") - .useDefaultResponseMessages(false) - .securitySchemes(authorizationTypes) - .produces(Stream.of("application/xml", "application/json").collect(toSet())) - .select() - .paths(( - regex("/api/.*") - .and(regex("/api/store/search.*").negate())) - ) - .build() - .host("petstore.swagger.io") - .protocols(Stream.of("http", "https").collect(toSet())) - .alternateTypeRules(new RecursiveAlternateTypeRule(resolver, - Arrays.asList( - AlternateTypeRules.newRule( - resolver.resolve(Mono.class, WildcardType.class), - resolver.resolve(WildcardType.class)), - AlternateTypeRules.newRule( - resolver.resolve(ResponseEntity.class, WildcardType.class), - resolver.resolve(WildcardType.class)) - ))) - .alternateTypeRules(new RecursiveAlternateTypeRule(resolver, - Arrays.asList( - AlternateTypeRules.newRule( - resolver.resolve(Flux.class, WildcardType.class), - resolver.resolve(List.class, WildcardType.class)), - AlternateTypeRules.newRule( - resolver.resolve(ResponseEntity.class, WildcardType.class), - resolver.resolve(WildcardType.class)) - ))); - } -} diff --git a/springfox-petstore-webflux/src/main/java/springfox/petstore/webflux/RecursiveAlternateTypeRule.java b/springfox-petstore-webflux/src/main/java/springfox/petstore/webflux/RecursiveAlternateTypeRule.java deleted file mode 100644 index a1eacbc9cc7..00000000000 --- a/springfox-petstore-webflux/src/main/java/springfox/petstore/webflux/RecursiveAlternateTypeRule.java +++ /dev/null @@ -1,62 +0,0 @@ -/* - * - * Copyright 2018 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ -package springfox.petstore.webflux; - -import com.fasterxml.classmate.ResolvedType; -import com.fasterxml.classmate.TypeResolver; -import springfox.documentation.schema.AlternateTypeRule; - -import java.util.List; -import java.util.stream.Stream; - -/** - * Modified solution from https://github.com/springfox/springfox/issues/2287 - */ -public class RecursiveAlternateTypeRule extends AlternateTypeRule { - - private final List rules; - - public RecursiveAlternateTypeRule( - TypeResolver typeResolver, - List rules) { - // Unused but cannot be null - super(typeResolver.resolve(Object.class), typeResolver.resolve(Object.class)); - this.rules = rules; - } - - @Override - public ResolvedType alternateFor(ResolvedType type) { - Stream rStream = rules.stream().flatMap(rule -> Stream.of(rule.alternateFor(type))); - ResolvedType newType = rStream.filter(alternateType -> alternateType != type) - .findFirst() - .orElse(type); - - if (appliesTo(newType)) { - // Recursion happens here - return alternateFor(newType); - } - - return newType; - } - - @Override - public boolean appliesTo(ResolvedType type) { - return rules.stream().anyMatch(rule -> rule.appliesTo(type)); - } -} \ No newline at end of file diff --git a/springfox-petstore-webflux/src/main/java/springfox/petstore/webflux/Responses.java b/springfox-petstore-webflux/src/main/java/springfox/petstore/webflux/Responses.java deleted file mode 100644 index 657646272c6..00000000000 --- a/springfox-petstore-webflux/src/main/java/springfox/petstore/webflux/Responses.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * - * Copyright 2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.petstore.webflux; - -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; - -public class Responses { - private Responses() { - throw new UnsupportedOperationException(); - } - - public static ResponseEntity ok() { - return new ResponseEntity(HttpStatus.OK); - } - - public static ResponseEntity notFound() { - return new ResponseEntity(HttpStatus.NOT_FOUND); - } - - public static ResponseEntity ok(T model) { - return new ResponseEntity(model, HttpStatus.OK); - } -} diff --git a/springfox-petstore-webflux/src/main/java/springfox/petstore/webflux/controller/NotFoundException.java b/springfox-petstore-webflux/src/main/java/springfox/petstore/webflux/controller/NotFoundException.java deleted file mode 100644 index dbc1f2bfdeb..00000000000 --- a/springfox-petstore-webflux/src/main/java/springfox/petstore/webflux/controller/NotFoundException.java +++ /dev/null @@ -1,38 +0,0 @@ -/* - * - * Copyright 2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.petstore.webflux.controller; - -public class NotFoundException extends RuntimeException { - private final int errorCode; - private final String errorMessage; - - public NotFoundException(int errorCode, String errorMessage) { - this.errorCode = errorCode; - this.errorMessage = errorMessage; - } - - public int getErrorCode() { - return errorCode; - } - - public String getErrorMessage() { - return errorMessage; - } -} diff --git a/springfox-petstore-webflux/src/main/java/springfox/petstore/webflux/controller/PetController.java b/springfox-petstore-webflux/src/main/java/springfox/petstore/webflux/controller/PetController.java deleted file mode 100644 index b74ab03fd2d..00000000000 --- a/springfox-petstore-webflux/src/main/java/springfox/petstore/webflux/controller/PetController.java +++ /dev/null @@ -1,212 +0,0 @@ -/* - * - * Copyright 2017 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.petstore.webflux.controller; - -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiOperation; -import io.swagger.annotations.ApiParam; -import io.swagger.annotations.ApiResponse; -import io.swagger.annotations.ApiResponses; -import io.swagger.annotations.Authorization; -import io.swagger.annotations.AuthorizationScope; -import io.swagger.annotations.ResponseHeader; -import org.springframework.http.ResponseEntity; -import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; -import reactor.core.publisher.Flux; -import reactor.core.publisher.Mono; -import springfox.petstore.webflux.Responses; -import springfox.petstore.webflux.model.Pet; -import springfox.petstore.webflux.repository.MapBackedRepository; - -import java.util.List; -import java.util.Objects; - -import static org.springframework.http.MediaType.*; -import static org.springframework.web.bind.annotation.RequestMethod.*; - -@Controller -@RequestMapping(value = "/api/pet", produces = { APPLICATION_JSON_VALUE, APPLICATION_XML_VALUE }) -@Api(value = "/pet", description = "Operations about pets") -public class PetController { - - private static final String WRITE_PETS = "write:pets"; - private static final String READ_PETS = "read:pets"; - private static final String PETSTORE_AUTH = "petstore_auth"; - private PetRepository petData = new PetRepository(); - - @RequestMapping(value = "/{petId}", method = GET) - @ApiOperation( - value = "Find pet by ID", notes = "Returns a pet when ID < 10. ID > 10 or non-integers will simulate API " + - "error conditions", - response = Pet.class, - responseHeaders = { - @ResponseHeader(name = "header4", response = String.class), - @ResponseHeader(name = "header3", response = String.class) - }, - authorizations = { - @Authorization(value = "api_key"), - @Authorization(value = PETSTORE_AUTH, scopes = { - @AuthorizationScope(scope = WRITE_PETS, description = ""), - @AuthorizationScope(scope = READ_PETS, description = "") - }) }) - @ApiResponses(value = { - @ApiResponse(code = 400, message = "Invalid ID supplied", responseHeaders = { - @ResponseHeader(name = "header2", response = String.class), - @ResponseHeader(name = "header1", response = String.class) - }), - @ApiResponse(code = 404, message = "Pet not found") } - ) - public Mono> getPetById( - @ApiParam(value = "ID of pet that needs to be fetched", allowableValues = "range[1,5]", required = true) - @PathVariable("petId") String petId) - throws NotFoundException { - Pet pet = petData.get(Long.valueOf(petId)); - if (null != pet) { - return Mono.just(Responses.ok(pet)); - } else { - throw new NotFoundException(404, "Pet not found"); - } - } - - @RequestMapping(method = POST) - @ApiOperation(value = "Add a new pet to the store", - authorizations = @Authorization(value = PETSTORE_AUTH, scopes = { - @AuthorizationScope(scope = WRITE_PETS, description = ""), - @AuthorizationScope(scope = READ_PETS, description = "") - })) - @ApiResponses(value = { @ApiResponse(code = 405, message = "Invalid input") }) - public Mono> addPet( - @ApiParam(value = "Pet object that needs to be added to the store", required = true) @RequestBody Pet pet) { - petData.add(pet); - return Mono.just(Responses.ok("SUCCESS")); - } - - @RequestMapping(method = PUT) - @ApiOperation(value = "Update an existing pet", - authorizations = @Authorization(value = PETSTORE_AUTH, scopes = { - @AuthorizationScope(scope = WRITE_PETS, description = ""), - @AuthorizationScope(scope = READ_PETS, description = "") - })) - @ApiResponses(value = { @ApiResponse(code = 400, message = "Invalid ID supplied"), - @ApiResponse(code = 404, message = "Pet not found"), - @ApiResponse(code = 405, message = "Validation exception") }) - public Mono> updatePet( - @ApiParam(value = "Pet object that needs to be added to the store", required = true) @RequestBody Pet pet) { - petData.add(pet); - return Mono.just(Responses.ok("SUCCESS")); - } - - @RequestMapping(value = "/findByStatus", method = GET) - @ApiOperation( - value = "Finds Pets by status", - notes = "Multiple status values can be provided with comma-separated strings", - response = Pet.class, - responseContainer = "List", - authorizations = @Authorization(value = PETSTORE_AUTH, scopes = { - @AuthorizationScope(scope = WRITE_PETS, description = ""), - @AuthorizationScope(scope = READ_PETS, description = "") - })) - @ApiResponses(value = { @ApiResponse(code = 400, message = "Invalid status value") }) - /** TODO: This renders parameter as - * - "name": "status", - "in": "query", - "description": "Status values that need to be considered for filter", - "required": false, - "type": "array", - "items": {"type": "string"}, - "collectionFormat": "multi", - "default": "available" - */ - public Mono>> findPetsByStatus( - @ApiParam(value = "Status values that need to be considered for filter", - required = true, - defaultValue = "available", - allowableValues = "available,pending,sold", - allowMultiple = true) - @RequestParam("status") String status) { - return Mono.just(Responses.ok(petData.findPetByStatus(status))); - } - - @RequestMapping(value = "/findByTags", method = GET) - @ApiOperation( - value = "Finds Pets by tags", - notes = "Multiple tags can be provided with comma-separated strings. Use tag1, tag2, tag3 for testing.", - response = Pet.class, - responseContainer = "List", - authorizations = @Authorization(value = PETSTORE_AUTH, scopes = { - @AuthorizationScope(scope = WRITE_PETS, description = ""), - @AuthorizationScope(scope = READ_PETS, description = "") - })) - @ApiResponses(value = { @ApiResponse(code = 400, message = "Invalid tag value") }) - @Deprecated - /** TODO: This renders the parameter as - "name": "tags", - "in": "query", - "description": "Tags to filter by", - "required": false, - "type": "array", - "items": {"type": "string"}, - "collectionFormat": "multi" */ - public Flux findPetsByTags( - @ApiParam( - value = "Tags to filter by", - required = true, - allowMultiple = true) - @RequestParam("tags") String tags) { - return Flux.fromIterable(petData.findPetByTags(tags)); - } - - @RequestMapping(value = "/findPetsHidden", method = GET) - @ApiOperation( - value = "Finds Pets (hidden)", - notes = "Hidden method", - response = Pet.class, - responseContainer = "List", - hidden = true, - authorizations = @Authorization(value = PETSTORE_AUTH, scopes = { - @AuthorizationScope(scope = WRITE_PETS, description = ""), - @AuthorizationScope(scope = READ_PETS, description = "") - })) - @ApiResponses(value = { @ApiResponse(code = 400, message = "Invalid tag value") }) - public Mono>> findPetsHidden( - @ApiParam( - value = "Tags to filter by", - required = true, - allowMultiple = true) - @RequestParam("tags") String tags) { - return Mono.just(Responses.ok(petData.findPetByTags(tags))); - } - - static class PetRepository extends MapBackedRepository { - List findPetByStatus(String status) { - return where(input -> Objects.equals(input.getStatus(), status)); - } - - List findPetByTags(String tags) { - return where(input -> input.getTags().stream() - .anyMatch(input1 -> Objects.equals(input1.getName(), tags))); - } - } -} diff --git a/springfox-petstore-webflux/src/main/java/springfox/petstore/webflux/controller/PetStoreResource.java b/springfox-petstore-webflux/src/main/java/springfox/petstore/webflux/controller/PetStoreResource.java deleted file mode 100644 index c3253a681d4..00000000000 --- a/springfox-petstore-webflux/src/main/java/springfox/petstore/webflux/controller/PetStoreResource.java +++ /dev/null @@ -1,106 +0,0 @@ -/* - * - * Copyright 2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.petstore.webflux.controller; - -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiOperation; -import io.swagger.annotations.ApiParam; -import io.swagger.annotations.ApiResponse; -import io.swagger.annotations.ApiResponses; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.ResponseStatus; -import reactor.core.publisher.Mono; -import springfox.petstore.webflux.model.Order; -import springfox.petstore.webflux.model.Pet; -import springfox.petstore.webflux.repository.MapBackedRepository; - -import static org.springframework.http.MediaType.*; -import static org.springframework.web.bind.annotation.RequestMethod.*; -import static springfox.petstore.webflux.Responses.*; - -@Controller -@RequestMapping(value = "/api/store", produces = APPLICATION_JSON_VALUE) -@Api(value = "/store", description = "Operations about store") -public class PetStoreResource { - private static StoreData storeData = new StoreData(); - - private static class StoreData extends MapBackedRepository { - } - - @RequestMapping(value = "/order/{orderId}", method = GET) - @ApiOperation( - value = "Find purchase order by ID", - notes = "For valid response try integer IDs with value <= 5 or > 10. Other values will generated exceptions", - response = Order.class, - tags = { "Pet Store" }) - @ApiResponses(value = { - @ApiResponse(code = 400, message = "Invalid ID supplied"), - @ApiResponse(code = 404, message = "Order not found") }) - public Mono> getOrderById( - @ApiParam(value = "ID of pet that needs to be fetched", allowableValues = "range[1,5]", required = true) - @PathVariable("orderId") String orderId) - throws NotFoundException { - Order order = storeData.get(Long.valueOf(orderId)); - if (null != order) { - return Mono.just(ok(order)); - } else { - throw new NotFoundException(404, "Order not found"); - } - } - - @RequestMapping(value = "/order", method = POST) - @ApiOperation(value = "Place an order for a pet", response = Order.class) - @ApiResponses({ @ApiResponse(code = 400, message = "Invalid Order") }) - public Mono> placeOrder( - @ApiParam(value = "order placed for purchasing the pet", required = true) Order order) { - storeData.add(order); - return Mono.just(ok("")); - } - - @RequestMapping(value = "/order/{orderId}", method = DELETE) - @ApiOperation( - value = "Delete purchase order by ID", notes = "For valid response try integer IDs with value < 1000. " + - "Anything above 1000 or non-integers will generate API errors" - ) - @ApiResponses(value = { @ApiResponse(code = 400, message = "Invalid ID supplied"), - @ApiResponse(code = 404, message = "Order not found") }) - public Mono> deleteOrder( - @ApiParam(value = "ID of the order that needs to be deleted", allowableValues = "range[1,infinity]", required - = true) @PathVariable("orderId") String orderId) { - storeData.delete(Long.valueOf(orderId)); - return Mono.just(ok("")); - } - - @RequestMapping(value = "search", method = GET, produces = "application/json", params = "x=TX") - @ResponseStatus(value = HttpStatus.OK) - public Mono> getPetInTx() { - throw new UnsupportedOperationException(); - } - - @RequestMapping(value = "search", method = GET, produces = "application/json", params = "x=CA") - @ResponseStatus(value = HttpStatus.OK) - public Mono> getPetInCA() { - throw new UnsupportedOperationException(); - } -} diff --git a/springfox-petstore-webflux/src/main/java/springfox/petstore/webflux/controller/UserController.java b/springfox-petstore-webflux/src/main/java/springfox/petstore/webflux/controller/UserController.java deleted file mode 100644 index d031dd04b0b..00000000000 --- a/springfox-petstore-webflux/src/main/java/springfox/petstore/webflux/controller/UserController.java +++ /dev/null @@ -1,153 +0,0 @@ -/* - * - * Copyright 2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.petstore.webflux.controller; - -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiOperation; -import io.swagger.annotations.ApiParam; -import io.swagger.annotations.ApiResponse; -import io.swagger.annotations.ApiResponses; -import org.springframework.http.HttpStatus; -import org.springframework.http.MediaType; -import org.springframework.http.ResponseEntity; -import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.ResponseBody; -import reactor.core.publisher.Mono; -import springfox.petstore.webflux.Responses; -import springfox.petstore.webflux.model.User; -import springfox.petstore.webflux.repository.UserRepository; - -import java.util.List; - -import static org.springframework.web.bind.annotation.RequestMethod.*; - -@Controller -@RequestMapping(value = "/api/user", produces = MediaType.APPLICATION_JSON_VALUE) -@Api(value = "/user", description = "Operations about user") -@SuppressWarnings("unchecked") -public class UserController { - private static final String USERNAME = "username"; - private static final String USER_NOT_FOUND = "User not found"; - private UserRepository userRepository = new UserRepository(); - - @RequestMapping(method = POST) - @ResponseBody - @ApiOperation(value = "Create user", notes = "This can only be done by the logged in user.") - public Mono createUser( - @RequestBody - @ApiParam(value = "Created user object", required = true) User user) { - - userRepository.add(user); - return Mono.just(user); - } - - @RequestMapping(value = "/createWithArray", method = POST) - @ResponseBody - @ApiOperation(value = "Creates list of users with given input array") - public Mono> createUsersWithArrayInput(@ApiParam(value = "List of user object", required = true) - User[] users) { - for (User user : users) { - userRepository.add(user); - } - return Mono.just(Responses.ok()); - } - - @RequestMapping(value = "/createWithList", method = POST) - @ResponseBody - @ApiOperation(value = "Creates list of users with given input array") - public Mono> createUsersWithListInput( - @ApiParam(value = "List of user object", required = true) List users) { - for (User user : users) { - userRepository.add(user); - } - return Mono.just(Responses.ok()); - } - - @RequestMapping(value = "/{username}", method = PUT) - @ResponseBody - @ApiOperation(value = "Updated user", notes = "This can only be done by the logged in user.") - @ApiResponses(value = { - @ApiResponse(code = 400, message = "Invalid user supplied"), - @ApiResponse(code = 404, message = USER_NOT_FOUND) }) - public Mono> updateUser( - @ApiParam(value = "name that need to be deleted", required = true) - @PathVariable(USERNAME) String username, - @ApiParam(value = "Updated user object", required = true) User user) { - if (userRepository.get(username) != null) { - userRepository.add(user); - return Mono.just(Responses.ok()); - } - return Mono.just(Responses.notFound()); - } - - - @RequestMapping(value = "/{username}", method = DELETE) - @ApiOperation(value = "Delete user", notes = "This can only be done by the logged in user.") - @ApiResponses(value = { - @ApiResponse(code = 400, message = "Invalid username supplied"), - @ApiResponse(code = 404, message = USER_NOT_FOUND) }) - public Mono> deleteUser( - @ApiParam(value = "The name that needs to be deleted", required = true) @PathVariable(USERNAME) String - username) { - if (userRepository.exists(username)) { - userRepository.delete(username); - return Mono.just(Responses.ok()); - } - return Mono.just(Responses.notFound()); - - } - - @RequestMapping(value = "/{username}", method = GET) - @ApiOperation(value = "Get user by user name", response = User.class) - @ApiResponses(value = { - @ApiResponse(code = 400, message = "Invalid username supplied"), - @ApiResponse(code = 404, message = USER_NOT_FOUND) }) - public Mono> getUserByName( - @ApiParam(value = "The name that needs to be fetched. Use user1 for testing. ", required = true) - @PathVariable(USERNAME) String username) { - User user = userRepository.get(username); - if (null != user) { - return Mono.just(new ResponseEntity(user, HttpStatus.OK)); - } else { - throw new NotFoundException(404, USER_NOT_FOUND); - } - } - - @RequestMapping(value = "/login", method = GET) - @ApiOperation(value = "Logs user into the system", response = String.class) - @ApiResponses(value = { @ApiResponse(code = 400, message = "Invalid username/password supplied") }) - public Mono> loginUser( - @ApiParam(value = "The user name for login", required = true) - @RequestParam(USERNAME) String username, - @ApiParam(value = "The password for login in clear text", required = true) - @RequestParam("password") String password) { - return Mono.just(new ResponseEntity("logged in user session:" + System.currentTimeMillis(), HttpStatus.OK)); - } - - @RequestMapping(value = "/logout", method = GET) - @ApiOperation(value = "Logs out current logged in user session") - public Mono> logoutUser() { - return Mono.just(Responses.ok()); - } -} diff --git a/springfox-petstore-webflux/src/main/java/springfox/petstore/webflux/model/Category.java b/springfox-petstore-webflux/src/main/java/springfox/petstore/webflux/model/Category.java deleted file mode 100644 index 8f67e2e3c85..00000000000 --- a/springfox-petstore-webflux/src/main/java/springfox/petstore/webflux/model/Category.java +++ /dev/null @@ -1,58 +0,0 @@ -/* - * - * Copyright 2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.petstore.webflux.model; - -import com.fasterxml.jackson.annotation.JsonCreator; -import com.fasterxml.jackson.annotation.JsonProperty; - -public class Category { - private long id; - private String name; - - public Category(long id, String name) { - this.id = id; - this.name = name; - } - - @JsonCreator - public static Category create( - @JsonProperty(value = "id", required = true) long id, - @JsonProperty("name") String name) { - return new Category(id, name); - } - - @JsonProperty - public long getId() { - return id; - } - - public void setId(long id) { - this.id = id; - } - - @JsonProperty - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } -} \ No newline at end of file diff --git a/springfox-petstore-webflux/src/main/java/springfox/petstore/webflux/model/Order.java b/springfox-petstore-webflux/src/main/java/springfox/petstore/webflux/model/Order.java deleted file mode 100644 index 485bdfe5e87..00000000000 --- a/springfox-petstore-webflux/src/main/java/springfox/petstore/webflux/model/Order.java +++ /dev/null @@ -1,88 +0,0 @@ -/* - * - * Copyright 2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.petstore.webflux.model; - -import io.swagger.annotations.ApiModelProperty; -import springfox.petstore.webflux.repository.Identifiable; - -import java.util.Date; - -public class Order implements Identifiable { - private long id; - private long petId; - private int quantity; - private Date shipDate; - private String status; - private boolean complete; - - public long getId() { - return id; - } - - public void setId(long id) { - this.id = id; - } - - public boolean isComplete() { - return complete; - } - - public void setComplete(boolean complete) { - this.complete = complete; - } - - public long getPetId() { - return petId; - } - - public void setPetId(long petId) { - this.petId = petId; - } - - public int getQuantity() { - return quantity; - } - - public void setQuantity(int quantity) { - this.quantity = quantity; - } - - @ApiModelProperty(value = "Order Status", allowableValues = "placed, approved, delivered") - public String getStatus() { - return status; - } - - public void setStatus(String status) { - this.status = status; - } - - public Date getShipDate() { - return shipDate; - } - - public void setShipDate(Date shipDate) { - this.shipDate = shipDate; - } - - @Override - public Long getIdentifier() { - return id; - } -} \ No newline at end of file diff --git a/springfox-petstore-webflux/src/main/java/springfox/petstore/webflux/model/Pet.java b/springfox-petstore-webflux/src/main/java/springfox/petstore/webflux/model/Pet.java deleted file mode 100644 index e428d05adec..00000000000 --- a/springfox-petstore-webflux/src/main/java/springfox/petstore/webflux/model/Pet.java +++ /dev/null @@ -1,93 +0,0 @@ -/* - * - * Copyright 2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.petstore.webflux.model; - -import io.swagger.annotations.ApiModelProperty; -import springfox.petstore.webflux.repository.Identifiable; - -import java.util.ArrayList; -import java.util.List; - -public class Pet implements Identifiable { - private long id; - private Category category; - private String name; - private List photoUrls = new ArrayList(); - private List tags = new ArrayList(); - private String status; - - public long getId() { - return id; - } - - public void setId(long id) { - this.id = id; - } - - public Category getCategory() { - return category; - } - - public void setCategory(Category category) { - this.category = category; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - // @XmlElementWrapper(name = "photoUrls") -// @XmlElement(name = "photoUrl") - public List getPhotoUrls() { - return photoUrls; - } - - public void setPhotoUrls(List photoUrls) { - this.photoUrls = photoUrls; - } - - // @XmlElementWrapper(name = "tags") -// @XmlElement(name = "tag") - public List getTags() { - return tags; - } - - public void setTags(List tags) { - this.tags = tags; - } - - @ApiModelProperty(value = "pet status in the store", allowableValues = "available,pending,sold") - public String getStatus() { - return status; - } - - public void setStatus(String status) { - this.status = status; - } - - @Override - public Long getIdentifier() { - return id; - } -} diff --git a/springfox-petstore-webflux/src/main/java/springfox/petstore/webflux/model/Tag.java b/springfox-petstore-webflux/src/main/java/springfox/petstore/webflux/model/Tag.java deleted file mode 100644 index 6a0b0fb700e..00000000000 --- a/springfox-petstore-webflux/src/main/java/springfox/petstore/webflux/model/Tag.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * - * Copyright 2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.petstore.webflux.model; - -public class Tag { - private long id; - private String name; - - public long getId() { - return id; - } - - public void setId(long id) { - this.id = id; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } -} \ No newline at end of file diff --git a/springfox-petstore-webflux/src/main/java/springfox/petstore/webflux/model/User.java b/springfox-petstore-webflux/src/main/java/springfox/petstore/webflux/model/User.java deleted file mode 100644 index 3bbfc1ddf55..00000000000 --- a/springfox-petstore-webflux/src/main/java/springfox/petstore/webflux/model/User.java +++ /dev/null @@ -1,104 +0,0 @@ -/* - * - * Copyright 2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.petstore.webflux.model; - -import io.swagger.annotations.ApiModelProperty; -import springfox.petstore.webflux.repository.Identifiable; - -public class User implements Identifiable { - private long id; - private String username; - private String firstName; - private String lastName; - private String email; - private String password; - private String phone; - private int userStatus; - - public long getId() { - return id; - } - - public void setId(long id) { - this.id = id; - } - - public String getFirstName() { - return firstName; - } - - public void setFirstName(String firstName) { - this.firstName = firstName; - } - - public String getUsername() { - return username; - } - - public void setUsername(String username) { - this.username = username; - } - - public String getLastName() { - return lastName; - } - - public void setLastName(String lastName) { - this.lastName = lastName; - } - - public String getEmail() { - return email; - } - - public void setEmail(String email) { - this.email = email; - } - - public String getPassword() { - return password; - } - - public void setPassword(String password) { - this.password = password; - } - - public String getPhone() { - return phone; - } - - public void setPhone(String phone) { - this.phone = phone; - } - - @ApiModelProperty(value = "User Status", allowableValues = "1-registered,2-active,3-closed") - public int getUserStatus() { - return userStatus; - } - - public void setUserStatus(int userStatus) { - this.userStatus = userStatus; - } - - @Override - public String getIdentifier() { - return username; - } -} \ No newline at end of file diff --git a/springfox-petstore-webflux/src/main/java/springfox/petstore/webflux/repository/Identifiable.java b/springfox-petstore-webflux/src/main/java/springfox/petstore/webflux/repository/Identifiable.java deleted file mode 100644 index c47861a8920..00000000000 --- a/springfox-petstore-webflux/src/main/java/springfox/petstore/webflux/repository/Identifiable.java +++ /dev/null @@ -1,24 +0,0 @@ -/* - * - * Copyright 2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.petstore.webflux.repository; - -public interface Identifiable { - T getIdentifier(); -} diff --git a/springfox-petstore-webflux/src/main/java/springfox/petstore/webflux/repository/MapBackedRepository.java b/springfox-petstore-webflux/src/main/java/springfox/petstore/webflux/repository/MapBackedRepository.java deleted file mode 100644 index 5a104a20fef..00000000000 --- a/springfox-petstore-webflux/src/main/java/springfox/petstore/webflux/repository/MapBackedRepository.java +++ /dev/null @@ -1,56 +0,0 @@ -/* - * - * Copyright 2015-2019 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.petstore.webflux.repository; - -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.function.Predicate; - -import static java.util.stream.Collectors.*; - -public class MapBackedRepository> { - private Map service = new HashMap<>(); - - public void delete(K key) { - service.remove(key); - } - - public boolean exists(K key) { - return service.containsKey(key); - } - - public void add(V model) { - service.put(model.getIdentifier(), model); - } - - public V get(K key) { - return service.get(key); - } - - public V first() { - return service.values().stream().findFirst().orElse(null); - } - - public List where(Predicate criteria) { - return service.values().stream() - .filter(criteria).collect(toList()); - } -} diff --git a/springfox-petstore-webflux/src/main/java/springfox/petstore/webflux/repository/UserRepository.java b/springfox-petstore-webflux/src/main/java/springfox/petstore/webflux/repository/UserRepository.java deleted file mode 100644 index bd07b4d1f5a..00000000000 --- a/springfox-petstore-webflux/src/main/java/springfox/petstore/webflux/repository/UserRepository.java +++ /dev/null @@ -1,25 +0,0 @@ -/* - * - * Copyright 2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.petstore.webflux.repository; - -import springfox.petstore.webflux.model.User; - -public class UserRepository extends MapBackedRepository { -} diff --git a/springfox-petstore-webflux/src/main/resources/.gitkeep b/springfox-petstore-webflux/src/main/resources/.gitkeep deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/springfox-petstore-webflux/src/test/groovy/springfox/documentation/.gitkeep b/springfox-petstore-webflux/src/test/groovy/springfox/documentation/.gitkeep deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/springfox-petstore-webflux/src/test/java/springfox/documentation/.gitkeep b/springfox-petstore-webflux/src/test/java/springfox/documentation/.gitkeep deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/springfox-petstore-webflux/src/test/resources/.gitkeep b/springfox-petstore-webflux/src/test/resources/.gitkeep deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/springfox-petstore/build.gradle b/springfox-petstore/build.gradle deleted file mode 100644 index b4bbed6f50f..00000000000 --- a/springfox-petstore/build.gradle +++ /dev/null @@ -1,9 +0,0 @@ -dependencies { - implementation libs.spring - implementation libs.springProvided - implementation libs.swagger2Core - implementation libs.core - implementation project(':springfox-spi') - implementation project(':springfox-core') - implementation project(':springfox-spring-webmvc') -} \ No newline at end of file diff --git a/springfox-petstore/src/main/java/springfox/petstore/PetStoreConfiguration.java b/springfox-petstore/src/main/java/springfox/petstore/PetStoreConfiguration.java deleted file mode 100644 index c31118af92d..00000000000 --- a/springfox-petstore/src/main/java/springfox/petstore/PetStoreConfiguration.java +++ /dev/null @@ -1,52 +0,0 @@ -/* - * - * Copyright 2017-2019 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ -package springfox.petstore; - -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import springfox.documentation.service.SecurityScheme; -import springfox.documentation.spi.DocumentationType; -import springfox.documentation.spring.web.plugins.Docket; - -import java.util.List; -import java.util.stream.Stream; - -import static java.util.stream.Collectors.*; -import static springfox.documentation.builders.PathSelectors.*; - -@Configuration -public class PetStoreConfiguration { - - @Bean - Docket petstore(List authorizationTypes) { - return new Docket(DocumentationType.SWAGGER_2) - .groupName("petstore") - .useDefaultResponseMessages(false) - .securitySchemes(authorizationTypes) - .produces(Stream.of("application/xml", "application/json").collect(toSet())) - .select() - .paths(( - regex("/api/.*") - .and(regex("/api/store/search.*").negate()) - .or(regex("/generic/.*")))) - .build() - .host("petstore.swagger.io") - .protocols(Stream.of("http", "https").collect(toSet())); - } -} diff --git a/springfox-petstore/src/main/java/springfox/petstore/Responses.java b/springfox-petstore/src/main/java/springfox/petstore/Responses.java deleted file mode 100644 index e59ef2401ff..00000000000 --- a/springfox-petstore/src/main/java/springfox/petstore/Responses.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * - * Copyright 2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.petstore; - -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; - -public class Responses { - private Responses() { - throw new UnsupportedOperationException(); - } - - public static ResponseEntity ok() { - return new ResponseEntity(HttpStatus.OK); - } - - public static ResponseEntity notFound() { - return new ResponseEntity(HttpStatus.NOT_FOUND); - } - - public static ResponseEntity ok(T model) { - return new ResponseEntity(model, HttpStatus.OK); - } -} diff --git a/springfox-petstore/src/main/java/springfox/petstore/controller/NotFoundException.java b/springfox-petstore/src/main/java/springfox/petstore/controller/NotFoundException.java deleted file mode 100644 index efa8c0c67fb..00000000000 --- a/springfox-petstore/src/main/java/springfox/petstore/controller/NotFoundException.java +++ /dev/null @@ -1,38 +0,0 @@ -/* - * - * Copyright 2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.petstore.controller; - -public class NotFoundException extends RuntimeException { - private final int code; - private final String description; - - public NotFoundException(int code, String description) { - this.code = code; - this.description = description; - } - - public int getCode() { - return code; - } - - public String getDescription() { - return description; - } -} diff --git a/springfox-petstore/src/main/java/springfox/petstore/controller/PetController.java b/springfox-petstore/src/main/java/springfox/petstore/controller/PetController.java deleted file mode 100644 index 2e1875a8a3d..00000000000 --- a/springfox-petstore/src/main/java/springfox/petstore/controller/PetController.java +++ /dev/null @@ -1,206 +0,0 @@ -/* - * - * Copyright 2017 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.petstore.controller; - -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiOperation; -import io.swagger.annotations.ApiParam; -import io.swagger.annotations.ApiResponse; -import io.swagger.annotations.ApiResponses; -import io.swagger.annotations.Authorization; -import io.swagger.annotations.AuthorizationScope; -import io.swagger.annotations.ResponseHeader; -import org.springframework.http.ResponseEntity; -import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; -import springfox.petstore.Responses; -import springfox.petstore.model.Pet; -import springfox.petstore.model.Pets; -import springfox.petstore.repository.MapBackedRepository; - -import java.util.List; - -import static org.springframework.http.MediaType.*; -import static org.springframework.web.bind.annotation.RequestMethod.*; - -@Controller -@RequestMapping(value = "/api/pet", produces = { APPLICATION_JSON_VALUE, APPLICATION_XML_VALUE }) -@Api(value = "/pet", description = "Operations about pets") -public class PetController { - - private PetRepository petData = new PetRepository(); - - @RequestMapping(value = "/{petId}", method = GET) - @ApiOperation( - value = "Find pet by ID", notes = "Returns a pet when ID < 10. ID > 10 or non-integers will simulate API " + - "error conditions", - response = Pet.class, - responseHeaders = { - @ResponseHeader(name = "header4", response = String.class), - @ResponseHeader(name = "header3", response = String.class) - }, - authorizations = { - @Authorization(value = "api_key"), - @Authorization(value = "petstore_auth", scopes = { - @AuthorizationScope(scope = "write:pets", description = ""), - @AuthorizationScope(scope = "read:pets", description = "") - }) }) - @ApiResponses(value = { - @ApiResponse(code = 400, message = "Invalid ID supplied", responseHeaders = { - @ResponseHeader(name = "header2", response = String.class), - @ResponseHeader(name = "header1", response = String.class) - }), - @ApiResponse(code = 404, message = "Pet not found") } - ) - public ResponseEntity getPetById( - @ApiParam(value = "ID of pet that needs to be fetched", allowableValues = "range[1,5]", required = true) - @PathVariable("petId") String petId) - throws NotFoundException { - Pet pet = petData.get(Long.valueOf(petId)); - if (null != pet) { - return Responses.ok(pet); - } else { - throw new NotFoundException(404, "Pet not found"); - } - } - - @RequestMapping(method = POST) - @ApiOperation(value = "Add a new pet to the store", - authorizations = @Authorization(value = "petstore_auth", scopes = { - @AuthorizationScope(scope = "write:pets", description = ""), - @AuthorizationScope(scope = "read:pets", description = "") - })) - @ApiResponses(value = { @ApiResponse(code = 405, message = "Invalid input") }) - public ResponseEntity addPet( - @ApiParam(value = "Pet object that needs to be added to the store", required = true) @RequestBody Pet pet) { - petData.add(pet); - return Responses.ok("SUCCESS"); - } - - @RequestMapping(method = PUT) - @ApiOperation(value = "Update an existing pet", - authorizations = @Authorization(value = "petstore_auth", scopes = { - @AuthorizationScope(scope = "write:pets", description = ""), - @AuthorizationScope(scope = "read:pets", description = "") - })) - @ApiResponses(value = { @ApiResponse(code = 400, message = "Invalid ID supplied"), - @ApiResponse(code = 404, message = "Pet not found"), - @ApiResponse(code = 405, message = "Validation exception") }) - public ResponseEntity updatePet( - @ApiParam(value = "Pet object that needs to be added to the store", required = true) @RequestBody Pet pet) { - petData.add(pet); - return Responses.ok("SUCCESS"); - } - - @RequestMapping(value = "/findByStatus", method = GET) - @ApiOperation( - value = "Finds Pets by status", - notes = "Multiple status values can be provided with comma-separated strings", - response = Pet.class, - responseContainer = "List", - authorizations = @Authorization(value = "petstore_auth", scopes = { - @AuthorizationScope(scope = "write:pets", description = ""), - @AuthorizationScope(scope = "read:pets", description = "") - })) - @ApiResponses(value = { @ApiResponse(code = 400, message = "Invalid status value") }) - /** TODO: This renders parameter as - * - "name": "status", - "in": "query", - "description": "Status values that need to be considered for filter", - "required": false, - "type": "array", - "items": {"type": "string"}, - "collectionFormat": "multi", - "default": "available" - */ - public ResponseEntity> findPetsByStatus( - @ApiParam(value = "Status values that need to be considered for filter", - required = true, - defaultValue = "available", - allowableValues = "available,pending,sold", - allowMultiple = true) - @RequestParam("status") String status) { - return Responses.ok(petData.findPetByStatus(status)); - } - - @RequestMapping(value = "/findByTags", method = GET) - @ApiOperation( - value = "Finds Pets by tags", - notes = "Multiple tags can be provided with comma-separated strings. Use tag1, tag2, tag3 for testing.", - response = Pet.class, - responseContainer = "List", - authorizations = @Authorization(value = "petstore_auth", scopes = { - @AuthorizationScope(scope = "write:pets", description = ""), - @AuthorizationScope(scope = "read:pets", description = "") - })) - @ApiResponses(value = { @ApiResponse(code = 400, message = "Invalid tag value") }) - @Deprecated - /** TODO: This renders the parameter as - "name": "tags", - "in": "query", - "description": "Tags to filter by", - "required": false, - "type": "array", - "items": {"type": "string"}, - "collectionFormat": "multi" */ - public ResponseEntity> findPetsByTags( - @ApiParam( - value = "Tags to filter by", - required = true, - allowMultiple = true) - @RequestParam("tags") String tags) { - return Responses.ok(petData.findPetByTags(tags)); - } - - @RequestMapping(value = "/findPetsHidden", method = GET) - @ApiOperation( - value = "Finds Pets (hidden)", - notes = "Hidden method", - response = Pet.class, - responseContainer = "List", - hidden = true, - authorizations = @Authorization(value = "petstore_auth", scopes = { - @AuthorizationScope(scope = "write:pets", description = ""), - @AuthorizationScope(scope = "read:pets", description = "") - })) - @ApiResponses(value = { @ApiResponse(code = 400, message = "Invalid tag value") }) - public ResponseEntity> findPetsHidden( - @ApiParam( - value = "Tags to filter by", - required = true, - allowMultiple = true) - @RequestParam("tags") String tags) { - return Responses.ok(petData.findPetByTags(tags)); - } - - static class PetRepository extends MapBackedRepository { - public List findPetByStatus(String status) { - return where(Pets.statusIs(status)); - } - - public List findPetByTags(String tags) { - return where(Pets.tagsContain(tags)); - } - } -} diff --git a/springfox-petstore/src/main/java/springfox/petstore/controller/PetStoreResource.java b/springfox-petstore/src/main/java/springfox/petstore/controller/PetStoreResource.java deleted file mode 100644 index 9a015f8999b..00000000000 --- a/springfox-petstore/src/main/java/springfox/petstore/controller/PetStoreResource.java +++ /dev/null @@ -1,106 +0,0 @@ -/* - * - * Copyright 2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.petstore.controller; - -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiOperation; -import io.swagger.annotations.ApiParam; -import io.swagger.annotations.ApiResponse; -import io.swagger.annotations.ApiResponses; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestMethod; -import org.springframework.web.bind.annotation.ResponseStatus; -import springfox.petstore.model.Order; -import springfox.petstore.model.Pet; -import springfox.petstore.repository.MapBackedRepository; - -import static org.springframework.http.MediaType.*; -import static org.springframework.web.bind.annotation.RequestMethod.*; -import static springfox.petstore.Responses.*; - -@Controller -@RequestMapping(value = "/api/store", produces = APPLICATION_JSON_VALUE) -@Api(value = "/store", description = "Operations about store") -public class PetStoreResource { - private static StoreData storeData = new StoreData(); - - private static class StoreData extends MapBackedRepository { - } - - @RequestMapping(value = "/order/{orderId}", method = GET) - @ApiOperation( - value = "Find purchase order by ID", - notes = "For valid response try integer IDs with value <= 5 or > 10. Other values will generated exceptions", - response = Order.class, - tags = { "Pet Store" }) - @ApiResponses(value = { - @ApiResponse(code = 400, message = "Invalid ID supplied"), - @ApiResponse(code = 404, message = "Order not found") }) - public ResponseEntity getOrderById( - @ApiParam(value = "ID of pet that needs to be fetched", allowableValues = "range[1,5]", required = true) - @PathVariable("orderId") String orderId) - throws NotFoundException { - Order order = storeData.get(Long.valueOf(orderId)); - if (null != order) { - return ok(order); - } else { - throw new NotFoundException(404, "Order not found"); - } - } - - @RequestMapping(value = "/order", method = POST) - @ApiOperation(value = "Place an order for a pet", response = Order.class) - @ApiResponses({ @ApiResponse(code = 400, message = "Invalid Order") }) - public ResponseEntity placeOrder( - @ApiParam(value = "order placed for purchasing the pet", required = true) Order order) { - storeData.add(order); - return ok(""); - } - - @RequestMapping(value = "/order/{orderId}", method = DELETE) - @ApiOperation( - value = "Delete purchase order by ID", notes = "For valid response try integer IDs with value < 1000. " + - "Anything above 1000 or non-integers will generate API errors" - ) - @ApiResponses(value = { @ApiResponse(code = 400, message = "Invalid ID supplied"), - @ApiResponse(code = 404, message = "Order not found") }) - public ResponseEntity deleteOrder( - @ApiParam(value = "ID of the order that needs to be deleted", allowableValues = "range[1,infinity]", required - = true) @PathVariable("orderId") String orderId) { - storeData.delete(Long.valueOf(orderId)); - return ok(""); - } - - @RequestMapping(value = "search", method = RequestMethod.GET, produces = "application/json", params = "x=TX") - @ResponseStatus(value = HttpStatus.OK) - public ResponseEntity getPetInTx() { - throw new UnsupportedOperationException(); - } - - @RequestMapping(value = "search", method = RequestMethod.GET, produces = "application/json", params = "x=CA") - @ResponseStatus(value = HttpStatus.OK) - public ResponseEntity getPetInCA() { - throw new UnsupportedOperationException(); - } -} diff --git a/springfox-petstore/src/main/java/springfox/petstore/controller/UserController.java b/springfox-petstore/src/main/java/springfox/petstore/controller/UserController.java deleted file mode 100644 index 409775ef19f..00000000000 --- a/springfox-petstore/src/main/java/springfox/petstore/controller/UserController.java +++ /dev/null @@ -1,150 +0,0 @@ -/* - * - * Copyright 2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.petstore.controller; - -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiOperation; -import io.swagger.annotations.ApiParam; -import io.swagger.annotations.ApiResponse; -import io.swagger.annotations.ApiResponses; -import org.springframework.http.HttpStatus; -import org.springframework.http.MediaType; -import org.springframework.http.ResponseEntity; -import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.ResponseBody; -import springfox.petstore.Responses; -import springfox.petstore.model.User; -import springfox.petstore.repository.UserRepository; - -import java.util.List; - -import static org.springframework.web.bind.annotation.RequestMethod.*; - -@Controller -@RequestMapping(value = "/api/user", produces = MediaType.APPLICATION_JSON_VALUE) -@Api(value = "/user", description = "Operations about user") -@SuppressWarnings("unchecked") -public class UserController { - private UserRepository userRepository = new UserRepository(); - - @RequestMapping(method = POST) - @ResponseBody - @ApiOperation(value = "Create user", notes = "This can only be done by the logged in user.") - public ResponseEntity createUser( - @RequestBody - @ApiParam(value = "Created user object", required = true) User user) { - - userRepository.add(user); - return new ResponseEntity<>(user, HttpStatus.OK); - } - - @RequestMapping(value = "/createWithArray", method = POST) - @ResponseBody - @ApiOperation(value = "Creates list of users with given input array") - public ResponseEntity createUsersWithArrayInput(@ApiParam(value = "List of user object", required = true) - User[] users) { - for (User user : users) { - userRepository.add(user); - } - return Responses.ok(); - } - - @RequestMapping(value = "/createWithList", method = POST) - @ResponseBody - @ApiOperation(value = "Creates list of users with given input array") - public ResponseEntity createUsersWithListInput( - @ApiParam(value = "List of user object", required = true) List users) { - for (User user : users) { - userRepository.add(user); - } - return Responses.ok(); - } - - @RequestMapping(value = "/{username}", method = PUT) - @ResponseBody - @ApiOperation(value = "Updated user", notes = "This can only be done by the logged in user.") - @ApiResponses(value = { - @ApiResponse(code = 400, message = "Invalid user supplied"), - @ApiResponse(code = 404, message = "User not found") }) - public ResponseEntity updateUser( - @ApiParam(value = "name that need to be deleted", required = true) - @PathVariable("username") String username, - @ApiParam(value = "Updated user object", required = true) User user) { - if (userRepository.get(username) != null) { - userRepository.add(user); - return Responses.ok(); - } - return Responses.notFound(); - } - - - @RequestMapping(value = "/{username}", method = DELETE) - @ApiOperation(value = "Delete user", notes = "This can only be done by the logged in user.") - @ApiResponses(value = { - @ApiResponse(code = 400, message = "Invalid username supplied"), - @ApiResponse(code = 404, message = "User not found") }) - public ResponseEntity deleteUser( - @ApiParam(value = "The name that needs to be deleted", required = true) @PathVariable("username") String - username) { - if (userRepository.exists(username)) { - userRepository.delete(username); - return Responses.ok(); - } - return Responses.notFound(); - - } - - @RequestMapping(value = "/{username}", method = GET) - @ApiOperation(value = "Get user by user name", response = User.class) - @ApiResponses(value = { - @ApiResponse(code = 400, message = "Invalid username supplied"), - @ApiResponse(code = 404, message = "User not found") }) - public ResponseEntity getUserByName( - @ApiParam(value = "The name that needs to be fetched. Use user1 for testing. ", required = true) - @PathVariable("username") String username) { - User user = userRepository.get(username); - if (null != user) { - return new ResponseEntity<>(user, HttpStatus.OK); - } else { - throw new NotFoundException(404, "User not found"); - } - } - - @RequestMapping(value = "/login", method = GET) - @ApiOperation(value = "Logs user into the system", response = String.class) - @ApiResponses(value = { @ApiResponse(code = 400, message = "Invalid username/password supplied") }) - public ResponseEntity loginUser( - @ApiParam(value = "The user name for login", required = true) - @RequestParam("username") String username, - @ApiParam(value = "The password for login in clear text", required = true) - @RequestParam("password") String password) { - return new ResponseEntity<>("logged in user session:" + System.currentTimeMillis(), HttpStatus.OK); - } - - @RequestMapping(value = "/logout", method = GET) - @ApiOperation(value = "Logs out current logged in user session") - public ResponseEntity logoutUser() { - return Responses.ok(); - } -} diff --git a/springfox-petstore/src/main/java/springfox/petstore/model/Category.java b/springfox-petstore/src/main/java/springfox/petstore/model/Category.java deleted file mode 100644 index 79f384c999b..00000000000 --- a/springfox-petstore/src/main/java/springfox/petstore/model/Category.java +++ /dev/null @@ -1,58 +0,0 @@ -/* - * - * Copyright 2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.petstore.model; - -import com.fasterxml.jackson.annotation.JsonCreator; -import com.fasterxml.jackson.annotation.JsonProperty; - -public class Category { - private long id; - private String name; - - public Category(long id, String name) { - this.id = id; - this.name = name; - } - - @JsonCreator - public static Category create( - @JsonProperty(value = "id", required = true) long id, - @JsonProperty("name") String name) { - return new Category(id, name); - } - - @JsonProperty - public long getId() { - return id; - } - - public void setId(long id) { - this.id = id; - } - - @JsonProperty - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } -} \ No newline at end of file diff --git a/springfox-petstore/src/main/java/springfox/petstore/model/Order.java b/springfox-petstore/src/main/java/springfox/petstore/model/Order.java deleted file mode 100644 index 1eb5c74ab43..00000000000 --- a/springfox-petstore/src/main/java/springfox/petstore/model/Order.java +++ /dev/null @@ -1,88 +0,0 @@ -/* - * - * Copyright 2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.petstore.model; - -import io.swagger.annotations.ApiModelProperty; -import springfox.petstore.repository.Identifiable; - -import java.util.Date; - -public class Order implements Identifiable { - private long id; - private long petId; - private int quantity; - private Date shipDate; - private String status; - private boolean complete; - - public long getId() { - return id; - } - - public void setId(long id) { - this.id = id; - } - - public boolean isComplete() { - return complete; - } - - public void setComplete(boolean complete) { - this.complete = complete; - } - - public long getPetId() { - return petId; - } - - public void setPetId(long petId) { - this.petId = petId; - } - - public int getQuantity() { - return quantity; - } - - public void setQuantity(int quantity) { - this.quantity = quantity; - } - - @ApiModelProperty(value = "Order Status", allowableValues = "placed, approved, delivered") - public String getStatus() { - return status; - } - - public void setStatus(String status) { - this.status = status; - } - - public Date getShipDate() { - return shipDate; - } - - public void setShipDate(Date shipDate) { - this.shipDate = shipDate; - } - - @Override - public Long getIdentifier() { - return id; - } -} \ No newline at end of file diff --git a/springfox-petstore/src/main/java/springfox/petstore/model/Pet.java b/springfox-petstore/src/main/java/springfox/petstore/model/Pet.java deleted file mode 100644 index b5da99b3ee2..00000000000 --- a/springfox-petstore/src/main/java/springfox/petstore/model/Pet.java +++ /dev/null @@ -1,93 +0,0 @@ -/* - * - * Copyright 2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.petstore.model; - -import io.swagger.annotations.ApiModelProperty; -import springfox.petstore.repository.Identifiable; - -import java.util.ArrayList; -import java.util.List; - -public class Pet implements Identifiable { - private long id; - private Category category; - private String name; - private List photoUrls = new ArrayList(); - private List tags = new ArrayList(); - private String status; - - public long getId() { - return id; - } - - public void setId(long id) { - this.id = id; - } - - public Category getCategory() { - return category; - } - - public void setCategory(Category category) { - this.category = category; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - // @XmlElementWrapper(name = "photoUrls") -// @XmlElement(name = "photoUrl") - public List getPhotoUrls() { - return photoUrls; - } - - public void setPhotoUrls(List photoUrls) { - this.photoUrls = photoUrls; - } - - // @XmlElementWrapper(name = "tags") -// @XmlElement(name = "tag") - public List getTags() { - return tags; - } - - public void setTags(List tags) { - this.tags = tags; - } - - @ApiModelProperty(value = "pet status in the store", allowableValues = "available,pending,sold") - public String getStatus() { - return status; - } - - public void setStatus(String status) { - this.status = status; - } - - @Override - public Long getIdentifier() { - return id; - } -} diff --git a/springfox-petstore/src/main/java/springfox/petstore/model/Pets.java b/springfox-petstore/src/main/java/springfox/petstore/model/Pets.java deleted file mode 100644 index 52e711d519d..00000000000 --- a/springfox-petstore/src/main/java/springfox/petstore/model/Pets.java +++ /dev/null @@ -1,56 +0,0 @@ -/* - * - * Copyright 2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.petstore.model; - -import java.util.Objects; -import java.util.function.Predicate; - -public class Pets { - private Pets() { - throw new UnsupportedOperationException(); - } - - public static Predicate statusIs(final String status) { - return new Predicate() { - @Override - public boolean test(Pet input) { - return Objects.equals(input.getStatus(), status); - } - }; - } - - public static Predicate tagsContain(final String tag) { - return new Predicate() { - @Override - public boolean test(Pet input) { - return input.getTags().stream().anyMatch(withName(tag)); - } - }; - } - - private static Predicate withName(final String tag) { - return new Predicate() { - @Override - public boolean test(Tag input) { - return Objects.equals(input.getName(), tag); - } - }; - } -} diff --git a/springfox-petstore/src/main/java/springfox/petstore/model/Tag.java b/springfox-petstore/src/main/java/springfox/petstore/model/Tag.java deleted file mode 100644 index 3b2e78ff2ce..00000000000 --- a/springfox-petstore/src/main/java/springfox/petstore/model/Tag.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * - * Copyright 2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.petstore.model; - -public class Tag { - private long id; - private String name; - - public long getId() { - return id; - } - - public void setId(long id) { - this.id = id; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } -} \ No newline at end of file diff --git a/springfox-petstore/src/main/java/springfox/petstore/model/User.java b/springfox-petstore/src/main/java/springfox/petstore/model/User.java deleted file mode 100644 index c60fe266d6d..00000000000 --- a/springfox-petstore/src/main/java/springfox/petstore/model/User.java +++ /dev/null @@ -1,104 +0,0 @@ -/* - * - * Copyright 2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.petstore.model; - -import io.swagger.annotations.ApiModelProperty; -import springfox.petstore.repository.Identifiable; - -public class User implements Identifiable { - private long id; - private String username; - private String firstName; - private String lastName; - private String email; - private String password; - private String phone; - private int userStatus; - - public long getId() { - return id; - } - - public void setId(long id) { - this.id = id; - } - - public String getFirstName() { - return firstName; - } - - public void setFirstName(String firstName) { - this.firstName = firstName; - } - - public String getUsername() { - return username; - } - - public void setUsername(String username) { - this.username = username; - } - - public String getLastName() { - return lastName; - } - - public void setLastName(String lastName) { - this.lastName = lastName; - } - - public String getEmail() { - return email; - } - - public void setEmail(String email) { - this.email = email; - } - - public String getPassword() { - return password; - } - - public void setPassword(String password) { - this.password = password; - } - - public String getPhone() { - return phone; - } - - public void setPhone(String phone) { - this.phone = phone; - } - - @ApiModelProperty(value = "User Status", allowableValues = "1-registered,2-active,3-closed") - public int getUserStatus() { - return userStatus; - } - - public void setUserStatus(int userStatus) { - this.userStatus = userStatus; - } - - @Override - public String getIdentifier() { - return username; - } -} \ No newline at end of file diff --git a/springfox-petstore/src/main/java/springfox/petstore/repository/Identifiable.java b/springfox-petstore/src/main/java/springfox/petstore/repository/Identifiable.java deleted file mode 100644 index eb45a1d0d56..00000000000 --- a/springfox-petstore/src/main/java/springfox/petstore/repository/Identifiable.java +++ /dev/null @@ -1,24 +0,0 @@ -/* - * - * Copyright 2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.petstore.repository; - -public interface Identifiable { - T getIdentifier(); -} diff --git a/springfox-petstore/src/main/java/springfox/petstore/repository/MapBackedRepository.java b/springfox-petstore/src/main/java/springfox/petstore/repository/MapBackedRepository.java deleted file mode 100644 index c2e11f98d88..00000000000 --- a/springfox-petstore/src/main/java/springfox/petstore/repository/MapBackedRepository.java +++ /dev/null @@ -1,56 +0,0 @@ -/* - * - * Copyright 2015-2019 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.petstore.repository; - -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.function.Predicate; - -import static java.util.stream.Collectors.*; - -public class MapBackedRepository> { - private Map service = new HashMap<>(); - - public void delete(K key) { - service.remove(key); - } - - public boolean exists(K key) { - return service.containsKey(key); - } - - public void add(V model) { - service.put(model.getIdentifier(), model); - } - - public V get(K key) { - return service.get(key); - } - - public V first() { - return service.values().stream().findFirst().orElse(null); - } - - public List where(Predicate criteria) { - return service.values().stream() - .filter(criteria).collect(toList()); - } -} diff --git a/springfox-petstore/src/main/java/springfox/petstore/repository/UserRepository.java b/springfox-petstore/src/main/java/springfox/petstore/repository/UserRepository.java deleted file mode 100644 index e84594d85ed..00000000000 --- a/springfox-petstore/src/main/java/springfox/petstore/repository/UserRepository.java +++ /dev/null @@ -1,25 +0,0 @@ -/* - * - * Copyright 2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.petstore.repository; - -import springfox.petstore.model.User; - -public class UserRepository extends MapBackedRepository { -} diff --git a/springfox-petstore/src/main/resources/.gitkeep b/springfox-petstore/src/main/resources/.gitkeep deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/springfox-petstore/src/test/groovy/springfox/documentation/.gitkeep b/springfox-petstore/src/test/groovy/springfox/documentation/.gitkeep deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/springfox-petstore/src/test/java/springfox/documentation/.gitkeep b/springfox-petstore/src/test/java/springfox/documentation/.gitkeep deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/springfox-petstore/src/test/resources/.gitkeep b/springfox-petstore/src/test/resources/.gitkeep deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/springfox-schema/gradle/wrapper/gradle-wrapper.jar b/springfox-schema/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..41d9927a4d4fb3f96a785543079b8df6723c946b GIT binary patch literal 59821 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 literal 0 HcmV?d00001 diff --git a/springfox-schema/gradle/wrapper/gradle-wrapper.properties b/springfox-schema/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 00000000000..41dfb87909a --- /dev/null +++ b/springfox-schema/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,5 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-7.4-bin.zip +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/springfox-schema/gradlew b/springfox-schema/gradlew new file mode 100755 index 00000000000..1b6c787337f --- /dev/null +++ b/springfox-schema/gradlew @@ -0,0 +1,234 @@ +#!/bin/sh + +# +# Copyright © 2015-2021 the original authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +############################################################################## +# +# Gradle start up script for POSIX generated by Gradle. +# +# Important for running: +# +# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is +# noncompliant, but you have some other compliant shell such as ksh or +# bash, then to run this script, type that shell name before the whole +# command line, like: +# +# ksh Gradle +# +# Busybox and similar reduced shells will NOT work, because this script +# requires all of these POSIX shell features: +# * functions; +# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», +# «${var#prefix}», «${var%suffix}», and «$( cmd )»; +# * compound commands having a testable exit status, especially «case»; +# * various built-in commands including «command», «set», and «ulimit». +# +# Important for patching: +# +# (2) This script targets any POSIX shell, so it avoids extensions provided +# by Bash, Ksh, etc; in particular arrays are avoided. +# +# The "traditional" practice of packing multiple parameters into a +# space-separated string is a well documented source of bugs and security +# problems, so this is (mostly) avoided, by progressively accumulating +# options in "$@", and eventually passing that to Java. +# +# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, +# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; +# see the in-line comments for details. +# +# There are tweaks for specific operating systems such as AIX, CygWin, +# Darwin, MinGW, and NonStop. +# +# (3) This script is generated from the Groovy template +# https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# within the Gradle project. +# +# You can find Gradle at https://github.com/gradle/gradle/. +# +############################################################################## + +# Attempt to set APP_HOME + +# Resolve links: $0 may be a link +app_path=$0 + +# Need this for daisy-chained symlinks. +while + APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path + [ -h "$app_path" ] +do + ls=$( ls -ld "$app_path" ) + link=${ls#*' -> '} + case $link in #( + /*) app_path=$link ;; #( + *) app_path=$APP_HOME$link ;; + esac +done + +APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit + +APP_NAME="Gradle" +APP_BASE_NAME=${0##*/} + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD=maximum + +warn () { + echo "$*" +} >&2 + +die () { + echo + echo "$*" + echo + exit 1 +} >&2 + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "$( uname )" in #( + CYGWIN* ) cygwin=true ;; #( + Darwin* ) darwin=true ;; #( + MSYS* | MINGW* ) msys=true ;; #( + NONSTOP* ) nonstop=true ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD=$JAVA_HOME/jre/sh/java + else + JAVACMD=$JAVA_HOME/bin/java + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD=java + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then + case $MAX_FD in #( + max*) + MAX_FD=$( ulimit -H -n ) || + warn "Could not query maximum file descriptor limit" + esac + case $MAX_FD in #( + '' | soft) :;; #( + *) + ulimit -n "$MAX_FD" || + warn "Could not set maximum file descriptor limit to $MAX_FD" + esac +fi + +# Collect all arguments for the java command, stacking in reverse order: +# * args from the command line +# * the main class name +# * -classpath +# * -D...appname settings +# * --module-path (only if needed) +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. + +# For Cygwin or MSYS, switch paths to Windows format before running java +if "$cygwin" || "$msys" ; then + APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) + CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) + + JAVACMD=$( cygpath --unix "$JAVACMD" ) + + # Now convert the arguments - kludge to limit ourselves to /bin/sh + for arg do + if + case $arg in #( + -*) false ;; # don't mess with options #( + /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath + [ -e "$t" ] ;; #( + *) false ;; + esac + then + arg=$( cygpath --path --ignore --mixed "$arg" ) + fi + # Roll the args list around exactly as many times as the number of + # args, so each arg winds up back in the position where it started, but + # possibly modified. + # + # NB: a `for` loop captures its iteration list before it begins, so + # changing the positional parameters here affects neither the number of + # iterations, nor the values presented in `arg`. + shift # remove old arg + set -- "$@" "$arg" # push replacement arg + done +fi + +# Collect all arguments for the java command; +# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of +# shell script including quotes and variable substitutions, so put them in +# double quotes to make sure that they get re-expanded; and +# * put everything else in single quotes, so that it's not re-expanded. + +set -- \ + "-Dorg.gradle.appname=$APP_BASE_NAME" \ + -classpath "$CLASSPATH" \ + org.gradle.wrapper.GradleWrapperMain \ + "$@" + +# Use "xargs" to parse quoted args. +# +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# + +eval "set -- $( + printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | + xargs -n1 | + sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | + tr '\n' ' ' + )" '"$@"' + +exec "$JAVACMD" "$@" diff --git a/springfox-schema/gradlew.bat b/springfox-schema/gradlew.bat new file mode 100644 index 00000000000..ac1b06f9382 --- /dev/null +++ b/springfox-schema/gradlew.bat @@ -0,0 +1,89 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto execute + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/springfox-schema/src/test/java/springfox/documentation/schema/SimpleTypeEntityModel.java b/springfox-schema/src/test/java/springfox/documentation/schema/SimpleTypeEntityModel.java index 34bf86421f5..c4abb4ac749 100644 --- a/springfox-schema/src/test/java/springfox/documentation/schema/SimpleTypeEntityModel.java +++ b/springfox-schema/src/test/java/springfox/documentation/schema/SimpleTypeEntityModel.java @@ -18,12 +18,13 @@ */ package springfox.documentation.schema; +import java.util.List; import org.springframework.hateoas.Link; import org.springframework.hateoas.EntityModel; @SuppressWarnings("deprecation") public class SimpleTypeEntityModel extends EntityModel { public SimpleTypeEntityModel(SimpleType content, Link... links) { - super(content, links); + super(content, List.of(links)); } } diff --git a/springfox-spi/gradle/wrapper/gradle-wrapper.jar b/springfox-spi/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..41d9927a4d4fb3f96a785543079b8df6723c946b GIT binary patch literal 59821 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 literal 0 HcmV?d00001 diff --git a/springfox-spi/gradle/wrapper/gradle-wrapper.properties b/springfox-spi/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 00000000000..41dfb87909a --- /dev/null +++ b/springfox-spi/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,5 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-7.4-bin.zip +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/springfox-spi/gradlew b/springfox-spi/gradlew new file mode 100755 index 00000000000..1b6c787337f --- /dev/null +++ b/springfox-spi/gradlew @@ -0,0 +1,234 @@ +#!/bin/sh + +# +# Copyright © 2015-2021 the original authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +############################################################################## +# +# Gradle start up script for POSIX generated by Gradle. +# +# Important for running: +# +# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is +# noncompliant, but you have some other compliant shell such as ksh or +# bash, then to run this script, type that shell name before the whole +# command line, like: +# +# ksh Gradle +# +# Busybox and similar reduced shells will NOT work, because this script +# requires all of these POSIX shell features: +# * functions; +# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», +# «${var#prefix}», «${var%suffix}», and «$( cmd )»; +# * compound commands having a testable exit status, especially «case»; +# * various built-in commands including «command», «set», and «ulimit». +# +# Important for patching: +# +# (2) This script targets any POSIX shell, so it avoids extensions provided +# by Bash, Ksh, etc; in particular arrays are avoided. +# +# The "traditional" practice of packing multiple parameters into a +# space-separated string is a well documented source of bugs and security +# problems, so this is (mostly) avoided, by progressively accumulating +# options in "$@", and eventually passing that to Java. +# +# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, +# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; +# see the in-line comments for details. +# +# There are tweaks for specific operating systems such as AIX, CygWin, +# Darwin, MinGW, and NonStop. +# +# (3) This script is generated from the Groovy template +# https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# within the Gradle project. +# +# You can find Gradle at https://github.com/gradle/gradle/. +# +############################################################################## + +# Attempt to set APP_HOME + +# Resolve links: $0 may be a link +app_path=$0 + +# Need this for daisy-chained symlinks. +while + APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path + [ -h "$app_path" ] +do + ls=$( ls -ld "$app_path" ) + link=${ls#*' -> '} + case $link in #( + /*) app_path=$link ;; #( + *) app_path=$APP_HOME$link ;; + esac +done + +APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit + +APP_NAME="Gradle" +APP_BASE_NAME=${0##*/} + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD=maximum + +warn () { + echo "$*" +} >&2 + +die () { + echo + echo "$*" + echo + exit 1 +} >&2 + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "$( uname )" in #( + CYGWIN* ) cygwin=true ;; #( + Darwin* ) darwin=true ;; #( + MSYS* | MINGW* ) msys=true ;; #( + NONSTOP* ) nonstop=true ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD=$JAVA_HOME/jre/sh/java + else + JAVACMD=$JAVA_HOME/bin/java + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD=java + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then + case $MAX_FD in #( + max*) + MAX_FD=$( ulimit -H -n ) || + warn "Could not query maximum file descriptor limit" + esac + case $MAX_FD in #( + '' | soft) :;; #( + *) + ulimit -n "$MAX_FD" || + warn "Could not set maximum file descriptor limit to $MAX_FD" + esac +fi + +# Collect all arguments for the java command, stacking in reverse order: +# * args from the command line +# * the main class name +# * -classpath +# * -D...appname settings +# * --module-path (only if needed) +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. + +# For Cygwin or MSYS, switch paths to Windows format before running java +if "$cygwin" || "$msys" ; then + APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) + CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) + + JAVACMD=$( cygpath --unix "$JAVACMD" ) + + # Now convert the arguments - kludge to limit ourselves to /bin/sh + for arg do + if + case $arg in #( + -*) false ;; # don't mess with options #( + /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath + [ -e "$t" ] ;; #( + *) false ;; + esac + then + arg=$( cygpath --path --ignore --mixed "$arg" ) + fi + # Roll the args list around exactly as many times as the number of + # args, so each arg winds up back in the position where it started, but + # possibly modified. + # + # NB: a `for` loop captures its iteration list before it begins, so + # changing the positional parameters here affects neither the number of + # iterations, nor the values presented in `arg`. + shift # remove old arg + set -- "$@" "$arg" # push replacement arg + done +fi + +# Collect all arguments for the java command; +# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of +# shell script including quotes and variable substitutions, so put them in +# double quotes to make sure that they get re-expanded; and +# * put everything else in single quotes, so that it's not re-expanded. + +set -- \ + "-Dorg.gradle.appname=$APP_BASE_NAME" \ + -classpath "$CLASSPATH" \ + org.gradle.wrapper.GradleWrapperMain \ + "$@" + +# Use "xargs" to parse quoted args. +# +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# + +eval "set -- $( + printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | + xargs -n1 | + sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | + tr '\n' ' ' + )" '"$@"' + +exec "$JAVACMD" "$@" diff --git a/springfox-spi/gradlew.bat b/springfox-spi/gradlew.bat new file mode 100644 index 00000000000..ac1b06f9382 --- /dev/null +++ b/springfox-spi/gradlew.bat @@ -0,0 +1,89 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto execute + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/springfox-spi/src/test/groovy/springfox/documentation/spi/service/contexts/DefaultsSpec.groovy b/springfox-spi/src/test/groovy/springfox/documentation/spi/service/contexts/DefaultsSpec.groovy deleted file mode 100644 index add1033f13d..00000000000 --- a/springfox-spi/src/test/groovy/springfox/documentation/spi/service/contexts/DefaultsSpec.groovy +++ /dev/null @@ -1,78 +0,0 @@ -package springfox.documentation.spi.service.contexts - -import com.fasterxml.classmate.TypeResolver -import org.joda.time.DateMidnight -import org.joda.time.DateTime -import org.joda.time.ReadableDateTime -import org.joda.time.ReadableInstant -import org.springframework.http.HttpHeaders -import org.springframework.validation.BindingResult -import org.springframework.web.bind.annotation.RequestMethod -import org.springframework.web.util.UriComponentsBuilder -import spock.lang.Shared -import spock.lang.Specification -import springfox.documentation.annotations.ApiIgnore -import springfox.documentation.spi.schema.AlternateTypeProvider - -import java.time.* - -class DefaultsSpec extends Specification { - @Shared - def resolver = new TypeResolver() - - def "Verify defaults"() { - when: - def sut = new Defaults() - - then: - sut.defaultIgnorableParameterTypes().containsAll(ignoreableTypes()) - sut.defaultResponseMessages().keySet().containsAll(RequestMethod.values()) - sut.apiDescriptionOrdering() != null - sut.apiListingReferenceOrdering() != null - sut.defaultExcludeAnnotations().containsAll([ApiIgnore]) - sut.operationOrdering() != null - } - - - def "Verify default rules"() { - given: - def sut = new Defaults() - - when: - def rules = sut.defaultRules(resolver) - def evaluator = new AlternateTypeProvider(rules) - - then: - rules.size() == 19 - evaluator.alternateFor(source) == alternate - - where: - source | alternate - resolver.resolve(Map) | resolver.resolve(Object) - resolver.resolve(Map, String, Object) | resolver.resolve(Object) - resolver.resolve(Map, Object, Object) | resolver.resolve(Object) - resolver.resolve(Map, Object, Object) | resolver.resolve(Object) - resolver.resolve(LocalDate) | resolver.resolve(java.sql.Date) - resolver.resolve(LocalDateTime) | resolver.resolve(Date) - resolver.resolve(Instant) | resolver.resolve(Date) - resolver.resolve(OffsetDateTime) | resolver.resolve(Date) - resolver.resolve(ZonedDateTime) | resolver.resolve(Date) - resolver.resolve(org.joda.time.LocalDate) | resolver.resolve(java.sql.Date) - resolver.resolve(org.joda.time.LocalDateTime) | resolver.resolve(Date) - resolver.resolve(org.joda.time.Instant) | resolver.resolve(Date) - resolver.resolve(DateTime) | resolver.resolve(Date) - resolver.resolve(ReadableDateTime) | resolver.resolve(Date) - resolver.resolve(ReadableInstant) | resolver.resolve(Date) - resolver.resolve(DateMidnight) | resolver.resolve(Date) - } - - def ignoreableTypes() { - [Class.class, - Void.class, - Void.TYPE, - HttpHeaders.class, - BindingResult.class, - UriComponentsBuilder.class, - ApiIgnore.class] as Set - } -} diff --git a/springfox-spi/src/test/groovy/springfox/documentation/spi/service/contexts/SecurityContextSpec.groovy b/springfox-spi/src/test/groovy/springfox/documentation/spi/service/contexts/SecurityContextSpec.groovy deleted file mode 100644 index 6d2263949db..00000000000 --- a/springfox-spi/src/test/groovy/springfox/documentation/spi/service/contexts/SecurityContextSpec.groovy +++ /dev/null @@ -1,71 +0,0 @@ -package springfox.documentation.spi.service.contexts - - -import spock.lang.Specification -import springfox.documentation.OperationNameGenerator -import springfox.documentation.builders.OperationBuilder -import springfox.documentation.service.SecurityReference - -import java.util.function.Predicate - -import static org.springframework.web.bind.annotation.RequestMethod.* - -class SecurityContextSpec extends Specification { - def "Prefers operation selector"() { - given: - def sut = new SecurityContextBuilder() - .securityReferences([Mock(SecurityReference)]) - .forHttpMethods(methodSelector) - .forPaths(pathSelector) - .operationSelector(operationSelector) - .build() - - when: - def references = sut.securityForOperation(new OperationContext( - new OperationBuilder(Mock(OperationNameGenerator)), - PUT, - Mock(RequestMappingContext), - 0)) - - then: - references.size() - - where: - methodSelector | pathSelector | operationSelector | expectedReferences - null | null | null | 1 - truePredicate() | null | null | 1 - falsePredicate() | null | null | 0 - null | truePredicate() | null | 1 - truePredicate() | truePredicate() | null | 1 - falsePredicate() | truePredicate() | null | 0 - null | falsePredicate() | null | 1 - truePredicate() | falsePredicate() | null | 1 - falsePredicate() | falsePredicate() | null | 0 - null | null | truePredicate() | 1 - truePredicate() | null | truePredicate() | 1 - falsePredicate() | null | truePredicate() | 1 - null | truePredicate() | truePredicate() | 1 - truePredicate() | truePredicate() | truePredicate() | 1 - falsePredicate() | truePredicate() | truePredicate() | 1 - null | falsePredicate() | truePredicate() | 1 - truePredicate() | falsePredicate() | truePredicate() | 1 - falsePredicate() | falsePredicate() | truePredicate() | 1 - null | null | falsePredicate() | 0 - truePredicate() | null | falsePredicate() | 0 - falsePredicate() | null | falsePredicate() | 0 - null | truePredicate() | falsePredicate() | 0 - truePredicate() | truePredicate() | falsePredicate() | 0 - falsePredicate() | truePredicate() | falsePredicate() | 0 - null | falsePredicate() | falsePredicate() | 0 - truePredicate() | falsePredicate() | falsePredicate() | 0 - falsePredicate() | falsePredicate() | falsePredicate() | 0 - } - - private Predicate truePredicate() { - { each -> true } - } - - private Predicate falsePredicate() { - { each -> true } - } -} diff --git a/springfox-spring-config/build.gradle b/springfox-spring-config/build.gradle deleted file mode 100644 index 4f1b962a0f7..00000000000 --- a/springfox-spring-config/build.gradle +++ /dev/null @@ -1,7 +0,0 @@ -dependencies { - implementation "org.springframework.boot:spring-boot-starter-web:${springBoot}" - implementation libs.clientProvided - implementation project(':springfox-swagger1') - implementation project(':springfox-petstore') - implementation project(':springfox-swagger2') -} \ No newline at end of file diff --git a/springfox-spring-config/src/main/java/springfox/springconfig/AdditionalModel.java b/springfox-spring-config/src/main/java/springfox/springconfig/AdditionalModel.java deleted file mode 100644 index 0891038aaea..00000000000 --- a/springfox-spring-config/src/main/java/springfox/springconfig/AdditionalModel.java +++ /dev/null @@ -1,22 +0,0 @@ -/* - * - * Copyright 2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ -package springfox.springconfig; - -public class AdditionalModel { -} diff --git a/springfox-spring-config/src/main/java/springfox/springconfig/Swagger2SpringBoot.java b/springfox-spring-config/src/main/java/springfox/springconfig/Swagger2SpringBoot.java deleted file mode 100644 index 6b27797d0cd..00000000000 --- a/springfox-spring-config/src/main/java/springfox/springconfig/Swagger2SpringBoot.java +++ /dev/null @@ -1,176 +0,0 @@ -/* - * - * Copyright 2015-2018 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.springconfig; - -import com.fasterxml.classmate.TypeResolver; -import org.joda.time.LocalDate; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.ComponentScan; -import org.springframework.http.HttpMethod; -import org.springframework.http.MediaType; -import org.springframework.http.ResponseEntity; -import org.springframework.web.context.request.async.DeferredResult; -import springfox.documentation.builders.PathSelectors; -import springfox.documentation.builders.RequestHandlerSelectors; -import springfox.documentation.builders.ResponseBuilder; -import springfox.documentation.schema.ScalarType; -import springfox.documentation.schema.WildcardType; -import springfox.documentation.service.ApiKey; -import springfox.documentation.service.AuthorizationScope; -import springfox.documentation.service.ParameterType; -import springfox.documentation.service.SecurityReference; -import springfox.documentation.service.Tag; -import springfox.documentation.spi.DocumentationType; -import springfox.documentation.spi.service.contexts.SecurityContext; -import springfox.documentation.spring.web.plugins.Docket; -import springfox.documentation.swagger.web.DocExpansion; -import springfox.documentation.swagger.web.ModelRendering; -import springfox.documentation.swagger.web.OperationsSorter; -import springfox.documentation.swagger.web.SecurityConfiguration; -import springfox.documentation.swagger.web.SecurityConfigurationBuilder; -import springfox.documentation.swagger.web.TagsSorter; -import springfox.documentation.swagger.web.UiConfiguration; -import springfox.documentation.swagger.web.UiConfigurationBuilder; -import springfox.documentation.swagger2.annotations.EnableSwagger2; -import springfox.petstore.controller.PetController; - -import java.util.List; - -import static java.util.Collections.*; -import static springfox.documentation.schema.AlternateTypeRules.*; - - -@SpringBootApplication -@EnableSwagger2 //<1> -@ComponentScan(basePackageClasses = { - PetController.class -})//<2> -public class Swagger2SpringBoot { - - public static void main(String[] args) { - SpringApplication.run(Swagger2SpringBoot.class, args); - } - - - @Bean - public Docket petApi() { - return new Docket(DocumentationType.SWAGGER_2)//<3> - .select() //<4> - .apis(RequestHandlerSelectors.any()) //<5> - .paths(PathSelectors.any()) //<6> - .build() //<7> - .pathMapping("/") //<8> - .directModelSubstitute(LocalDate.class, String.class) //<9> - .genericModelSubstitutes(ResponseEntity.class) - .alternateTypeRules( - newRule(typeResolver.resolve(DeferredResult.class, - typeResolver.resolve(ResponseEntity.class, WildcardType.class)), - typeResolver.resolve(WildcardType.class))) //<10> - .useDefaultResponseMessages(false) //<11> - .globalResponses(HttpMethod.GET, //<12> - singletonList(new ResponseBuilder() - .code("500") - .description("500 message") - .representation(MediaType.TEXT_XML) - .apply(r -> - r.model(m -> - m.referenceModel(ref -> - ref.key(k -> - k.qualifiedModelName(q -> - q.namespace("some:namespace") - .name("ERROR")))))) //<13> - .build())) - .securitySchemes(singletonList(apiKey())) //<14> - .securityContexts(singletonList(securityContext())) //<15> - .enableUrlTemplating(true) //<21> - .globalRequestParameters(//<22> - singletonList(new springfox.documentation.builders.RequestParameterBuilder() - .name("someGlobalParameter") - .description("Description of someGlobalParameter") - .in(ParameterType.QUERY) - .required(true) - .query(q -> q.model(m -> m.scalarModel(ScalarType.STRING))) - .build())) - .tags(new Tag("Pet Service", "All apis relating to pets")) // <23> - .additionalModels(typeResolver.resolve(AdditionalModel.class)); //<24> - } - - @Autowired - private TypeResolver typeResolver; - - private ApiKey apiKey() { - return new ApiKey("mykey", "api_key", "header"); //<16> - } - - private SecurityContext securityContext() { - return SecurityContext.builder() - .securityReferences(defaultAuth()) - .forPaths(PathSelectors.regex("/anyPath.*")) //<17> - .build(); - } - - List defaultAuth() { - AuthorizationScope authorizationScope - = new AuthorizationScope("global", "accessEverything"); - AuthorizationScope[] authorizationScopes = new AuthorizationScope[1]; - authorizationScopes[0] = authorizationScope; - return singletonList( - new SecurityReference("mykey", authorizationScopes)); //<18> - } - - @Bean - SecurityConfiguration security() { - return SecurityConfigurationBuilder.builder() //<19> - .clientId("test-app-client-id") - .clientSecret("test-app-client-secret") - .realm("test-app-realm") - .appName("test-app") - .scopeSeparator(",") - .additionalQueryStringParams(null) - .useBasicAuthenticationWithAccessCodeGrant(false) - .enableCsrfSupport(false) - .build(); - } - - @Bean - UiConfiguration uiConfig() { - return UiConfigurationBuilder.builder() //<20> - .deepLinking(true) - .displayOperationId(false) - .defaultModelsExpandDepth(1) - .defaultModelExpandDepth(1) - .defaultModelRendering(ModelRendering.EXAMPLE) - .displayRequestDuration(false) - .docExpansion(DocExpansion.NONE) - .filter(false) - .maxDisplayedTags(null) - .operationsSorter(OperationsSorter.ALPHA) - .showExtensions(false) - .showCommonExtensions(false) - .tagsSorter(TagsSorter.ALPHA) - .supportedSubmitMethods(UiConfiguration.Constants.DEFAULT_SUBMIT_METHODS) - .validatorUrl(null) - .build(); - } - -} diff --git a/springfox-spring-config/src/main/java/springfox/springconfig/VersionApi.java b/springfox-spring-config/src/main/java/springfox/springconfig/VersionApi.java deleted file mode 100644 index 60f13c9b59c..00000000000 --- a/springfox-spring-config/src/main/java/springfox/springconfig/VersionApi.java +++ /dev/null @@ -1,29 +0,0 @@ -/* - * - * Copyright 2017-2019 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ -package springfox.springconfig; - -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -@Target({ ElementType.PARAMETER, ElementType.METHOD, ElementType.FIELD}) -@Retention(RetentionPolicy.RUNTIME) -public @interface VersionApi { -} diff --git a/springfox-spring-config/src/main/java/springfox/springconfig/VersionApiReader.java b/springfox-spring-config/src/main/java/springfox/springconfig/VersionApiReader.java deleted file mode 100644 index a3600c77bb2..00000000000 --- a/springfox-spring-config/src/main/java/springfox/springconfig/VersionApiReader.java +++ /dev/null @@ -1,67 +0,0 @@ -/* - * - * Copyright 2017-2019 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ -package springfox.springconfig; - -import com.fasterxml.classmate.TypeResolver; -import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Component; -import springfox.documentation.schema.ScalarType; -import springfox.documentation.service.ParameterStyle; -import springfox.documentation.service.ParameterType; -import springfox.documentation.service.ResolvedMethodParameter; -import springfox.documentation.spi.DocumentationType; -import springfox.documentation.spi.service.ParameterBuilderPlugin; -import springfox.documentation.spi.service.contexts.ParameterContext; -import springfox.documentation.swagger.common.SwaggerPluginSupport; - -import java.util.Optional; - -// tag::parameter-builder-plugin[] -@Component -@Order(SwaggerPluginSupport.SWAGGER_PLUGIN_ORDER + 1000) //<1> -public class VersionApiReader implements ParameterBuilderPlugin { - private TypeResolver resolver; - - public VersionApiReader(TypeResolver resolver) { - this.resolver = resolver; - } - - @Override - public void apply(ParameterContext parameterContext) { - ResolvedMethodParameter methodParameter = parameterContext.resolvedMethodParameter(); - Optional requestParam = methodParameter.findAnnotation(VersionApi.class); - if (requestParam.isPresent()) { //<2> - parameterContext.requestParameterBuilder() - .in(ParameterType.HEADER) - .name("v") - .query(q -> q.model(m -> m.scalarModel(ScalarType.STRING))); //<3> - parameterContext.requestParameterBuilder() - .in(ParameterType.HEADER) - .name("v") - .query(q -> q.style(ParameterStyle.SIMPLE) - .model(m -> m.scalarModel(ScalarType.STRING))); - } - } - - @Override - public boolean supports(DocumentationType documentationType) { - return true; //<4> - } -} -// end::parameter-builder-plugin[] diff --git a/springfox-spring-config/src/main/java/springfox/springconfig/VersionedController.java b/springfox-spring-config/src/main/java/springfox/springconfig/VersionedController.java deleted file mode 100644 index 91e158b13ef..00000000000 --- a/springfox-spring-config/src/main/java/springfox/springconfig/VersionedController.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - * - * Copyright 2017-2018 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ -package springfox.springconfig; - -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RestController; -import springfox.petstore.model.User; - -@RestController -public class VersionedController { - // tag::version-annotated-controller[] - @GetMapping("/user") - public ResponseEntity getUser( - @VersionApi int version, //<1> - @RequestParam("id") String id) { - throw new UnsupportedOperationException(); - } - // end::version-annotated-controller[] -} diff --git a/springfox-spring-config/src/test/groovy/springfox/.gitkeep b/springfox-spring-config/src/test/groovy/springfox/.gitkeep deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/springfox-spring-config/src/test/java/springfox/.gitkeep b/springfox-spring-config/src/test/java/springfox/.gitkeep deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/springfox-spring-config/src/test/resources/.gitkeep b/springfox-spring-config/src/test/resources/.gitkeep deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/springfox-spring-integration-webflux/README.md b/springfox-spring-integration-webflux/README.md deleted file mode 100644 index a9120ef1588..00000000000 --- a/springfox-spring-integration-webflux/README.md +++ /dev/null @@ -1,166 +0,0 @@ -# Springfox Spring-Integration WebFlux - -Adds basic automatic recognition of SpringFox documentation for spring-integration WebFlux inbound http endpoints. - -## Springfox in Spring Integration WebFlux - -To enable springfox in your spring-integration application, add the following dependencies: - -``` - - io.springfox - springfox-swagger2 - ${springfox.version} - - - io.springfox - springfox-spring-webflux - ${springfox.version} - - - io.springfox - springfox-spring-integration-webflux - ${springfox.version} - - - io.springfox - springfox-swagger-ui - ${springfox.version} - -``` - -## Using Spring REST Docs with Springfox - -In spring-integration there is no way to determine the resulting response by looking at a method return value - the -response is created further down the line by the integration flow which is attached to an http inbound endpoint. -The inbound endpoint has no knowledge about the ultimate response. - -Therefore we cannot provide response examples automatically, based on static code analysis. - -Instead, you can use integration tests to create documentation about the response bodies of an integration flow, -building on the [spring-restdocs](https://spring.io/projects/spring-restdocs) project. - -Add a dependency to `spring-restdocs-webtestclient`: - -``` - - org.springframework.restdocs - spring-restdocs-webtestclient - test - -``` - -Define a rule for restdocs in your JUnit WebTestClient test: -``` - @Rule - public JUnitRestDocumentation restDocumentation = new JUnitRestDocumentation(); -``` - -Configure spring-restdocs to use the `SpringfoxTemplateFormat` in your test setup: -``` - this.webTestClient = WebTestClient.bindToApplicationContext(this.context) - .configureClient() - .baseUrl("https://api.example.com") - .filter(documentationConfiguration(this.restDocumentation).snippets() - .withTemplateFormat(new SpringfoxTemplateFormat())) // <-- Template format - .build(); -``` - -Define the id of the inbound endpoint in the spring-integration Java DSL with a human friendly name: - -``` - @Bean - public IntegrationFlow toLowerFlow() { - return IntegrationFlows.from( - WebFlux.inboundGateway("/conversions/lower") - .id("toLowerGateway") // <-- id of endpoint - .requestMapping(r -> r.methods(HttpMethod.POST) - .consumes("application/json")) - .requestPayloadType(Foo.class)) - .handle((p, h) -> new Foo(p.getBar() - .toLowerCase())) - .get(); - } - -``` - -Document your response as part of the WebTestClient request, spring-restdocs style. Note the parameter which is -given to the `document()` method, it must start with the id of the inbound endpoint: - -``` - this.webTestClient.post().uri("/conversions/lower") - .contentType(MediaType.APPLICATION_JSON) - .syncBody("{\n" + - " \"bar\": \"Aragorn\",\n" + - " \"foo\": true,\n" + - " \"count\": 3\n" + - "}").exchange() - .expectStatus() - .isOk().expectBody().consumeWith( - document("toLowerGatewayAragorn")); // <-- starts with id of endpoint - -``` -This allows Springfox to collect all spring-restdocs snippets which belong to a particular endpoint. - -Note that the OpenApi 2.0 Specification allows only [one example per response code and media-type](https://github.com/OAI/OpenAPI-Specification/blob/master/versions/2.0.md#responseObject). -Starting from OpenApi 3.0 this will [change](https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.0.md#media-type-object), but Springfox does not support that version yet. -Therefore, if you have more than one test with a response having the same status code and media-type, Springfox's -internal data structure does maintain all examples correctly, but the Swagger2 documentation will only -use the last example. - - -Spring-Restdocs records request and response snippets during test execution, by default to the -folder _target/generated-snippets_. - -You need to tell the build that you want these snippets included in the application jar. - -In Maven: - -``` - - org.apache.maven.plugins - maven-resources-plugin - 3.1.0 - - - add-restdocs - prepare-package - - copy-resources - - - ${project.build.directory}/classes - - - target/generated-snippets - - - - - - -``` - -In Gradle we also need to ensure that the 'test' task is executed before 'jar': - -``` -jar { - dependsOn 'test' - sourceSets { - main { - java { - srcDirs = ['src/main/java'] - } - resources { - srcDirs = ["target/generated-snippets", "src/main/resources"] - } - } - } -} -``` -## Examples - -You can find an example application at -[springfox-integration-webflux](https://github.com/springfox/springfox-demos/springfox-integration-webflux). - - diff --git a/springfox-spring-integration-webflux/build.gradle b/springfox-spring-integration-webflux/build.gradle deleted file mode 100644 index a0376afb30e..00000000000 --- a/springfox-spring-integration-webflux/build.gradle +++ /dev/null @@ -1,34 +0,0 @@ -ext { - limits = [ - 'instruction': 96.5, - 'branch' : 91, - 'line' : 96.5, - 'complexity' : 92, - 'method' : 96, - 'class' : 100 - ] -} - -dependencies { - api project(':springfox-spi') - api project(':springfox-schema') - api project(':springfox-spring-web') - api project(':springfox-spring-webflux') - api project(':springfox-spring-integration') - - api libs.core - api libs.spring - compileOnly libs.clientProvided - compileOnly libs.springProvidedWithSpringIntegration - - testImplementation "javax.validation:validation-api:$validationApiVersion" - testImplementation project(':springfox-core') - testImplementation project(':springfox-spring-web').sourceSets.test.output - testImplementation project(':springfox-core').sourceSets.test.output - testImplementation project(':springfox-schema').sourceSets.test.output - - testImplementation libs.clientProvided - testImplementation libs.springProvidedWithSpringIntegration - testImplementation libs.test - testImplementation libs.swagger2Core -} diff --git a/springfox-spring-integration-webflux/src/main/java/springfox/documentation/spring/web/SpringIntegrationWebFluxRequestHandler.java b/springfox-spring-integration-webflux/src/main/java/springfox/documentation/spring/web/SpringIntegrationWebFluxRequestHandler.java deleted file mode 100644 index 3d1b7882e6f..00000000000 --- a/springfox-spring-integration-webflux/src/main/java/springfox/documentation/spring/web/SpringIntegrationWebFluxRequestHandler.java +++ /dev/null @@ -1,86 +0,0 @@ -/* - * - * Copyright 2016-2017 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ -package springfox.documentation.spring.web; - -import com.fasterxml.classmate.ResolvedType; -import org.springframework.core.annotation.AnnotationUtils; -import org.springframework.integration.http.inbound.BaseHttpInboundEndpoint; -import org.springframework.web.method.HandlerMethod; -import org.springframework.web.reactive.result.method.RequestMappingInfo; -import springfox.documentation.service.ResolvedMethodParameter; -import springfox.documentation.spring.web.plugins.SpringIntegrationParametersProvider; -import springfox.documentation.spring.web.readers.operation.HandlerMethodResolver; - -import java.lang.annotation.Annotation; -import java.util.List; -import java.util.Optional; - -import static java.util.Optional.*; - -/** - * Provides information about WebFlux based Spring Integration inbound HTTP handlers. - */ -public class SpringIntegrationWebFluxRequestHandler extends WebFluxRequestHandler { - private final HandlerMethodResolver methodResolver; - private final HandlerMethod handlerMethod; - private final SpringIntegrationParametersProvider parametersProvider; - - public SpringIntegrationWebFluxRequestHandler( - HandlerMethodResolver methodResolver, - RequestMappingInfo requestMapping, - HandlerMethod handlerMethod, - SpringIntegrationParametersProvider parametersProvider) { - super(methodResolver, requestMapping, handlerMethod); - - this.methodResolver = methodResolver; - this.handlerMethod = handlerMethod; - this.parametersProvider = parametersProvider; - } - - @Override - public String groupName() { - // TODO come up with a better group name, instead of generic handler class name - // maybe the defining class of a flow in DSL? - but what about xml? - return ControllerNamingUtils.controllerNameAsGroup(handlerMethod); - } - - @Override - public String getName() { - return ((BaseHttpInboundEndpoint) handlerMethod.getBean()) - .getComponentName(); - } - - @Override - public ResolvedType getReturnType() { - // always void, hence we need the spring restdocs plugin - return methodResolver.methodReturnType(handlerMethod); - } - - @Override - public Optional findAnnotation(Class annotation) { - // TODO see if we can synthesize the annotations usually requested here - return ofNullable(AnnotationUtils.findAnnotation(handlerMethod.getMethod(), annotation)); - } - - @Override - public List getParameters() { - return parametersProvider - .getParameters((BaseHttpInboundEndpoint) handlerMethod.getBean()); - } -} diff --git a/springfox-spring-integration-webflux/src/main/java/springfox/documentation/spring/web/package-info.java b/springfox-spring-integration-webflux/src/main/java/springfox/documentation/spring/web/package-info.java deleted file mode 100644 index 7651dc495e7..00000000000 --- a/springfox-spring-integration-webflux/src/main/java/springfox/documentation/spring/web/package-info.java +++ /dev/null @@ -1,46 +0,0 @@ -/* - * - * Copyright 2016-2017 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -/** - * Adds support for Spring Integration WebFlux inbound adapters and gateways. - *

- * Builds upon the springfox webflux implementation, but uses Spring Integration http - * endpoint configurations to create documentation. - * - *

- * Key extension points: - *

    - *
  • SpringIntegrationWebFluxRequestHandlerProvider creates SpringIntegrationWebFluxRequestHandler for - * WebFluxIntegrationRequestMappingHandlerMapping with Order LOWEST_PRECEDENCE and handles webflux HandlerMappings
  • - *
  • SpringIntegrationWebFluxRequestHandler synthesizes RequestBody annotation from - * requestPayloadType field of inbound endpoint and RequestParam annotations from payloadExpression - * and headerExpressions
  • - *
- * - *

- * Changes to existing code: - *

    - *
  • Filter for Integration Handler Mappings in - * {@link springfox.documentation.spring.web.plugins.WebFluxRequestHandlerProvider}
  • - *
- * - * @see springfox.documentation.spring.web.plugins.SpringIntegrationWebFluxRequestHandlerProvider - * @see springfox.documentation.spring.web.SpringIntegrationWebFluxRequestHandler - */ -package springfox.documentation.spring.web; \ No newline at end of file diff --git a/springfox-spring-integration-webflux/src/main/java/springfox/documentation/spring/web/plugins/SpringIntegrationWebFluxRequestHandlerProvider.java b/springfox-spring-integration-webflux/src/main/java/springfox/documentation/spring/web/plugins/SpringIntegrationWebFluxRequestHandlerProvider.java deleted file mode 100644 index 66f5679a407..00000000000 --- a/springfox-spring-integration-webflux/src/main/java/springfox/documentation/spring/web/plugins/SpringIntegrationWebFluxRequestHandlerProvider.java +++ /dev/null @@ -1,84 +0,0 @@ -/* - * - * Copyright 2015-2017 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ -package springfox.documentation.spring.web.plugins; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.core.annotation.Order; -import org.springframework.integration.webflux.inbound.WebFluxIntegrationRequestMappingHandlerMapping; -import org.springframework.stereotype.Component; -import org.springframework.web.method.HandlerMethod; -import org.springframework.web.reactive.result.method.RequestMappingInfo; -import springfox.documentation.RequestHandler; -import springfox.documentation.spi.service.RequestHandlerProvider; -import springfox.documentation.spring.web.SpringIntegrationWebFluxRequestHandler; -import springfox.documentation.spring.web.readers.operation.HandlerMethodResolver; - -import java.util.Collection; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.function.Function; - -import static java.util.stream.Collectors.*; -import static springfox.documentation.builders.BuilderDefaults.*; -import static springfox.documentation.spi.service.contexts.Orderings.*; - -@Component -@Order -public class SpringIntegrationWebFluxRequestHandlerProvider implements RequestHandlerProvider { - private final List handlerMappings; - private final HandlerMethodResolver methodResolver; - private final SpringIntegrationParametersProvider parametersProvider; - - @Autowired - public SpringIntegrationWebFluxRequestHandlerProvider( - HandlerMethodResolver methodResolver, - List handlerMappings, - SpringIntegrationParametersProvider parametersProvider) { - this.handlerMappings = handlerMappings; - this.methodResolver = methodResolver; - this.parametersProvider = parametersProvider; - } - - @Override - public List requestHandlers() { - return nullToEmptyList(handlerMappings).stream() - .map(toMappingEntries()) - .flatMap((Collection::stream)) - .map(toRequestHandler()) - .sorted(byPatternsCondition()) - .collect(toList()); - } - - private Function>> toMappingEntries() { - return input -> { - Map handlerMethods = input.getHandlerMethods(); - return handlerMethods.entrySet(); - }; - } - - private Function, RequestHandler> toRequestHandler() { - return input -> new SpringIntegrationWebFluxRequestHandler( - methodResolver, - input.getKey(), - input.getValue(), - parametersProvider); - } -} diff --git a/springfox-spring-integration-webflux/src/main/resources/.gitkeep b/springfox-spring-integration-webflux/src/main/resources/.gitkeep deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/springfox-spring-integration-webflux/src/test/groovy/springfox/documentation/spring/web/SpringIntegrationWebFluxRequestHandlerSpec.groovy b/springfox-spring-integration-webflux/src/test/groovy/springfox/documentation/spring/web/SpringIntegrationWebFluxRequestHandlerSpec.groovy deleted file mode 100644 index 687f7134e56..00000000000 --- a/springfox-spring-integration-webflux/src/test/groovy/springfox/documentation/spring/web/SpringIntegrationWebFluxRequestHandlerSpec.groovy +++ /dev/null @@ -1,108 +0,0 @@ -/* - * - * Copyright 2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.spring.web - -import com.fasterxml.classmate.ResolvedType -import io.swagger.annotations.Api -import org.springframework.integration.http.inbound.BaseHttpInboundEndpoint -import org.springframework.integration.webflux.inbound.WebFluxInboundEndpoint -import org.springframework.web.method.HandlerMethod -import org.springframework.web.reactive.result.method.RequestMappingInfo -import spock.lang.Specification -import springfox.documentation.service.ResolvedMethodParameter -import springfox.documentation.spring.web.dummy.DummyClass -import springfox.documentation.spring.web.dummy.models.Example -import springfox.documentation.spring.web.plugins.SpringIntegrationParametersProvider -import springfox.documentation.spring.web.readers.operation.HandlerMethodResolver - -class SpringIntegrationWebFluxRequestHandlerSpec extends Specification { - - def methodResolver = Mock(HandlerMethodResolver) - def requestMappingInfo = RequestMappingInfo.paths("/foo").build() - def inboundEndpoint = Mock(BaseHttpInboundEndpoint) - def handlerMethod = Mock(HandlerMethod) { - getBean() >> inboundEndpoint - getMethod() >> method() - } - def resolvedMethodParameter = Mock(ResolvedMethodParameter) - def parametersProvider = Mock(SpringIntegrationParametersProvider) { - getParameters(_) >> [resolvedMethodParameter] - } - - def requestHandler = new SpringIntegrationWebFluxRequestHandler( - methodResolver, requestMappingInfo, handlerMethod, parametersProvider - ) - - def "Gets Group Name"() { - given: - handlerMethod.getBeanType() >> WebFluxInboundEndpoint - - when: - def groupName = requestHandler.groupName() - - then: - groupName == "web-flux-inbound-endpoint" - - } - - def "Gets Name"() { - given: - inboundEndpoint.getComponentName() >> "baz" - - when: - def name = requestHandler.getName() - - then: - name == "baz" - - } - - def "Gets ReturnType"() { - given: - def resolvedType = Mock(ResolvedType) - methodResolver.methodReturnType(_) >> resolvedType - - when: - def returnType = requestHandler.getReturnType() - - then: - returnType == resolvedType - } - - def "Finds Annotation"() { - when: - def annotation = requestHandler.findAnnotation(Api) - - then: - annotation.isPresent() == false - } - - def "Gets Parameters"() { - when: - def parameters = requestHandler.getParameters() - - then: - parameters.size() == 1 - - } - def method() { - Example.methods.find { it.name == "getFoo" } - } -} diff --git a/springfox-spring-integration-webflux/src/test/groovy/springfox/documentation/spring/web/plugins/SpringIntegrationWebFluxRequestHandlerProviderSpec.groovy b/springfox-spring-integration-webflux/src/test/groovy/springfox/documentation/spring/web/plugins/SpringIntegrationWebFluxRequestHandlerProviderSpec.groovy deleted file mode 100644 index 98e1282c232..00000000000 --- a/springfox-spring-integration-webflux/src/test/groovy/springfox/documentation/spring/web/plugins/SpringIntegrationWebFluxRequestHandlerProviderSpec.groovy +++ /dev/null @@ -1,52 +0,0 @@ -/* - * - * Copyright 2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.spring.web.plugins - -import org.springframework.integration.webflux.inbound.WebFluxIntegrationRequestMappingHandlerMapping -import org.springframework.web.method.HandlerMethod -import org.springframework.web.reactive.result.method.RequestMappingInfo -import spock.lang.Specification -import springfox.documentation.spring.web.SpringIntegrationWebFluxRequestHandler -import springfox.documentation.spring.web.readers.operation.HandlerMethodResolver - -class SpringIntegrationWebFluxRequestHandlerProviderSpec extends Specification { - def methodResolver = Mock(HandlerMethodResolver) - def handlerMapping = Mock(WebFluxIntegrationRequestMappingHandlerMapping) - def handlerMappings = [handlerMapping] - SpringIntegrationParametersProvider parametersProvider = Mock(SpringIntegrationParametersProvider) - - def provider = new SpringIntegrationWebFluxRequestHandlerProvider(methodResolver, - handlerMappings, parametersProvider) - - def "Provides request handlers"() { - given: - def requestMappingInfo = RequestMappingInfo.paths("/foo").build() - def handlerMethod = Mock(HandlerMethod) - def handlerMethods = [(requestMappingInfo): handlerMethod] - handlerMapping.getHandlerMethods() >> handlerMethods - - when: - def handlers = provider.requestHandlers() - - then: - handlers.size() == 1 - handlers[0] instanceof SpringIntegrationWebFluxRequestHandler - } -} diff --git a/springfox-spring-integration-webmvc/README.md b/springfox-spring-integration-webmvc/README.md deleted file mode 100644 index d121042dfcb..00000000000 --- a/springfox-spring-integration-webmvc/README.md +++ /dev/null @@ -1,164 +0,0 @@ -# Springfox Spring-Integration WebMvc - -Adds basic automatic recognition of SpringFox documentation for spring-integration WebMvc inbound http endpoints and -allows to document responses through tests. - -## Springfox in Spring Integration WebMvc - -To enable springfox in your spring-integration webmvc application, add the following dependencies: - -``` - - io.springfox - springfox-swagger2 - ${springfox.version} - - - io.springfox - springfox-spring-webmvc - ${springfox.version} - - - io.springfox - springfox-spring-integration-webmvc - ${springfox.version} - - - io.springfox - springfox-swagger-ui - ${springfox.version} - -``` - -## Using Spring REST Docs with Springfox - -In spring-integration there is no way to determine the resulting response by looking at a method return value - the -response is created further down the line by the integration flow which is attached to an http inbound endpoint. -The inbound endpoint has no knowledge about the ultimate response. - -Therefore we cannot provide response examples automatically, based on static code analysis. - -Instead, you can use integration tests to create documentation about the response bodies of an integration flow, -building on the [spring-restdocs](https://spring.io/projects/spring-restdocs) project. - -Add a dependency to `spring-restdocs-mockmvc`: - -``` - - org.springframework.restdocs - spring-restdocs-mockmvc - test - -``` - -Define a rule for restdocs in your JUnit MockMvc test: -``` - @Rule - public JUnitRestDocumentation restDocumentation = new JUnitRestDocumentation(); -``` - -Configure spring-restdocs to use the `SpringfoxTemplateFormat` in your test setup: -``` - this.mockMvc = MockMvcBuilders.webAppContextSetup(this.context) - .apply(documentationConfiguration(this.restDocumentation) - .snippets() - .withTemplateFormat( - new SpringfoxTemplateFormat()) // <-- Template format - ) - .build(); - -``` - -Define the id of the inbound endpoint in the spring-integration Java DSL with a human friendly name: -``` - @Bean - public IntegrationFlow toLowerFlow() { - return IntegrationFlows.from( - Http.inboundGateway("/conversions/lower") - .requestMapping(r -> r.methods(HttpMethod.POST) - .consumes("application/json")) - .requestPayloadType(Foo.class) - .id("toLowerGateway")) // <-- id of endpoint - .handle((p, h) -> new Foo(p.getBar() - .toLowerCase())) - .get(); - } -``` - -Document your response as part of the MockMvc request, spring-restdocs style. Note the parameter which is -given to the `document()` method, it must start with the id of the inbound endpoint: - -``` - mockMvc.perform( - MockMvcRequestBuilders.post("/conversions/lower") - .contentType(MediaType.APPLICATION_JSON) - .content("{\"foo\": \"TOLOWERTHIS\"}")) - .andExpect(MockMvcResultMatchers.status() - .isOk()) - .andDo(document("toLowerGatewaySuccess") // <-- starts with id of endpoint - ))); -``` -This allows Springfox to collect all spring-restdocs snippets which belong to a particular endpoint. - -Note that the OpenApi 2.0 Specification allows only [one example per response code and media-type](https://github.com/OAI/OpenAPI-Specification/blob/master/versions/2.0.md#responseObject). -Starting from OpenApi 3.0 this will [change](https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.0.md#media-type-object), but Springfox does not support that version yet. -Therefore, if you have more than one test with a response having the same status code and media-type, Springfox's -internal data structure does maintain all examples correctly, but the Swagger2 documentation will only -use the last example. - - -Spring-Restdocs records request and response snippets during test execution, by default to the -folder _target/generated-snippets_. - -You need to tell the build that you want these snippets included in the application jar. - -In Maven: - -``` - - org.apache.maven.plugins - maven-resources-plugin - 3.1.0 - - - add-restdocs - prepare-package - - copy-resources - - - ${project.build.directory}/classes - - - target/generated-snippets - - - - - - -``` - -In Gradle we also need to ensure that the 'test' task is executed before 'jar': - -``` -jar { - dependsOn 'test' - sourceSets { - main { - java { - srcDirs = ['src/main/java'] - } - resources { - srcDirs = ["target/generated-snippets", "src/main/resources"] - } - } - } -} -``` -## Examples - -You can find an example application at -[springfox-integration-webmvc](https://github.com/springfox/springfox-demos/springfox-integration-webmvc). - - diff --git a/springfox-spring-integration-webmvc/build.gradle b/springfox-spring-integration-webmvc/build.gradle deleted file mode 100644 index 06e8c80914c..00000000000 --- a/springfox-spring-integration-webmvc/build.gradle +++ /dev/null @@ -1,35 +0,0 @@ -ext { - limits = [ - 'instruction': 96.5, - 'branch' : 91, - 'line' : 96.5, - 'complexity' : 92, - 'method' : 96, - 'class' : 100 - ] -} - -dependencies { - api libs.core - api libs.spring - api project(':springfox-spi') - api project(':springfox-schema') - api project(':springfox-spring-web') - api project(':springfox-spring-webmvc') - api project(':springfox-spring-integration') - - compileOnly libs.clientProvided - compileOnly libs.springProvidedWithSpringIntegration - compileOnly "jakarta.servlet:jakarta.servlet-api:$servlet" - - testImplementation "javax.validation:validation-api:$validationApiVersion" - testImplementation project(':springfox-core') - testImplementation project(':springfox-spring-web').sourceSets.test.output - testImplementation libs.springProvidedWithSpringIntegration - testImplementation libs.test - testImplementation libs.swagger2Core - testImplementation project(':springfox-core').sourceSets.test.output - testImplementation project(':springfox-schema').sourceSets.test.output - testImplementation "jakarta.servlet:jakarta.servlet-api:$servlet" - implementation libs.clientProvided -} diff --git a/springfox-spring-integration-webmvc/src/main/java/springfox/documentation/spring/web/SpringIntegrationWebMvcRequestHandler.java b/springfox-spring-integration-webmvc/src/main/java/springfox/documentation/spring/web/SpringIntegrationWebMvcRequestHandler.java deleted file mode 100644 index d4d815553c4..00000000000 --- a/springfox-spring-integration-webmvc/src/main/java/springfox/documentation/spring/web/SpringIntegrationWebMvcRequestHandler.java +++ /dev/null @@ -1,89 +0,0 @@ -/* - * - * Copyright 2016-2017 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ -package springfox.documentation.spring.web; - -import com.fasterxml.classmate.ResolvedType; -import org.springframework.core.annotation.AnnotationUtils; -import org.springframework.integration.http.inbound.BaseHttpInboundEndpoint; -import org.springframework.web.method.HandlerMethod; -import org.springframework.web.servlet.mvc.method.RequestMappingInfo; -import springfox.documentation.service.ResolvedMethodParameter; -import springfox.documentation.spring.web.plugins.SpringIntegrationParametersProvider; -import springfox.documentation.spring.web.readers.operation.HandlerMethodResolver; - -import java.lang.annotation.Annotation; -import java.util.List; -import java.util.Optional; - -import static java.util.Optional.*; - -/** - * Provides information about WebMvc based Spring Integration inbound HTTP handlers. - */ -public class SpringIntegrationWebMvcRequestHandler extends WebMvcRequestHandler { - private final HandlerMethodResolver methodResolver; - private final HandlerMethod handlerMethod; - private SpringIntegrationParametersProvider parametersProvider; - - public SpringIntegrationWebMvcRequestHandler( - String contextPath, - HandlerMethodResolver methodResolver, - RequestMappingInfo requestMapping, - HandlerMethod handlerMethod, - SpringIntegrationParametersProvider parametersProvider) { - super(contextPath, methodResolver, requestMapping, handlerMethod); - - this.methodResolver = methodResolver; - this.handlerMethod = handlerMethod; - this.parametersProvider = parametersProvider; - } - - @Override - public String groupName() { - // TODO come up with a better group name, instead of generic handler class name - // maybe the defining class of a flow in DSL? - but what about xml? - return ControllerNamingUtils.controllerNameAsGroup(handlerMethod); - } - - @Override - public String getName() { - return ((BaseHttpInboundEndpoint) handlerMethod.getBean()) - .getComponentName(); - } - - @Override - public ResolvedType getReturnType() { - // always void, hence we need the spring restdocs plugin - return methodResolver.methodReturnType(handlerMethod); - } - - @Override - public Optional findAnnotation(Class annotation) { - // TODO see if we can synthesize the annotations usually requested here - return ofNullable(AnnotationUtils.findAnnotation(handlerMethod.getMethod(), annotation)); - } - - @Override - public List getParameters() { - - BaseHttpInboundEndpoint inboundEndpoint = (BaseHttpInboundEndpoint) handlerMethod.getBean(); - return parametersProvider.getParameters(inboundEndpoint); - } - -} diff --git a/springfox-spring-integration-webmvc/src/main/java/springfox/documentation/spring/web/package-info.java b/springfox-spring-integration-webmvc/src/main/java/springfox/documentation/spring/web/package-info.java deleted file mode 100644 index 596819c1dee..00000000000 --- a/springfox-spring-integration-webmvc/src/main/java/springfox/documentation/spring/web/package-info.java +++ /dev/null @@ -1,46 +0,0 @@ -/* - * - * Copyright 2016-2017 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -/** - * Adds support for Spring Integration WebMvc inbound adapters and gateways. - *

- * Builds upon the springfox webmvc implementation, but uses Spring Integration http - * endpoint configurations to create documentation. - * - *

- * Key extension points: - *

    - *
  • SpringIntegrationWebMvcRequestHandlerProvider creates SpringIntegrationWebMvcRequestHandler for - * WebMvcIntegrationRequestMappingHandlerMapping with Order LOWEST_PRECEDENCE and handles webmvc HandlerMappings
  • - *
  • SpringIntegrationWebMvcRequestHandler synthesizes RequestBody annotation from - * requestPayloadType field of inbound endpoint and RequestParam annotations from payloadExpression - * and headerExpressions
  • - *
- * - *

- * Changes to existing code: - *

    - *
  • Filter for Integration Handler Mappings in - * {@link springfox.documentation.spring.web.plugins.WebMvcRequestHandlerProvider}
  • - *
- * - * @see springfox.documentation.spring.web.plugins.SpringIntegrationWebMvcRequestHandlerProvider - * @see springfox.documentation.spring.web.SpringIntegrationWebMvcRequestHandler - */ -package springfox.documentation.spring.web; \ No newline at end of file diff --git a/springfox-spring-integration-webmvc/src/main/java/springfox/documentation/spring/web/plugins/SpringIntegrationWebMvcRequestHandlerProvider.java b/springfox-spring-integration-webmvc/src/main/java/springfox/documentation/spring/web/plugins/SpringIntegrationWebMvcRequestHandlerProvider.java deleted file mode 100644 index a6b6f04d8ae..00000000000 --- a/springfox-spring-integration-webmvc/src/main/java/springfox/documentation/spring/web/plugins/SpringIntegrationWebMvcRequestHandlerProvider.java +++ /dev/null @@ -1,93 +0,0 @@ -/* - * - * Copyright 2015-2017 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ -package springfox.documentation.spring.web.plugins; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.core.annotation.Order; -import org.springframework.integration.http.inbound.IntegrationRequestMappingHandlerMapping; -import org.springframework.stereotype.Component; -import org.springframework.web.method.HandlerMethod; -import org.springframework.web.servlet.mvc.method.RequestMappingInfo; -import springfox.documentation.RequestHandler; -import springfox.documentation.spi.service.RequestHandlerProvider; -import springfox.documentation.spring.web.SpringIntegrationWebMvcRequestHandler; -import springfox.documentation.spring.web.readers.operation.HandlerMethodResolver; - -import jakarta.servlet.ServletContext; -import java.util.Collection; -import java.util.List; -import java.util.Map; -import java.util.Optional; -import java.util.Set; -import java.util.function.Function; - -import static java.util.stream.Collectors.*; -import static springfox.documentation.builders.BuilderDefaults.*; -import static springfox.documentation.spi.service.contexts.Orderings.*; -import static springfox.documentation.spring.web.paths.Paths.*; - -@Component -@Order -public class SpringIntegrationWebMvcRequestHandlerProvider implements RequestHandlerProvider { - private final List handlerMappings; - private final HandlerMethodResolver methodResolver; - private final String contextPath; - private SpringIntegrationParametersProvider parametersProvider; - - @Autowired - public SpringIntegrationWebMvcRequestHandlerProvider( - Optional servletContext, - HandlerMethodResolver methodResolver, - List handlerMappings, - SpringIntegrationParametersProvider parametersProvider) { - this.handlerMappings = handlerMappings; - this.methodResolver = methodResolver; - this.parametersProvider = parametersProvider; - this.contextPath = servletContext - .map(ServletContext::getContextPath) - .orElse(ROOT); - } - - @Override - public List requestHandlers() { - return nullToEmptyList(handlerMappings).stream() - .map(toMappingEntries()) - .flatMap((Collection::stream)) - .map(toRequestHandler()) - .sorted(byPatternsCondition()) - .collect(toList()); - } - - private Function>> toMappingEntries() { - return input -> { - Map handlerMethods = input.getHandlerMethods(); - return handlerMethods.entrySet(); - }; - } - - private Function, RequestHandler> toRequestHandler() { - return input -> new SpringIntegrationWebMvcRequestHandler( - contextPath, - methodResolver, - input.getKey(), - input.getValue(), - parametersProvider); - } -} diff --git a/springfox-spring-integration-webmvc/src/main/resources/.gitkeep b/springfox-spring-integration-webmvc/src/main/resources/.gitkeep deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/springfox-spring-integration-webmvc/src/test/groovy/springfox/documentation/spring/web/SpringIntegrationWebMvcRequestHandlerSpec.groovy b/springfox-spring-integration-webmvc/src/test/groovy/springfox/documentation/spring/web/SpringIntegrationWebMvcRequestHandlerSpec.groovy deleted file mode 100644 index 1d473340b42..00000000000 --- a/springfox-spring-integration-webmvc/src/test/groovy/springfox/documentation/spring/web/SpringIntegrationWebMvcRequestHandlerSpec.groovy +++ /dev/null @@ -1,112 +0,0 @@ -/* - * - * Copyright 2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.spring.web - -import com.fasterxml.classmate.ResolvedType -import io.swagger.annotations.Api -import org.springframework.integration.http.inbound.BaseHttpInboundEndpoint -import org.springframework.integration.webflux.inbound.WebFluxInboundEndpoint -import org.springframework.util.ReflectionUtils -import org.springframework.web.HttpRequestHandler -import org.springframework.web.method.HandlerMethod -import org.springframework.web.servlet.mvc.method.RequestMappingInfo -import spock.lang.Specification -import springfox.documentation.service.ResolvedMethodParameter -import springfox.documentation.spring.web.plugins.SpringIntegrationParametersProvider -import springfox.documentation.spring.web.readers.operation.HandlerMethodResolver - -import jakarta.servlet.http.HttpServletRequest -import jakarta.servlet.http.HttpServletResponse - -class SpringIntegrationWebMvcRequestHandlerSpec extends Specification { - - def method = ReflectionUtils.findMethod( - HttpRequestHandler.class, - "handleRequest", - HttpServletRequest.class, - HttpServletResponse.class) - - def methodResolver = Mock(HandlerMethodResolver) - def requestMappingInfo = RequestMappingInfo.paths("/foo").build() - def inboundEndpoint = Mock(BaseHttpInboundEndpoint) - def handlerMethod = Mock(HandlerMethod) { - getBean() >> inboundEndpoint - getMethod() >> method - } - def resolvedMethodParameter = Mock(ResolvedMethodParameter) - def parametersProvider = Mock(SpringIntegrationParametersProvider) { - getParameters(_) >> [resolvedMethodParameter] - } - - def requestHandler = new SpringIntegrationWebMvcRequestHandler( - "", methodResolver, requestMappingInfo, handlerMethod, parametersProvider - ) - - def "Gets Group Name"() { - given: - handlerMethod.getBeanType() >> WebFluxInboundEndpoint - - when: - def groupName = requestHandler.groupName() - - then: - groupName == "web-flux-inbound-endpoint" - } - - def "Gets Name"() { - given: - inboundEndpoint.getComponentName() >> "baz" - - when: - def name = requestHandler.getName() - - then: - name == "baz" - } - - def "Gets ReturnType"() { - given: - def resolvedType = Mock(ResolvedType) - methodResolver.methodReturnType(_) >> resolvedType - - when: - def returnType = requestHandler.getReturnType() - - then: - returnType == resolvedType - } - - def "Finds Annotation"() { - when: - def annotation = requestHandler.findAnnotation(Api) - - then: - annotation.isPresent() == false - } - - def "Gets Parameters"() { - when: - def parameters = requestHandler.getParameters() - - then: - parameters.size() == 1 - - } -} diff --git a/springfox-spring-integration-webmvc/src/test/groovy/springfox/documentation/spring/web/plugins/SpringIntegrationWebMvcRequestHandlerProviderSpec.groovy b/springfox-spring-integration-webmvc/src/test/groovy/springfox/documentation/spring/web/plugins/SpringIntegrationWebMvcRequestHandlerProviderSpec.groovy deleted file mode 100644 index 1c26fc32a52..00000000000 --- a/springfox-spring-integration-webmvc/src/test/groovy/springfox/documentation/spring/web/plugins/SpringIntegrationWebMvcRequestHandlerProviderSpec.groovy +++ /dev/null @@ -1,62 +0,0 @@ -/* - * - * Copyright 2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.spring.web.plugins - -import org.springframework.integration.http.inbound.BaseHttpInboundEndpoint -import org.springframework.integration.http.inbound.IntegrationRequestMappingHandlerMapping -import org.springframework.util.ReflectionUtils -import org.springframework.web.HttpRequestHandler -import org.springframework.web.servlet.mvc.method.RequestMappingInfo -import spock.lang.Specification -import springfox.documentation.spring.web.SpringIntegrationWebMvcRequestHandler -import springfox.documentation.spring.web.readers.operation.HandlerMethodResolver - -import jakarta.servlet.http.HttpServletRequest -import jakarta.servlet.http.HttpServletResponse - -class SpringIntegrationWebMvcRequestHandlerProviderSpec extends Specification { - def methodResolver = Mock(HandlerMethodResolver) - def handler = Mock(BaseHttpInboundEndpoint) - def method = ReflectionUtils.findMethod( - HttpRequestHandler.class, - "handleRequest", - HttpServletRequest.class, - HttpServletResponse.class) - - def parametersProvider = Mock(SpringIntegrationParametersProvider) - - def "Provides request handlers"() { - given: - def handlerMapping = new IntegrationRequestMappingHandlerMapping() - def requestMappingInfo = RequestMappingInfo.paths("/foo").build() - handlerMapping.registerMapping(requestMappingInfo, handler, method) - def handlerMappings = [handlerMapping] - - def provider = new SpringIntegrationWebMvcRequestHandlerProvider( - Optional.empty(), methodResolver, handlerMappings, parametersProvider) - - when: - def handlers = provider.requestHandlers() - - then: - handlers.size() == 1 - handlers[0] instanceof SpringIntegrationWebMvcRequestHandler - } -} \ No newline at end of file diff --git a/springfox-spring-integration/README.md b/springfox-spring-integration/README.md deleted file mode 100644 index 8a03e3bcb39..00000000000 --- a/springfox-spring-integration/README.md +++ /dev/null @@ -1,24 +0,0 @@ -# Springfox Spring-Integration - -Common parts of spring-integration WebFlux and WebMvc implementations. - -## Choose Your Web Technology - -In Spring Integration, the spring-integration-http module contains common base classes for WebFlux and WebMvc. -In your Spring Integration application, you need to choose the actual web technology by defining the correct -dependency to WebMvc or WebFlux, e.g. by depending on spring-boot-starter-web or spring-boot-starter-webflux -respectively. This is described in the spring-integration reference guide. Depending on the web technology you have to -choose the matching springfox-spring-integration implementation for WebMvc _or_ WebFlux - you cannot have both. - -## Document Using Tests - -Furthermore, since it is not feasible to use static code analysis to find out about responses of spring-integration -http inbound endpoints, springfox-spring-integration offers a possibility to use spring-restdocs to document response -bodies. We inject our own `SpringFoxTemplateFormat` instead of asciidoc or markdown in the test configuration -and evaluate the documentation snippets generated during test execution from this template format in -`SpringRestDocsOperationBuilderPlugin`. - -For more information see the readme files of -[springfox-spring-integration-webmvc](../springfox-spring-integration-webmvc) and - [springfox-spring-integration-webflux](../springfox-spring-integration-webflux). - diff --git a/springfox-spring-integration/build.gradle b/springfox-spring-integration/build.gradle deleted file mode 100644 index d7486489fcd..00000000000 --- a/springfox-spring-integration/build.gradle +++ /dev/null @@ -1,33 +0,0 @@ -ext { - limits = [ - 'instruction': 96.5, - 'branch' : 91, - 'line' : 96.5, - 'complexity' : 92, - 'method' : 96, - 'class' : 100 - ] -} - -dependencies { - api libs.core - api libs.spring - - api project(':springfox-spi') - api project(':springfox-core') - api project(':springfox-spring-web') - api project(':springfox-schema') - - implementation "com.athaydes.rawhttp:rawhttp-core:2.4.0" - compileOnly libs.springProvidedWithSpringIntegration - compileOnly "org.springframework.restdocs:spring-restdocs-mockmvc:2.0.4.RELEASE" - compileOnly libs.clientProvided - - testImplementation libs.test - testImplementation libs.swagger2Core - testImplementation libs.springProvidedWithSpringIntegration - testImplementation project(':springfox-spring-web').sourceSets.test.output - testImplementation project(':springfox-core').sourceSets.test.output - testImplementation project(':springfox-schema').sourceSets.test.output - testImplementation "javax.validation:validation-api:$validationApiVersion" -} diff --git a/springfox-spring-integration/src/main/java/springfox/documentation/spring/web/SpringfoxTemplateFormat.java b/springfox-spring-integration/src/main/java/springfox/documentation/spring/web/SpringfoxTemplateFormat.java deleted file mode 100644 index c6bc7f2abc3..00000000000 --- a/springfox-spring-integration/src/main/java/springfox/documentation/spring/web/SpringfoxTemplateFormat.java +++ /dev/null @@ -1,39 +0,0 @@ -/* - * - * Copyright 2016-2017 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ -package springfox.documentation.spring.web; - -import org.springframework.restdocs.templates.TemplateFormat; - -public class SpringfoxTemplateFormat implements TemplateFormat { - - private final String name = "springfox"; - - private final String fileExtension = "springfox"; - - - @Override - public String getId() { - return name; - } - - @Override - public String getFileExtension() { - return fileExtension; - } -} diff --git a/springfox-spring-integration/src/main/java/springfox/documentation/spring/web/package-info.java b/springfox-spring-integration/src/main/java/springfox/documentation/spring/web/package-info.java deleted file mode 100644 index dc336bdc39c..00000000000 --- a/springfox-spring-integration/src/main/java/springfox/documentation/spring/web/package-info.java +++ /dev/null @@ -1,52 +0,0 @@ -/* - * - * Copyright 2016-2017 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -/** - * Adds support for Spring Integration Http inbound adapters and gateways. - *

- * Builds upon the springfox webmvc and webflux implementations, but uses Spring Integration http endpoint - * configurations to create documentation. Spring Integration currently organizes the WebFlux/WebMvc split as follows. - * - *

    - *
  • spring-integration-webflux pulls in spring-integration-http, but not spring-webmvc; - * for spring-webflux it assumes that spring-boot-starter-webflux is present
  • - *
  • spring-integration-http is necessary to use the Http endpoint, it does not pull in spring-webmvc; - * for that it assumes that spring-boot-starter-web is present
  • - *
- * - *

- * Key extension points: - *

    - *
  • SpringIntegrationDocumentationPluginBootstrapper bootstraps on ContextRefreshedEvent because that is when - * IntegrationRequestMappingHandlerMapping detects handler methods - as opposed to DocumentationPluginBootstrapper, - * which uses SmartLifecycle.
  • - *
  • WebFlux or WebMvc specific implementations are necessary to provide request handlers
  • - *
- *

- * Changes in existing code: - *

    - *
  • {@code @Conditional(SpringIntegrationPluginNotPresentInClassPathCondition.class)} on - * {@link springfox.documentation.spring.web.plugins.DocumentationPluginsBootstrapper} to avoid bootstrapping - * the documentation plugins twice
  • - *
  • Filter for Integration Handler Mappings in WebMvcRequestHandlerProvider and WebFluxRequestHandlerProvider
  • - *
- * - * @see springfox.documentation.spring.web.plugins.SpringIntegrationDocumentationPluginsBootstrapper - */ -package springfox.documentation.spring.web; \ No newline at end of file diff --git a/springfox-spring-integration/src/main/java/springfox/documentation/spring/web/plugins/SpringIntegrationDocumentationPluginsBootstrapper.java b/springfox-spring-integration/src/main/java/springfox/documentation/spring/web/plugins/SpringIntegrationDocumentationPluginsBootstrapper.java deleted file mode 100644 index 9cc04154863..00000000000 --- a/springfox-spring-integration/src/main/java/springfox/documentation/spring/web/plugins/SpringIntegrationDocumentationPluginsBootstrapper.java +++ /dev/null @@ -1,84 +0,0 @@ -/* - * - * Copyright 2015-2019 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.spring.web.plugins; - -import com.fasterxml.classmate.TypeResolver; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.event.ContextRefreshedEvent; -import org.springframework.context.event.EventListener; -import org.springframework.stereotype.Component; -import springfox.documentation.PathProvider; -import springfox.documentation.schema.AlternateTypeRuleConvention; -import springfox.documentation.spi.service.RequestHandlerCombiner; -import springfox.documentation.spi.service.RequestHandlerProvider; -import springfox.documentation.spi.service.contexts.Defaults; -import springfox.documentation.spring.web.DocumentationCache; -import springfox.documentation.spring.web.scanners.ApiDocumentationScanner; - -import java.util.List; -import java.util.concurrent.atomic.AtomicBoolean; - -/** - * After Spring ContextRefreshedEvent, builds and executes all DocumentationConfigurer instances found in the - * application context, because only after ContextRefreshedEvent the spring-integration handler mappings - * are initialized. - */ -@Component -public class SpringIntegrationDocumentationPluginsBootstrapper extends AbstractDocumentationPluginsBootstrapper { - - private AtomicBoolean initialized = new AtomicBoolean(false); - - @Autowired - public SpringIntegrationDocumentationPluginsBootstrapper( - DocumentationPluginsManager documentationPluginsManager, - List handlerProviders, - DocumentationCache scanned, - ApiDocumentationScanner resourceListing, - TypeResolver typeResolver, - Defaults defaults, - PathProvider pathProvider) { - super(documentationPluginsManager, - handlerProviders, - scanned, - resourceListing, - defaults, - typeResolver, - pathProvider); - } - - @Override - @Autowired(required = false) - public void setCombiner(RequestHandlerCombiner combiner) { - super.setCombiner(combiner); - } - - @Override - @Autowired(required = false) - public void setTypeConventions(List typeConventions) { - super.setTypeConventions(typeConventions); - } - - @EventListener(ContextRefreshedEvent.class) - public void contextRefreshedEventExecute() { - if (initialized.compareAndSet(false, true)) { - super.bootstrapDocumentationPlugins(); - } - } -} diff --git a/springfox-spring-integration/src/main/java/springfox/documentation/spring/web/plugins/SpringIntegrationParametersProvider.java b/springfox-spring-integration/src/main/java/springfox/documentation/spring/web/plugins/SpringIntegrationParametersProvider.java deleted file mode 100644 index e44b0e042d1..00000000000 --- a/springfox-spring-integration/src/main/java/springfox/documentation/spring/web/plugins/SpringIntegrationParametersProvider.java +++ /dev/null @@ -1,142 +0,0 @@ -/* - * - * Copyright 2016-2017 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ -package springfox.documentation.spring.web.plugins; - -import com.fasterxml.classmate.ResolvedType; -import com.fasterxml.classmate.TypeResolver; -import nonapi.io.github.classgraph.utils.ReflectionUtils; -import org.springframework.core.ResolvableType; -import org.springframework.expression.Expression; -import org.springframework.expression.spel.SpelNode; -import org.springframework.expression.spel.standard.SpelExpression; -import org.springframework.expression.spel.standard.SpelExpressionParser; -import org.springframework.integration.http.inbound.BaseHttpInboundEndpoint; -import org.springframework.stereotype.Component; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.util.UriTemplate; -import springfox.documentation.service.ResolvedMethodParameter; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Optional; -import java.util.stream.Collectors; -import java.util.stream.Stream; - -import static java.util.Collections.*; -import static org.springframework.core.annotation.AnnotationUtils.*; - -/** - * Provides information about Spring Integration inbound HTTP handlers. - */ -@Component -public class SpringIntegrationParametersProvider { - private static final String REQUEST_PARAMS_EXPRESSION_CONTEXT_VARIABLE = "#requestParams"; - private static final String FIELD_PAYLOAD_EXPRESSION = "payloadExpression"; - private static final String FIELD_HEADER_EXPRESSIONS = "headerExpressions"; - - private final SpelExpressionParser parser = new SpelExpressionParser(); - private final TypeResolver typeResolver = new TypeResolver(); - - public List getParameters(BaseHttpInboundEndpoint inboundEndpoint) { - List parameters = new ArrayList<>(); - parameters.addAll(addRequestBodyParam(inboundEndpoint)); - parameters.addAll(addPathVariableParams(inboundEndpoint)); - parameters.addAll(addRequestParamParams(inboundEndpoint)); - return parameters; - } - - private List addRequestBodyParam(BaseHttpInboundEndpoint inboundEndpoint) { - List parameters = new ArrayList<>(); - ResolvableType requestPayloadType = (ResolvableType) ReflectionUtils.getFieldVal(inboundEndpoint, - "requestPayloadType", true); - if (requestPayloadType != null) { - ResolvedType parameterType = typeResolver.resolve(requestPayloadType.getType()); - Map requestBodyAttributes = new HashMap<>(); - RequestBody requestBodyAnnotation = - synthesizeAnnotation(requestBodyAttributes, - RequestBody.class, null); - - ResolvedMethodParameter body = new ResolvedMethodParameter(0, "body", - singletonList(requestBodyAnnotation), parameterType); - parameters.add(body); - } - return parameters; - } - - private List addPathVariableParams(BaseHttpInboundEndpoint inboundEndpoint) { - return Stream.of(inboundEndpoint.getRequestMapping() - .getPathPatterns()) - .map(pattern -> new UriTemplate(pattern).getVariableNames()) - .flatMap(Collection::stream) - .map(variableName -> new ResolvedMethodParameter(0, variableName, - singletonList(synthesizeAnnotation(emptyMap(), PathVariable.class, null)), - typeResolver.resolve(String.class))) - .collect(Collectors.toList()); - } - - private List addRequestParamParams(BaseHttpInboundEndpoint inboundEndpoint) { - List parameters = new ArrayList<>(); - - Expression payloadExpression = (Expression) ReflectionUtils.getFieldVal(inboundEndpoint, - FIELD_PAYLOAD_EXPRESSION, true); - if (payloadExpression != null) { - extractRequestParam(payloadExpression, typeResolver).ifPresent( - parameters::add); - } - @SuppressWarnings("unchecked") - Map headerExpressions = (Map) ReflectionUtils.getFieldVal( - inboundEndpoint, FIELD_HEADER_EXPRESSIONS, true); - - if (headerExpressions != null) { - for (Expression headerExpression : headerExpressions.values()) { - extractRequestParam(headerExpression, typeResolver).ifPresent(parameters::add); - } - } - return parameters; - } - - private Optional extractRequestParam(Expression expression, TypeResolver typeResolver) { - ResolvedMethodParameter ret = null; - String expressionString = expression.getExpressionString(); - SpelExpression spelExpression = parser.parseRaw(expressionString); - SpelNode ast = spelExpression.getAST(); - SpelNode firstChild = ast.getChild(0); // possible #requestParams, VariableReference - if (firstChild != null && REQUEST_PARAMS_EXPRESSION_CONTEXT_VARIABLE.equals(firstChild.toStringAST())) { - String firstIndexer = ast.getChild(1) - .toStringAST(); // ['value'] or value, Indexer - String requestParamName = firstIndexer.replaceAll("^\\['|']", ""); - boolean required = requestParamName.equals(firstIndexer); // square brackets mean optional - Map requestParamAttributes = new HashMap<>(); - requestParamAttributes.put("required", required); - RequestParam requestParamAnnotation = - synthesizeAnnotation(requestParamAttributes, - RequestParam.class, null); - - ret = new ResolvedMethodParameter(0, requestParamName, - singletonList(requestParamAnnotation), typeResolver.resolve(String.class)); - } - return Optional.ofNullable(ret); - } - -} diff --git a/springfox-spring-integration/src/main/java/springfox/documentation/spring/web/plugins/SpringRestDocsOperationBuilderPlugin.java b/springfox-spring-integration/src/main/java/springfox/documentation/spring/web/plugins/SpringRestDocsOperationBuilderPlugin.java deleted file mode 100644 index bae0045fca5..00000000000 --- a/springfox-spring-integration/src/main/java/springfox/documentation/spring/web/plugins/SpringRestDocsOperationBuilderPlugin.java +++ /dev/null @@ -1,183 +0,0 @@ -/* - * - * Copyright 2016-2017 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ -package springfox.documentation.spring.web.plugins; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.core.Ordered; -import org.springframework.core.annotation.Order; -import org.springframework.core.io.Resource; -import org.springframework.core.io.support.PathMatchingResourcePatternResolver; -import org.springframework.stereotype.Component; -import rawhttp.core.RawHttp; -import rawhttp.core.RawHttpResponse; -import springfox.documentation.builders.ExampleBuilder; -import springfox.documentation.builders.ModelSpecificationBuilder; -import springfox.documentation.builders.ResponseBuilder; -import springfox.documentation.schema.Example; -import springfox.documentation.schema.ScalarType; -import springfox.documentation.service.Header; -import springfox.documentation.service.Response; -import springfox.documentation.spi.DocumentationType; -import springfox.documentation.spi.service.OperationBuilderPlugin; -import springfox.documentation.spi.service.contexts.OperationContext; - -import java.io.IOException; -import java.io.InputStream; -import java.nio.charset.StandardCharsets; -import java.util.Arrays; -import java.util.Collection; -import java.util.Collections; -import java.util.List; -import java.util.Objects; -import java.util.Set; -import java.util.function.BinaryOperator; -import java.util.function.Function; -import java.util.stream.Collectors; - -import static java.util.Collections.*; -import static java.util.stream.Collectors.*; - -@Component -@Order(Ordered.HIGHEST_PRECEDENCE + 1000) -public class SpringRestDocsOperationBuilderPlugin implements OperationBuilderPlugin { - private static final Logger LOG = LoggerFactory.getLogger(SpringRestDocsOperationBuilderPlugin.class); - - @Override - public void apply(OperationContext context) { - context.operationBuilder() - .responses(read(context)); - } - - @Override - public boolean supports(DocumentationType documentationType) { - return DocumentationType.SWAGGER_12.equals(documentationType) - || DocumentationType.SWAGGER_2.equals(documentationType); - } - - /** - * Provides response messages with examples for given single operation context. - * - * @param context representing an operation - * @return response messages. - */ - protected Set read(OperationContext context) { - Set ret; - try { - PathMatchingResourcePatternResolver resourceResolver = new PathMatchingResourcePatternResolver(); - Resource[] resources = resourceResolver.getResources( - "classpath*:" - + context.getName() - + "*/http-response.springfox"); - // TODO: restdocs in safe package name, not directly under restdocs - - ret = Arrays.stream(resources) - .map(toRawHttpResponse()) - .filter(Objects::nonNull) - .collect(Collectors.collectingAndThen( - toMap( - RawHttpResponse::getStatusCode, - mappingResponseToResponseMessageBuilder(), - mergingExamples() - ), - responseMessagesMap -> responseMessagesMap.values() - .stream() - .map(ResponseBuilder::build) - .collect(Collectors.toSet()))); - } catch ( - Exception e) { - LOG.warn("Failed to read restdocs example for {} " + context.getName() + " caused by: " + e.toString()); - ret = Collections.emptySet(); - } - return ret; - - } - - private Function> toRawHttpResponse() { - return resource -> { - try (InputStream resourceAsStream = resource.getInputStream()) { - RawHttp rawHttp = new RawHttp(); - // must extract the body before the stream is closed - return (RawHttpResponse) rawHttp.parseResponse(resourceAsStream).eagerly(); - } catch (IOException e) { - LOG.warn("Failed to read restdocs example for {} " - + resource.getFilename() + " caused by: " + e.toString()); - return null; - } - }; - } - - private BinaryOperator mergingExamples() { - return (leftWithSameStatusCode, rightWithSameStatusCode) -> - leftWithSameStatusCode.examples(rightWithSameStatusCode.build() - .getExamples()); - } - - private Function, ResponseBuilder> mappingResponseToResponseMessageBuilder() { - return parsedResponse -> new ResponseBuilder() - .code(String.valueOf(parsedResponse.getStatusCode())) - .examples(toExamples(parsedResponse)) - .headers(toHeaders(parsedResponse)); - } - - @SuppressWarnings("deprecation") - private Collection
toHeaders(RawHttpResponse parsedResponse) { - return parsedResponse.getHeaders() - .asMap() - .keySet() - .stream() - .map(strings -> new Header( - strings, - "", - new springfox.documentation.schema.ModelRef("string"), - new ModelSpecificationBuilder() - .scalarModel(ScalarType.STRING) - .build())) - .collect(Collectors.toList()); - } - - private List toExamples(RawHttpResponse parsedResponse) { - return singletonList(new ExampleBuilder() - .mediaType(getContentType(parsedResponse)) - .value(getBody(parsedResponse)) - .build()); - } - - private String getBody(RawHttpResponse parsedResponse) { - return parsedResponse.getBody() - .map(bodyReader -> { - String ret = null; - try { - ret = bodyReader.asRawString(StandardCharsets.UTF_8); - } catch (IOException e) { - LOG.error("failed to read response body", e); - } - return ret; - }) - .orElse(null); - } - - private String getContentType(RawHttpResponse parsedResponse) { - return parsedResponse.getHeaders() - .get("Content-Type") - .stream() - .findFirst() - .orElse(null); - } -} diff --git a/springfox-spring-integration/src/main/resources/.gitkeep b/springfox-spring-integration/src/main/resources/.gitkeep deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/springfox-spring-integration/src/main/resources/org/springframework/restdocs/templates/springfox/default-curl-request.snippet b/springfox-spring-integration/src/main/resources/org/springframework/restdocs/templates/springfox/default-curl-request.snippet deleted file mode 100644 index d28e4eba9f8..00000000000 --- a/springfox-spring-integration/src/main/resources/org/springframework/restdocs/templates/springfox/default-curl-request.snippet +++ /dev/null @@ -1 +0,0 @@ -$ curl {{url}} {{options}} diff --git a/springfox-spring-integration/src/main/resources/org/springframework/restdocs/templates/springfox/default-http-request.snippet b/springfox-spring-integration/src/main/resources/org/springframework/restdocs/templates/springfox/default-http-request.snippet deleted file mode 100644 index 38c78300d48..00000000000 --- a/springfox-spring-integration/src/main/resources/org/springframework/restdocs/templates/springfox/default-http-request.snippet +++ /dev/null @@ -1,5 +0,0 @@ -{{method}} {{path}} HTTP/1.1 -{{#headers}} -{{name}}: {{value}} -{{/headers}} -{{requestBody}} diff --git a/springfox-spring-integration/src/main/resources/org/springframework/restdocs/templates/springfox/default-http-response.snippet b/springfox-spring-integration/src/main/resources/org/springframework/restdocs/templates/springfox/default-http-response.snippet deleted file mode 100644 index e55882bb455..00000000000 --- a/springfox-spring-integration/src/main/resources/org/springframework/restdocs/templates/springfox/default-http-response.snippet +++ /dev/null @@ -1,5 +0,0 @@ -HTTP/1.1 {{statusCode}} {{statusReason}} -{{#headers}} -{{name}}: {{value}} -{{/headers}} -{{responseBody}} \ No newline at end of file diff --git a/springfox-spring-integration/src/main/resources/org/springframework/restdocs/templates/springfox/default-httpie-request.snippet b/springfox-spring-integration/src/main/resources/org/springframework/restdocs/templates/springfox/default-httpie-request.snippet deleted file mode 100644 index 11f796fe30b..00000000000 --- a/springfox-spring-integration/src/main/resources/org/springframework/restdocs/templates/springfox/default-httpie-request.snippet +++ /dev/null @@ -1 +0,0 @@ -$ {{echoContent}}http {{options}} {{url}}{{requestItems}} diff --git a/springfox-spring-integration/src/main/resources/org/springframework/restdocs/templates/springfox/default-links.snippet b/springfox-spring-integration/src/main/resources/org/springframework/restdocs/templates/springfox/default-links.snippet deleted file mode 100644 index 1defdc46fa8..00000000000 --- a/springfox-spring-integration/src/main/resources/org/springframework/restdocs/templates/springfox/default-links.snippet +++ /dev/null @@ -1,7 +0,0 @@ -|Relation|Description - -{{#links}} -|{{#tableCellContent}}`+{{rel}}+`{{/tableCellContent}} -|{{#tableCellContent}}{{description}}{{/tableCellContent}} - -{{/links}} \ No newline at end of file diff --git a/springfox-spring-integration/src/main/resources/org/springframework/restdocs/templates/springfox/default-path-parameters.snippet b/springfox-spring-integration/src/main/resources/org/springframework/restdocs/templates/springfox/default-path-parameters.snippet deleted file mode 100644 index 6976b7b28b6..00000000000 --- a/springfox-spring-integration/src/main/resources/org/springframework/restdocs/templates/springfox/default-path-parameters.snippet +++ /dev/null @@ -1,10 +0,0 @@ -.+{{path}}+ -|=== -|Parameter|Description - -{{#parameters}} -|{{#tableCellContent}}`+{{name}}+`{{/tableCellContent}} -|{{#tableCellContent}}{{description}}{{/tableCellContent}} - -{{/parameters}} -|=== \ No newline at end of file diff --git a/springfox-spring-integration/src/main/resources/org/springframework/restdocs/templates/springfox/default-request-body.snippet b/springfox-spring-integration/src/main/resources/org/springframework/restdocs/templates/springfox/default-request-body.snippet deleted file mode 100644 index 843d3ba1329..00000000000 --- a/springfox-spring-integration/src/main/resources/org/springframework/restdocs/templates/springfox/default-request-body.snippet +++ /dev/null @@ -1 +0,0 @@ -{{body}} diff --git a/springfox-spring-integration/src/main/resources/org/springframework/restdocs/templates/springfox/default-request-fields.snippet b/springfox-spring-integration/src/main/resources/org/springframework/restdocs/templates/springfox/default-request-fields.snippet deleted file mode 100644 index 0d8f18e9349..00000000000 --- a/springfox-spring-integration/src/main/resources/org/springframework/restdocs/templates/springfox/default-request-fields.snippet +++ /dev/null @@ -1,10 +0,0 @@ -|=== -|Path|Type|Description - -{{#fields}} -|{{#tableCellContent}}`+{{path}}+`{{/tableCellContent}} -|{{#tableCellContent}}`+{{type}}+`{{/tableCellContent}} -|{{#tableCellContent}}{{description}}{{/tableCellContent}} - -{{/fields}} -|=== \ No newline at end of file diff --git a/springfox-spring-integration/src/main/resources/org/springframework/restdocs/templates/springfox/default-request-headers.snippet b/springfox-spring-integration/src/main/resources/org/springframework/restdocs/templates/springfox/default-request-headers.snippet deleted file mode 100644 index 4a7f300dfd7..00000000000 --- a/springfox-spring-integration/src/main/resources/org/springframework/restdocs/templates/springfox/default-request-headers.snippet +++ /dev/null @@ -1,7 +0,0 @@ -|Name|Description - -{{#headers}} -|{{#tableCellContent}}`+{{name}}+`{{/tableCellContent}} -|{{#tableCellContent}}{{description}}{{/tableCellContent}} - -{{/headers}} diff --git a/springfox-spring-integration/src/main/resources/org/springframework/restdocs/templates/springfox/default-request-parameters.snippet b/springfox-spring-integration/src/main/resources/org/springframework/restdocs/templates/springfox/default-request-parameters.snippet deleted file mode 100644 index a32f9436bf1..00000000000 --- a/springfox-spring-integration/src/main/resources/org/springframework/restdocs/templates/springfox/default-request-parameters.snippet +++ /dev/null @@ -1,7 +0,0 @@ -|Parameter|Description - -{{#parameters}} -|{{#tableCellContent}}`+{{name}}+`{{/tableCellContent}} -|{{#tableCellContent}}{{description}}{{/tableCellContent}} - -{{/parameters}} \ No newline at end of file diff --git a/springfox-spring-integration/src/main/resources/org/springframework/restdocs/templates/springfox/default-request-part-body.snippet b/springfox-spring-integration/src/main/resources/org/springframework/restdocs/templates/springfox/default-request-part-body.snippet deleted file mode 100644 index 843d3ba1329..00000000000 --- a/springfox-spring-integration/src/main/resources/org/springframework/restdocs/templates/springfox/default-request-part-body.snippet +++ /dev/null @@ -1 +0,0 @@ -{{body}} diff --git a/springfox-spring-integration/src/main/resources/org/springframework/restdocs/templates/springfox/default-request-part-fields.snippet b/springfox-spring-integration/src/main/resources/org/springframework/restdocs/templates/springfox/default-request-part-fields.snippet deleted file mode 100644 index 701f1789759..00000000000 --- a/springfox-spring-integration/src/main/resources/org/springframework/restdocs/templates/springfox/default-request-part-fields.snippet +++ /dev/null @@ -1,8 +0,0 @@ -|Path|Type|Description - -{{#fields}} -|{{#tableCellContent}}`+{{path}}+`{{/tableCellContent}} -|{{#tableCellContent}}`+{{type}}+`{{/tableCellContent}} -|{{#tableCellContent}}{{description}}{{/tableCellContent}} - -{{/fields}} diff --git a/springfox-spring-integration/src/main/resources/org/springframework/restdocs/templates/springfox/default-request-parts.snippet b/springfox-spring-integration/src/main/resources/org/springframework/restdocs/templates/springfox/default-request-parts.snippet deleted file mode 100644 index 827afbe7e7e..00000000000 --- a/springfox-spring-integration/src/main/resources/org/springframework/restdocs/templates/springfox/default-request-parts.snippet +++ /dev/null @@ -1,7 +0,0 @@ -|Part|Description - -{{#requestParts}} -|{{#tableCellContent}}`+{{name}}+`{{/tableCellContent}} -|{{#tableCellContent}}{{description}}{{/tableCellContent}} - -{{/requestParts}} diff --git a/springfox-spring-integration/src/main/resources/org/springframework/restdocs/templates/springfox/default-response-body.snippet b/springfox-spring-integration/src/main/resources/org/springframework/restdocs/templates/springfox/default-response-body.snippet deleted file mode 100644 index 843d3ba1329..00000000000 --- a/springfox-spring-integration/src/main/resources/org/springframework/restdocs/templates/springfox/default-response-body.snippet +++ /dev/null @@ -1 +0,0 @@ -{{body}} diff --git a/springfox-spring-integration/src/main/resources/org/springframework/restdocs/templates/springfox/default-response-fields.snippet b/springfox-spring-integration/src/main/resources/org/springframework/restdocs/templates/springfox/default-response-fields.snippet deleted file mode 100644 index faef632f2cb..00000000000 --- a/springfox-spring-integration/src/main/resources/org/springframework/restdocs/templates/springfox/default-response-fields.snippet +++ /dev/null @@ -1,8 +0,0 @@ -|Path|Type|Description - -{{#fields}} -|{{#tableCellContent}}`+{{path}}+`{{/tableCellContent}} -|{{#tableCellContent}}`+{{type}}+`{{/tableCellContent}} -|{{#tableCellContent}}{{description}}{{/tableCellContent}} - -{{/fields}} \ No newline at end of file diff --git a/springfox-spring-integration/src/main/resources/org/springframework/restdocs/templates/springfox/default-response-headers.snippet b/springfox-spring-integration/src/main/resources/org/springframework/restdocs/templates/springfox/default-response-headers.snippet deleted file mode 100644 index 4a7f300dfd7..00000000000 --- a/springfox-spring-integration/src/main/resources/org/springframework/restdocs/templates/springfox/default-response-headers.snippet +++ /dev/null @@ -1,7 +0,0 @@ -|Name|Description - -{{#headers}} -|{{#tableCellContent}}`+{{name}}+`{{/tableCellContent}} -|{{#tableCellContent}}{{description}}{{/tableCellContent}} - -{{/headers}} diff --git a/springfox-spring-integration/src/test/groovy/springfox/documentation/spring/web/plugins/SpringIntegrationParametersProviderSpec.groovy b/springfox-spring-integration/src/test/groovy/springfox/documentation/spring/web/plugins/SpringIntegrationParametersProviderSpec.groovy deleted file mode 100644 index ab5d8870024..00000000000 --- a/springfox-spring-integration/src/test/groovy/springfox/documentation/spring/web/plugins/SpringIntegrationParametersProviderSpec.groovy +++ /dev/null @@ -1,63 +0,0 @@ -/* - * - * Copyright 2015-2019 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ -package springfox.documentation.spring.web.plugins - -import org.springframework.core.ResolvableType -import org.springframework.expression.Expression -import org.springframework.integration.http.inbound.BaseHttpInboundEndpoint -import org.springframework.integration.http.inbound.RequestMapping -import spock.lang.Specification - -class SpringIntegrationParametersProviderSpec extends Specification { - - class Foo { - def bar - } - - def "Determines parameters"() { - - Expression payloadExpression = Mock() { - getExpressionString() >> "#requestParams['toConvert'][0]" - } - Expression headerExpression = Mock() { - getExpressionString() >> "#pathVariables.upperLower" - } - def headerExpressions = ["upperLower": headerExpression] - - def provider = new SpringIntegrationParametersProvider() - - given: - def inboundEndpoint = new BaseHttpInboundEndpoint(true) - def requestMapping = new RequestMapping() - requestMapping.setPathPatterns("/conversions/pathvariable/{upperLower}") - inboundEndpoint.setHeaderExpressions(headerExpressions) - inboundEndpoint.setPayloadExpression(payloadExpression) - inboundEndpoint.setRequestMapping(requestMapping) - inboundEndpoint.setRequestPayloadType(ResolvableType.forClass(Foo)) - - when: - def parameters = provider.getParameters(inboundEndpoint) - - then: - parameters.size() == 3 - parameters[0].defaultName().get() == "body" - parameters[1].defaultName().get() == "upperLower" - parameters[2].defaultName().get() == "toConvert" - } -} diff --git a/springfox-spring-integration/src/test/groovy/springfox/documentation/spring/web/plugins/SpringRestDocsOperationBuilderPluginSpec.groovy b/springfox-spring-integration/src/test/groovy/springfox/documentation/spring/web/plugins/SpringRestDocsOperationBuilderPluginSpec.groovy deleted file mode 100644 index 0409c3df209..00000000000 --- a/springfox-spring-integration/src/test/groovy/springfox/documentation/spring/web/plugins/SpringRestDocsOperationBuilderPluginSpec.groovy +++ /dev/null @@ -1,63 +0,0 @@ -/* - * - * Copyright 2015-2019 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ -package springfox.documentation.spring.web.plugins - -import org.springframework.web.bind.annotation.RequestMethod -import spock.lang.Specification -import springfox.documentation.RequestHandler -import springfox.documentation.builders.OperationBuilder -import springfox.documentation.spi.service.contexts.DocumentationContext -import springfox.documentation.spi.service.contexts.OperationContext -import springfox.documentation.spi.service.contexts.RequestMappingContext -import springfox.documentation.spring.web.readers.operation.CachingOperationNameGenerator - -class SpringRestDocsOperationBuilderPluginSpec extends Specification { - - RequestHandler requestHandler = Mock() { - getName() >> "toLowerGateway" // two matching snippets in test resources - } - - DocumentationContext documentationContext = Mock() - - SpringRestDocsOperationBuilderPlugin sut = new SpringRestDocsOperationBuilderPlugin() - def operationBuilder = new OperationBuilder(new CachingOperationNameGenerator()) - - OperationContext operationContext = new OperationContext( - operationBuilder, - RequestMethod.GET, - new RequestMappingContext( - "0", - documentationContext, - requestHandler), - 0) - - def "Collects examples"() { - given: - requestHandler // need to mock the name - - when: - sut.apply(operationContext) - def operation = operationBuilder.build() - - then: - 2 == operation.responses[0].examples.size() - } - - -} diff --git a/springfox-spring-integration/src/test/resources/toLowerGatewayAragorn/http-response.springfox b/springfox-spring-integration/src/test/resources/toLowerGatewayAragorn/http-response.springfox deleted file mode 100644 index 02035aacade..00000000000 --- a/springfox-spring-integration/src/test/resources/toLowerGatewayAragorn/http-response.springfox +++ /dev/null @@ -1,5 +0,0 @@ -HTTP/1.1 200 OK -Content-Type: application/json -Content-Length: 39 - -{"bar":"aragorn","foo":false,"count":3} \ No newline at end of file diff --git a/springfox-spring-integration/src/test/resources/toLowerGatewayGimli/http-response.springfox b/springfox-spring-integration/src/test/resources/toLowerGatewayGimli/http-response.springfox deleted file mode 100644 index 36ccabcb836..00000000000 --- a/springfox-spring-integration/src/test/resources/toLowerGatewayGimli/http-response.springfox +++ /dev/null @@ -1,5 +0,0 @@ -HTTP/1.1 200 OK -Content-Type: application/json -Content-Length: 37 - -{"bar":"gimli","foo":false,"count":3} \ No newline at end of file diff --git a/springfox-spring-web/build.gradle b/springfox-spring-web/build.gradle index b6fe30e4cf2..ed3ce963b9c 100644 --- a/springfox-spring-web/build.gradle +++ b/springfox-spring-web/build.gradle @@ -32,6 +32,6 @@ dependencies { testImplementation libs.clientProvided } -test { - maxHeapSize = '3G' -} +//test { +// maxHeapSize = '3G' +//} diff --git a/springfox-spring-web/gradle/wrapper/gradle-wrapper.jar b/springfox-spring-web/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..41d9927a4d4fb3f96a785543079b8df6723c946b GIT binary patch literal 59821 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 literal 0 HcmV?d00001 diff --git a/springfox-spring-web/gradle/wrapper/gradle-wrapper.properties b/springfox-spring-web/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 00000000000..41dfb87909a --- /dev/null +++ b/springfox-spring-web/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,5 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-7.4-bin.zip +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/springfox-spring-web/gradlew b/springfox-spring-web/gradlew new file mode 100755 index 00000000000..1b6c787337f --- /dev/null +++ b/springfox-spring-web/gradlew @@ -0,0 +1,234 @@ +#!/bin/sh + +# +# Copyright © 2015-2021 the original authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +############################################################################## +# +# Gradle start up script for POSIX generated by Gradle. +# +# Important for running: +# +# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is +# noncompliant, but you have some other compliant shell such as ksh or +# bash, then to run this script, type that shell name before the whole +# command line, like: +# +# ksh Gradle +# +# Busybox and similar reduced shells will NOT work, because this script +# requires all of these POSIX shell features: +# * functions; +# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», +# «${var#prefix}», «${var%suffix}», and «$( cmd )»; +# * compound commands having a testable exit status, especially «case»; +# * various built-in commands including «command», «set», and «ulimit». +# +# Important for patching: +# +# (2) This script targets any POSIX shell, so it avoids extensions provided +# by Bash, Ksh, etc; in particular arrays are avoided. +# +# The "traditional" practice of packing multiple parameters into a +# space-separated string is a well documented source of bugs and security +# problems, so this is (mostly) avoided, by progressively accumulating +# options in "$@", and eventually passing that to Java. +# +# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, +# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; +# see the in-line comments for details. +# +# There are tweaks for specific operating systems such as AIX, CygWin, +# Darwin, MinGW, and NonStop. +# +# (3) This script is generated from the Groovy template +# https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# within the Gradle project. +# +# You can find Gradle at https://github.com/gradle/gradle/. +# +############################################################################## + +# Attempt to set APP_HOME + +# Resolve links: $0 may be a link +app_path=$0 + +# Need this for daisy-chained symlinks. +while + APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path + [ -h "$app_path" ] +do + ls=$( ls -ld "$app_path" ) + link=${ls#*' -> '} + case $link in #( + /*) app_path=$link ;; #( + *) app_path=$APP_HOME$link ;; + esac +done + +APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit + +APP_NAME="Gradle" +APP_BASE_NAME=${0##*/} + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD=maximum + +warn () { + echo "$*" +} >&2 + +die () { + echo + echo "$*" + echo + exit 1 +} >&2 + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "$( uname )" in #( + CYGWIN* ) cygwin=true ;; #( + Darwin* ) darwin=true ;; #( + MSYS* | MINGW* ) msys=true ;; #( + NONSTOP* ) nonstop=true ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD=$JAVA_HOME/jre/sh/java + else + JAVACMD=$JAVA_HOME/bin/java + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD=java + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then + case $MAX_FD in #( + max*) + MAX_FD=$( ulimit -H -n ) || + warn "Could not query maximum file descriptor limit" + esac + case $MAX_FD in #( + '' | soft) :;; #( + *) + ulimit -n "$MAX_FD" || + warn "Could not set maximum file descriptor limit to $MAX_FD" + esac +fi + +# Collect all arguments for the java command, stacking in reverse order: +# * args from the command line +# * the main class name +# * -classpath +# * -D...appname settings +# * --module-path (only if needed) +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. + +# For Cygwin or MSYS, switch paths to Windows format before running java +if "$cygwin" || "$msys" ; then + APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) + CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) + + JAVACMD=$( cygpath --unix "$JAVACMD" ) + + # Now convert the arguments - kludge to limit ourselves to /bin/sh + for arg do + if + case $arg in #( + -*) false ;; # don't mess with options #( + /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath + [ -e "$t" ] ;; #( + *) false ;; + esac + then + arg=$( cygpath --path --ignore --mixed "$arg" ) + fi + # Roll the args list around exactly as many times as the number of + # args, so each arg winds up back in the position where it started, but + # possibly modified. + # + # NB: a `for` loop captures its iteration list before it begins, so + # changing the positional parameters here affects neither the number of + # iterations, nor the values presented in `arg`. + shift # remove old arg + set -- "$@" "$arg" # push replacement arg + done +fi + +# Collect all arguments for the java command; +# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of +# shell script including quotes and variable substitutions, so put them in +# double quotes to make sure that they get re-expanded; and +# * put everything else in single quotes, so that it's not re-expanded. + +set -- \ + "-Dorg.gradle.appname=$APP_BASE_NAME" \ + -classpath "$CLASSPATH" \ + org.gradle.wrapper.GradleWrapperMain \ + "$@" + +# Use "xargs" to parse quoted args. +# +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# + +eval "set -- $( + printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | + xargs -n1 | + sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | + tr '\n' ' ' + )" '"$@"' + +exec "$JAVACMD" "$@" diff --git a/springfox-spring-web/gradlew.bat b/springfox-spring-web/gradlew.bat new file mode 100644 index 00000000000..ac1b06f9382 --- /dev/null +++ b/springfox-spring-web/gradlew.bat @@ -0,0 +1,89 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto execute + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/springfox-spring-web/src/test/groovy/springfox/documentation/spi/service/contexts/OrderingsSpec.groovy b/springfox-spring-web/src/test/groovy/springfox/documentation/spi/service/contexts/OrderingsSpec.groovy deleted file mode 100644 index 3acd3dfbca6..00000000000 --- a/springfox-spring-web/src/test/groovy/springfox/documentation/spi/service/contexts/OrderingsSpec.groovy +++ /dev/null @@ -1,182 +0,0 @@ -package springfox.documentation.spi.service.contexts - -import spock.lang.Specification -import springfox.documentation.RequestHandler -import springfox.documentation.RequestHandlerKey -import springfox.documentation.service.ResolvedMethodParameter -import springfox.documentation.service.ResourceGroup -import springfox.documentation.spi.DocumentationType -import springfox.documentation.spring.web.plugins.Docket -import springfox.documentation.spring.web.readers.operation.HandlerMethodResolver -import springfox.documentation.spring.wrapper.PatternsRequestCondition -import springfox.documentation.spring.web.dummy.DummyClass -import springfox.documentation.spring.web.dummy.models.SameFancyPet -import springfox.documentation.spring.web.ControllerNamingUtils -import springfox.documentation.spring.web.dummy.controllers.GenericRestController; -import springfox.documentation.spring.web.dummy.controllers.PetRepository; - -import static java.util.stream.Collectors.* - -import java.lang.annotation.Annotation - -import com.fasterxml.classmate.ResolvedType -import com.fasterxml.classmate.TypeResolver - -import org.springframework.http.MediaType -import org.springframework.web.bind.annotation.RequestMethod -import org.springframework.web.method.HandlerMethod -import org.springframework.web.servlet.mvc.condition.NameValueExpression - -class OrderingsSpec extends Specification { - - def methodResolver = new HandlerMethodResolver(new TypeResolver()) - - def "Orderings dont crash when docket group names are null" () { - given: - Docket docket1 = new Docket(DocumentationType.SPRING_WEB) - Docket docket2 = new Docket(DocumentationType.SWAGGER_12).groupName("non-default") - Docket docket3 = new Docket(DocumentationType.SWAGGER_12).groupName("a#1") - when: - def ordered = [docket1, docket2, docket3].stream().sorted(Orderings.byPluginName()).collect(toList()) - then: - ordered[0] == docket3 - ordered[1] == docket1 - ordered[2] == docket2 - } - - def "Orderings is stable when ResourceGroup is based on empty class" () { - given: - ResourceGroup group1 = new ResourceGroup("test", PetRepository, 0) - ResourceGroup group2 = new ResourceGroup("test", GenericRestController, 0) - ResourceGroup group3 = new ResourceGroup("test", null, 0) - - when: - def ordered = [group1, group2, group3].stream().sorted(Orderings.resourceGroupComparator()).collect(toList()) - then: - ordered[0] == group3 - ordered[1] == group2 - ordered[2] == group1 - } - - def "Orderings is stable when RequestMappingContext is based on overloaded methods" () { - given: - DocumentationContext documentationContext = Mock() - - RequestMappingContext context1 = requestMappingContext("0", documentationContext, SameFancyPet) - RequestMappingContext context2 = requestMappingContext("0", documentationContext, SameFancyPet, String) - RequestMappingContext context3 = requestMappingContext("0", documentationContext, String) - - when: - def ordered = [context1, context2, context3].stream().sorted(Orderings.methodComparator()).collect(toList()) - then: - ordered[0] == context3 - ordered[1] == context2 - ordered[2] == context1 - } - - private RequestMappingContext requestMappingContext(String id, DocumentationContext documentationContext, Class ... params) { - new RequestMappingContext( - id, - documentationContext, - requestHandler(methodResolver, handlerMethod(params))) - } - - private HandlerMethod handlerMethod(Class ... params) { - def clazz = new DummyClass() - Class c = clazz.getClass(); - new HandlerMethod(clazz, c.getMethod("methodToTestOrdering", params)) - } - - def requestHandler(HandlerMethodResolver methodResolver, HandlerMethod handlerMethod) { - new RequestHandler() { - @Override - Class declaringClass() { - return null - } - - @Override - boolean isAnnotatedWith(Class annotation) { - return false - } - - @Override - PatternsRequestCondition getPatternsCondition() { - return null - } - - @Override - String groupName() { - return ControllerNamingUtils.controllerNameAsGroup(handlerMethod); - } - - @Override - String getName() { - return handlerMethod.getMethod().getName(); - } - - @Override - Set supportedMethods() { - return null - } - - @Override - Set produces() { - return null - } - - @Override - Set consumes() { - return null - } - - @Override - Set> headers() { - return null - } - - @Override - Set> params() { - return null - } - - @Override - def Optional findAnnotation(Class annotation) { - return null - } - - RequestHandlerKey key() { - handlerKey == null ? null : new RequestHandlerKey([] as Set, [] as Set, [] as Set, [] as Set) - } - - @Override - List getParameters() { - return methodResolver.methodParameters(handlerMethod); - } - - @Override - ResolvedType getReturnType() { - return methodResolver.methodReturnType(handlerMethod); - } - - @Override - def Optional findControllerAnnotation(Class annotation) { - return null - } - - @Override - springfox.documentation.spring.wrapper.RequestMappingInfo getRequestMapping() { - return null - } - - @Override - HandlerMethod getHandlerMethod() { - return null - } - - @Override - RequestHandler combine(RequestHandler other) { - return null - } - } - } -} \ No newline at end of file diff --git a/springfox-spring-web/src/test/groovy/springfox/documentation/spring/web/ControllerNamingUtilsSpec.groovy b/springfox-spring-web/src/test/groovy/springfox/documentation/spring/web/ControllerNamingUtilsSpec.groovy deleted file mode 100644 index 7c7af65e9b8..00000000000 --- a/springfox-spring-web/src/test/groovy/springfox/documentation/spring/web/ControllerNamingUtilsSpec.groovy +++ /dev/null @@ -1,72 +0,0 @@ -/* - * - * Copyright 2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.spring.web - -import spock.lang.Specification -import spock.lang.Unroll - -class ControllerNamingUtilsSpec extends Specification { - - def "Cannot instantiate this class"() { - when: - new ControllerNamingUtils() - - then: - thrown(UnsupportedOperationException) - } - - @Unroll - def "path roots"() { - expect: - expected == ControllerNamingUtils.pathRoot(path) - encoded == ControllerNamingUtils.pathRootEncoded(path) - expected == ControllerNamingUtils.decode(encoded) - where: - path | expected | encoded - '/a/b' | '/a' | '/a' - '/a/b/c/d' | '/a' | '/a' - 'a/b' | '/a' | '/a' - 'a' | '/a' | '/a' - '/' | '/' | '/' - '//' | '/' | '/' - '/{}' | '/{}' | '/%7B%7D' - '/()' | '/()' | '/()' - } - - def "path roots should throw exception"() { - when: - ControllerNamingUtils.pathRoot(path) - then: - thrown(IllegalArgumentException) - where: - path << [null, '', "", " "] - } - - def "decode illegal path should return path as-is"() { - when: - def decoded = ControllerNamingUtils.decode(path) - then: - Objects.equals(decoded, path) - where: - path << [null, '', ""] - } - -} - diff --git a/springfox-spring-web/src/test/groovy/springfox/documentation/spring/web/DescriptionResolverSpec.groovy b/springfox-spring-web/src/test/groovy/springfox/documentation/spring/web/DescriptionResolverSpec.groovy deleted file mode 100644 index ef951efdaba..00000000000 --- a/springfox-spring-web/src/test/groovy/springfox/documentation/spring/web/DescriptionResolverSpec.groovy +++ /dev/null @@ -1,34 +0,0 @@ -package springfox.documentation.spring.web - -import org.springframework.mock.env.MockEnvironment -import spock.lang.Specification -import spock.lang.Unroll - -class DescriptionResolverSpec extends Specification { - def properties = ["key1": "key1value", "key2": "key2value"] - - @Unroll - def "Resolves the #key"() { - given: - def env = new MockEnvironment() - properties.each { env.withProperty(it.key, it.value) } - and: - def reader = new DescriptionResolver(env) - expect: - value == reader.resolve(key) - where: - value | key - "key1value" | '${key1}' - "key2value" | '${key2}' - "key2value" | '${key2:}' - "key2value" | '${key2:key2default}' - "key3default" | '${key3:key3default}' - "" | '${key3:}' - '${unknown}' | '${unknown}' - "key1" | 'key1' - "key2" | 'key2' - "unknown" | 'unknown' - } - - -} diff --git a/springfox-spring-web/src/test/groovy/springfox/documentation/spring/web/DocumentationCacheSpec.groovy b/springfox-spring-web/src/test/groovy/springfox/documentation/spring/web/DocumentationCacheSpec.groovy deleted file mode 100644 index 2cc0906bef3..00000000000 --- a/springfox-spring-web/src/test/groovy/springfox/documentation/spring/web/DocumentationCacheSpec.groovy +++ /dev/null @@ -1,57 +0,0 @@ -/* - * - * Copyright 2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.spring.web - -import spock.lang.Specification -import springfox.documentation.builders.DocumentationBuilder -import springfox.documentation.spring.web.DocumentationCache - -class DocumentationCacheSpec extends Specification { - def "Behaves like a map" () { - given: - def sut = new DocumentationCache() - and: - sut.addDocumentation(new DocumentationBuilder().name("test").build()) - - when: - def group = sut.documentationByGroup("test") - then: - group != null - group.groupName == "test" - and: - sut.documentationByGroup("non-existent") == null - } - - def "Cache can be cleared " () { - given: - def sut = new DocumentationCache() - and: - sut.addDocumentation(new DocumentationBuilder().name("test").build()) - when: - def group = sut.documentationByGroup("test") - then: - group != null - group.groupName == "test" - and: - sut.clear() - sut.documentationByGroup("test") == null - } - -} diff --git a/springfox-spring-web/src/test/groovy/springfox/documentation/spring/web/HandlerMethodReturnTypesSpec.groovy b/springfox-spring-web/src/test/groovy/springfox/documentation/spring/web/HandlerMethodReturnTypesSpec.groovy deleted file mode 100644 index f6bd18621a9..00000000000 --- a/springfox-spring-web/src/test/groovy/springfox/documentation/spring/web/HandlerMethodReturnTypesSpec.groovy +++ /dev/null @@ -1,71 +0,0 @@ -package springfox.documentation.spring.web -import com.fasterxml.classmate.TypeResolver -import org.springframework.web.method.HandlerMethod -import spock.lang.Specification -import springfox.documentation.spring.web.readers.operation.HandlerMethodResolver - -import java.lang.reflect.InvocationHandler -import java.lang.reflect.Method -import java.lang.reflect.Proxy - -import static springfox.documentation.spring.web.readers.operation.HandlerMethodResolver.* -/** - * Created by mtalbot on 17/05/15. - */ -class HandlerMethodReturnTypesSpec extends Specification { - - static TypeResolver resolver = new TypeResolver(); - static def ListOfMapOfStringOfStringType = resolver.resolve(List.class, resolver.resolve(Map.class, String.class, String.class)) - static def StringType = resolver.resolve(String.class) - - def "Should return absent for type erased classes"() { - expect: - useType(input) == expected - - where: - input || expected - getProxy(test.class).class || Optional.empty() - Class.class || Optional.empty() - String.class || Optional.of(String.class) - } - - def "Should return the underlying type even if proxied"() { - expect: - new HandlerMethodResolver(resolver).methodReturnType(input) == expected - - where: - input || expected - new HandlerMethod(getProxy(test.class), test.class.getMethod("genericReturn")) || ListOfMapOfStringOfStringType - new HandlerMethod(getProxy(test.class), test.class.getMethod("simpleReturn")) || StringType - new HandlerMethod(new testy(), testy.class.getMethod("genericReturn")) || ListOfMapOfStringOfStringType - new HandlerMethod(new testy(), testy.class.getMethod("simpleReturn")) || StringType - } - - def getProxy(Class... interfaces) { - return Proxy.newProxyInstance(this.getClass().getClassLoader(), interfaces, new InvocationHandler() { - @Override - Object invoke(Object proxy, Method method, Object[] args) throws Throwable { - return null - } - }) - } - - protected interface test { - - List> genericReturn() - - String simpleReturn() - } - - protected class testy implements test { - @Override - List> genericReturn() { - return null - } - - @Override - String simpleReturn() { - return null - } - } -} diff --git a/springfox-spring-web/src/test/groovy/springfox/documentation/spring/web/SpringfoxWebConfigurationSpec.groovy b/springfox-spring-web/src/test/groovy/springfox/documentation/spring/web/SpringfoxWebConfigurationSpec.groovy deleted file mode 100644 index 505bcf14eea..00000000000 --- a/springfox-spring-web/src/test/groovy/springfox/documentation/spring/web/SpringfoxWebConfigurationSpec.groovy +++ /dev/null @@ -1,16 +0,0 @@ -package springfox.documentation.spring.web - -import spock.lang.Specification - -class SpringfoxWebConfigurationSpec extends Specification { - def "method coverage test" () { - given: - def config = new SpringfoxWebConfiguration() - expect: - config.with { - defaults() - resourceGroupCache() - jsonSerializer([]) - } - } -} diff --git a/springfox-spring-web/src/test/groovy/springfox/documentation/spring/web/authorization/AuthSerializationSpec.groovy b/springfox-spring-web/src/test/groovy/springfox/documentation/spring/web/authorization/AuthSerializationSpec.groovy deleted file mode 100644 index ad77f300a00..00000000000 --- a/springfox-spring-web/src/test/groovy/springfox/documentation/spring/web/authorization/AuthSerializationSpec.groovy +++ /dev/null @@ -1,61 +0,0 @@ -/* - * - * Copyright 2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.spring.web.authorization - -import com.fasterxml.jackson.core.JsonGenerator -import com.fasterxml.jackson.core.JsonProcessingException -import com.fasterxml.jackson.databind.JsonSerializer -import com.fasterxml.jackson.databind.ObjectMapper -import com.fasterxml.jackson.databind.SerializerProvider -import com.fasterxml.jackson.databind.module.SimpleModule -import spock.lang.Specification -import springfox.documentation.spring.web.mixins.AuthSupport - -class AuthSerializationSpec extends Specification implements AuthSupport { - ObjectMapper mapper = new ObjectMapper() - - def "Basic write"() { - expect: - mapper.writeValueAsString("String") == '"String"' - } - - def "Custom String serializer"() { - given: - SimpleModule stringModule = new SimpleModule("SimpleModule") - stringModule.addSerializer(String.class, stringPrependSerializer()) - mapper.registerModule(stringModule) - - when: - def result = mapper.writeValueAsString("myString") - - then: - result == '"prefix-myString"' - } - - def stringPrependSerializer() { - JsonSerializer prepSerializer = new JsonSerializer() { - @Override - void serialize(String value, JsonGenerator jgen, SerializerProvider provider) throws IOException, JsonProcessingException { - jgen.writeString("prefix-" + value) - } - } - prepSerializer - } -} diff --git a/springfox-spring-web/src/test/groovy/springfox/documentation/spring/web/authorization/AuthorizationContextSpec.groovy b/springfox-spring-web/src/test/groovy/springfox/documentation/spring/web/authorization/AuthorizationContextSpec.groovy deleted file mode 100644 index 593d43147cb..00000000000 --- a/springfox-spring-web/src/test/groovy/springfox/documentation/spring/web/authorization/AuthorizationContextSpec.groovy +++ /dev/null @@ -1,60 +0,0 @@ -/* - * - * Copyright 2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.spring.web.authorization - -import org.springframework.http.HttpMethod -import org.springframework.web.bind.annotation.RequestMethod -import spock.lang.Specification -import springfox.documentation.builders.OperationBuilder -import springfox.documentation.builders.PathSelectors -import springfox.documentation.spi.service.contexts.OperationContext -import springfox.documentation.spi.service.contexts.RequestMappingContext -import springfox.documentation.spi.service.contexts.SecurityContext -import springfox.documentation.spring.web.mixins.AuthSupport -import springfox.documentation.spring.web.readers.operation.CachingOperationNameGenerator - -class AuthorizationContextSpec extends Specification implements AuthSupport { - - def "Authorizations work as expected"() { - given: - SecurityContext authorizationContext = SecurityContext.builder() - .forPaths(PathSelectors.any()) - .forHttpMethods { true } - .operationSelector { o -> o.httpMethod() == HttpMethod.GET } - .securityReferences(auth) - .build() - expect: - authorizationContext.securityForOperation(operationContext()).size() == expected - - where: - auth | expected - defaultAuth() | 1 - [] | 0 - } - - private OperationContext operationContext() { - new OperationContext(new OperationBuilder( - new CachingOperationNameGenerator()), - RequestMethod.GET, - Mock(RequestMappingContext), - 1) - } - -} diff --git a/springfox-spring-web/src/test/groovy/springfox/documentation/spring/web/json/JsonSerializerTest.groovy b/springfox-spring-web/src/test/groovy/springfox/documentation/spring/web/json/JsonSerializerTest.groovy deleted file mode 100644 index fa5e0aeb5a8..00000000000 --- a/springfox-spring-web/src/test/groovy/springfox/documentation/spring/web/json/JsonSerializerTest.groovy +++ /dev/null @@ -1,52 +0,0 @@ -/* - * - * Copyright 2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.spring.web.json - -import com.fasterxml.jackson.databind.ObjectMapper -import spock.lang.Specification - -class JsonSerializerTest extends Specification { - def "should serialize"() { - given: - JsonSerializer sut = new JsonSerializer([]) - def objectMapper = Mock(ObjectMapper) - sut.objectMapper = objectMapper - String object = 'a string' - when: - sut.toJson(object) - then: - 1 * objectMapper.writeValueAsString(object) - } - - def "should serialize with custom registrars"() { - given: "mocks" - def registrar = Mock(JacksonModuleRegistrar) - def objectMapper = Mock(ObjectMapper) - def object = 'a string' - when: - JsonSerializer sut = new JsonSerializer([registrar]) - sut.objectMapper = objectMapper - and: - sut.toJson(object) - then: - 1 * objectMapper.writeValueAsString(object) - 1 * registrar.maybeRegisterModule(_) - } -} diff --git a/springfox-spring-web/src/test/groovy/springfox/documentation/spring/web/json/JsonTest.groovy b/springfox-spring-web/src/test/groovy/springfox/documentation/spring/web/json/JsonTest.groovy deleted file mode 100644 index 0a7bec141db..00000000000 --- a/springfox-spring-web/src/test/groovy/springfox/documentation/spring/web/json/JsonTest.groovy +++ /dev/null @@ -1,30 +0,0 @@ -/* - * - * Copyright 2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.spring.web.json - -import spock.lang.Specification - -class JsonTest extends Specification { - - def "should pass coverage"() { - expect: - new Json("Something").value() - } -} diff --git a/springfox-spring-web/src/test/groovy/springfox/documentation/spring/web/mixins/AccessorAssertions.groovy b/springfox-spring-web/src/test/groovy/springfox/documentation/spring/web/mixins/AccessorAssertions.groovy deleted file mode 100644 index 9b75e82f17e..00000000000 --- a/springfox-spring-web/src/test/groovy/springfox/documentation/spring/web/mixins/AccessorAssertions.groovy +++ /dev/null @@ -1,35 +0,0 @@ -/* - * - * Copyright 2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.spring.web.mixins - -trait AccessorAssertions { - - def assertAccessor(target, String method, value){ - method = method.capitalize() - target."set${method}"(value) - return target."get${method}"() == value - } - - def assertSetter(target, String field, value){ - def method = field.capitalize() - target."set${method}"(value) - return target.class.fields["${field}"] == value - } -} \ No newline at end of file diff --git a/springfox-spring-web/src/test/groovy/springfox/documentation/spring/web/mixins/ApiDescriptionSupport.groovy b/springfox-spring-web/src/test/groovy/springfox/documentation/spring/web/mixins/ApiDescriptionSupport.groovy deleted file mode 100644 index 5e600c0aefb..00000000000 --- a/springfox-spring-web/src/test/groovy/springfox/documentation/spring/web/mixins/ApiDescriptionSupport.groovy +++ /dev/null @@ -1,33 +0,0 @@ -/* - * - * Copyright 2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.spring.web.mixins - -import springfox.documentation.service.ApiDescription - -trait ApiDescriptionSupport { - - def apiDescriptions(List paths) { - def result = [] - paths.each { - result << new ApiDescription(null, it, "", "", [], false) - } - result - } -} diff --git a/springfox-spring-web/src/test/groovy/springfox/documentation/spring/web/mixins/ApiListingSupport.groovy b/springfox-spring-web/src/test/groovy/springfox/documentation/spring/web/mixins/ApiListingSupport.groovy deleted file mode 100644 index f3cf4b40c5b..00000000000 --- a/springfox-spring-web/src/test/groovy/springfox/documentation/spring/web/mixins/ApiListingSupport.groovy +++ /dev/null @@ -1,68 +0,0 @@ -/* - * - * Copyright 2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.spring.web.mixins - - -import springfox.documentation.service.ApiListing -import springfox.documentation.service.OAuth -import springfox.documentation.service.ApiListingReference -import springfox.documentation.service.ResourceListing -import springfox.documentation.spring.web.scanners.DefaultModelNamesRegistryFactory -import springfox.documentation.spring.web.scanners.ModelSpecificationRegistryBuilder - -trait ApiListingSupport { - - def apiListing( - authorizations = [], - models = null, - modelSpecifications = null, - modelRegistry = new ModelSpecificationRegistryBuilder().build()) { - new ApiListing( - "1.0", - "", - "/relative-path-to-endpoint", - [] as Set, - [] as Set, - "", - [] as Set, - authorizations, - [], - models, - modelSpecifications, - new DefaultModelNamesRegistryFactory().modelNamesRegistry(modelRegistry), - null, - 1, - ["test"] as Set) - } - - def apiListingReference() { - new ApiListingReference("/path", "description", 3) - } - - def resourceListing(List authorizationTypes) { - new ResourceListing( - "apiVersion" - , - [apiListingReference()], - authorizationTypes, - null, - []) - } -} diff --git a/springfox-spring-web/src/test/groovy/springfox/documentation/spring/web/mixins/AuthSupport.groovy b/springfox-spring-web/src/test/groovy/springfox/documentation/spring/web/mixins/AuthSupport.groovy deleted file mode 100644 index 3582e3ea288..00000000000 --- a/springfox-spring-web/src/test/groovy/springfox/documentation/spring/web/mixins/AuthSupport.groovy +++ /dev/null @@ -1,88 +0,0 @@ -/* - * - * Copyright 2015-2019 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.spring.web.mixins - -import springfox.documentation.service.AuthorizationCodeGrant -import springfox.documentation.service.AuthorizationScope -import springfox.documentation.service.GrantType -import springfox.documentation.service.ImplicitGrant -import springfox.documentation.service.LoginEndpoint -import springfox.documentation.service.OAuth -import springfox.documentation.service.SecurityReference -import springfox.documentation.service.TokenEndpoint -import springfox.documentation.service.TokenRequestEndpoint - -import static java.util.Collections.* - -trait AuthSupport { - List defaultAuth() { - AuthorizationScope authorizationScope = - new AuthorizationScope("global", "accessEverything") - AuthorizationScope[] authorizationScopes = [authorizationScope] as AuthorizationScope[]; - singletonList(new SecurityReference("oauth2", authorizationScopes)) - } - - def authorizationTypes() { - - List authorizationScopeList = new ArrayList<>(); - authorizationScopeList.add(new AuthorizationScope("global", "access all")); - - - List grantTypes = new ArrayList<>(); - - LoginEndpoint loginEndpoint = new LoginEndpoint("http://petstore.swagger.io/oauth/dialog"); - grantTypes.add(new ImplicitGrant(loginEndpoint, "access_token")); - - - TokenRequestEndpoint tokenRequestEndpoint = - new TokenRequestEndpoint("http://petstore.swagger.io/oauth/requestToken", "client_id", "client_secret") - TokenEndpoint tokenEndpoint = - new TokenEndpoint("http://petstore.swagger.io/oauth/token", "auth_code") - - AuthorizationCodeGrant authorizationCodeGrant = new AuthorizationCodeGrant(tokenRequestEndpoint, tokenEndpoint) - - grantTypes.add(authorizationCodeGrant) - - OAuth oAuth = new OAuth("oauth", authorizationScopeList, grantTypes) - return oAuth - } - - def assertDefaultAuth(json) { - def oauth2 = json.authorizations.get('oauth2') - - assert oauth2.type == "oauth2" - assert oauth2.scopes[0].scope == "global" - assert oauth2.scopes[0].description == "access all" - - def implicit = oauth2.grantTypes.implicit - assert implicit.loginEndpoint.url == "http://petstore.swagger.io/oauth/dialog" - assert implicit.tokenName == "access_token" - - def tokenRequestEndpoint = oauth2.grantTypes.authorization_code.tokenRequestEndpoint - assert tokenRequestEndpoint.url == 'http://petstore.swagger.io/oauth/requestToken' - assert tokenRequestEndpoint.clientIdName == 'client_id' - assert tokenRequestEndpoint.clientSecretName == 'client_secret' - - def tokenEndpoint = oauth2.grantTypes.authorization_code.tokenEndpoint - assert tokenEndpoint.url == 'http://petstore.swagger.io/oauth/token' - assert tokenEndpoint.tokenName == 'auth_code' - true - } -} diff --git a/springfox-spring-web/src/test/groovy/springfox/documentation/spring/web/mixins/HandlerMethodsSupport.groovy b/springfox-spring-web/src/test/groovy/springfox/documentation/spring/web/mixins/HandlerMethodsSupport.groovy deleted file mode 100644 index 1ad6ce6c8dd..00000000000 --- a/springfox-spring-web/src/test/groovy/springfox/documentation/spring/web/mixins/HandlerMethodsSupport.groovy +++ /dev/null @@ -1,70 +0,0 @@ -/* - * - * Copyright 2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.spring.web.mixins -import com.fasterxml.classmate.MemberResolver -import com.fasterxml.classmate.ResolvedType -import com.fasterxml.classmate.TypeResolver -import com.fasterxml.classmate.members.ResolvedMethod -import org.springframework.web.method.HandlerMethod -import springfox.documentation.spring.web.dummy.DummyClass - -trait HandlerMethodsSupport { - HandlerMethod methodWithChild() { - def clazz = new DummyClass.MethodsWithSameName() - Class c = clazz.getClass(); - new HandlerMethod(clazz, c.getMethod("methodToTest", Integer, DummyClass.Child)) - } - - HandlerMethod loadDetailsWithOneParameter() { - def clazz = new DummyClass.MethodResolutionToDemonstrate1241() - Class c = clazz.getClass(); - new HandlerMethod(clazz, c.getMethod("loadDetails", String)) - } - - HandlerMethod loadDetailsWithTwoParameter() { - def clazz = new DummyClass.MethodResolutionToDemonstrate1241() - Class c = clazz.getClass(); - new HandlerMethod(clazz, c.getMethod("loadDetails", String, Date)) - } - - HandlerMethod unresolvableMethod() { - null - } - - ResolvedMethod resolvedMethod() { - def typeResolver = new TypeResolver() - ResolvedType dummy = typeResolver.resolve(DummyClass) - def memberResolver = new MemberResolver(typeResolver) - def resolvedMembers = memberResolver.resolve(dummy, null, null) - return resolvedMembers.getMemberMethods().find { "methodThatIsHidden".equals(it.getName())} - } - - HandlerMethod methodWithParent() { - def clazz = new DummyClass.MethodsWithSameName() - Class c = clazz.getClass(); - new HandlerMethod(clazz, c.getMethod("methodToTest", Integer, DummyClass.Parent)) - } - - HandlerMethod methodOnDummyClass(String method, Class ... params) { - def clazz = new DummyClass() - Class c = clazz.getClass(); - new HandlerMethod(clazz, c.getMethod(method, params)) - } -} diff --git a/springfox-spring-web/src/test/groovy/springfox/documentation/spring/web/mixins/ModelProviderForServiceSupport.groovy b/springfox-spring-web/src/test/groovy/springfox/documentation/spring/web/mixins/ModelProviderForServiceSupport.groovy deleted file mode 100644 index 5c7633ea488..00000000000 --- a/springfox-spring-web/src/test/groovy/springfox/documentation/spring/web/mixins/ModelProviderForServiceSupport.groovy +++ /dev/null @@ -1,148 +0,0 @@ -/* - * - * Copyright 2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.spring.web.mixins - -import com.fasterxml.classmate.TypeResolver -import com.fasterxml.jackson.databind.ObjectMapper -import com.fasterxml.jackson.databind.PropertyNamingStrategy -import org.springframework.plugin.core.OrderAwarePluginRegistry -import org.springframework.plugin.core.PluginRegistry -import springfox.documentation.schema.CachingModelDependencyProvider -import springfox.documentation.schema.CachingModelProvider -import springfox.documentation.schema.DefaultModelDependencyProvider -import springfox.documentation.schema.DefaultModelProvider -import springfox.documentation.schema.DefaultModelSpecificationProvider -import springfox.documentation.schema.DefaultTypeNameProvider -import springfox.documentation.schema.JacksonEnumTypeDeterminer -import springfox.documentation.schema.ModelProvider -import springfox.documentation.schema.TypeNameExtractor -import springfox.documentation.schema.configuration.ObjectMapperConfigured -import springfox.documentation.schema.plugins.SchemaPluginsManager -import springfox.documentation.schema.property.CachingModelPropertiesProvider -import springfox.documentation.schema.property.FactoryMethodProvider -import springfox.documentation.schema.property.ModelSpecificationFactory -import springfox.documentation.schema.property.ObjectMapperBeanPropertyNamingStrategy -import springfox.documentation.schema.property.OptimizedModelPropertiesProvider -import springfox.documentation.schema.property.bean.AccessorsProvider -import springfox.documentation.schema.property.field.FieldProvider -import springfox.documentation.spi.DocumentationType -import springfox.documentation.spi.schema.EnumTypeDeterminer -import springfox.documentation.spi.schema.TypeNameProviderPlugin - -trait ModelProviderForServiceSupport implements ServicePluginsSupport { - def typeNameExtractor() { - PluginRegistry modelNameRegistry = - OrderAwarePluginRegistry.create([new DefaultTypeNameProvider()]) - new TypeNameExtractor( - new TypeResolver(), - modelNameRegistry, - new JacksonEnumTypeDeterminer()) - } - - ModelProvider modelProvider( - SchemaPluginsManager pluginsManager = defaultSchemaPlugins(), - TypeResolver typeResolver = new TypeResolver(), - EnumTypeDeterminer enumTypeDeterminer = new JacksonEnumTypeDeterminer(), - ObjectMapper objectMapper = new ObjectMapper()) { - - def typeNameExtractor = typeNameExtractor() - def namingStrategy = new ObjectMapperBeanPropertyNamingStrategy() - - def event = new ObjectMapperConfigured(this, objectMapper) - namingStrategy.onApplicationEvent(event) - - def modelPropertiesProvider = new OptimizedModelPropertiesProvider( - new AccessorsProvider(typeResolver), - new FieldProvider(typeResolver), - new FactoryMethodProvider(typeResolver), - typeResolver, - namingStrategy, - pluginsManager, - enumTypeDeterminer, - typeNameExtractor, - new ModelSpecificationFactory(typeNameExtractor, enumTypeDeterminer)) - - modelPropertiesProvider.onApplicationEvent(event) - def modelDependenciesProvider = - new DefaultModelDependencyProvider( - typeResolver, - new CachingModelPropertiesProvider(typeResolver, modelPropertiesProvider), - typeNameExtractor, - enumTypeDeterminer, - defaultSchemaPlugins()) - new CachingModelProvider( - new DefaultModelProvider( - modelPropertiesProvider, - new CachingModelDependencyProvider(modelDependenciesProvider), - pluginsManager, - typeNameExtractor, - enumTypeDeterminer), - new DefaultModelSpecificationProvider( - typeResolver, - modelPropertiesProvider, - modelDependenciesProvider, - pluginsManager, - typeNameExtractor, - enumTypeDeterminer, - new ModelSpecificationFactory( - typeNameExtractor, - enumTypeDeterminer))) - } - - ModelProvider modelProviderWithSnakeCaseNamingStrategy( - SchemaPluginsManager pluginsManager = defaultSchemaPlugins(), - TypeResolver typeResolver = new TypeResolver()) { - - EnumTypeDeterminer enumTypeDeterminer = new JacksonEnumTypeDeterminer() - def objectMapper = new ObjectMapper() - def typeNameExtractor = typeNameExtractor() - objectMapper.setPropertyNamingStrategy(PropertyNamingStrategy.CAMEL_CASE_TO_LOWER_CASE_WITH_UNDERSCORES) - def namingStrategy = new ObjectMapperBeanPropertyNamingStrategy() - - def event = new ObjectMapperConfigured(this, objectMapper) - namingStrategy.onApplicationEvent(event) - - def modelPropertiesProvider = new OptimizedModelPropertiesProvider( - new AccessorsProvider(typeResolver), - new FieldProvider(typeResolver), - new FactoryMethodProvider(typeResolver), - typeResolver, - namingStrategy, - pluginsManager, - enumTypeDeterminer, - typeNameExtractor, - new ModelSpecificationFactory(typeNameExtractor, enumTypeDeterminer)) - - modelPropertiesProvider.onApplicationEvent(event) - def modelDependenciesProvider = - new DefaultModelDependencyProvider( - typeResolver, - modelPropertiesProvider, - typeNameExtractor, - enumTypeDeterminer, - defaultSchemaPlugins()) - new DefaultModelProvider( - modelPropertiesProvider, - modelDependenciesProvider, - pluginsManager, - typeNameExtractor, - enumTypeDeterminer) - } -} diff --git a/springfox-spring-web/src/test/groovy/springfox/documentation/spring/web/mixins/ServicePluginsSupport.groovy b/springfox-spring-web/src/test/groovy/springfox/documentation/spring/web/mixins/ServicePluginsSupport.groovy deleted file mode 100644 index 9b890aa081e..00000000000 --- a/springfox-spring-web/src/test/groovy/springfox/documentation/spring/web/mixins/ServicePluginsSupport.groovy +++ /dev/null @@ -1,110 +0,0 @@ -/* - * - * Copyright 2015-2019 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.spring.web.mixins - -import com.fasterxml.classmate.TypeResolver - -import springfox.documentation.schema.JacksonEnumTypeDeterminer -import springfox.documentation.schema.mixins.SchemaPluginsSupport -import springfox.documentation.service.PathDecorator -import springfox.documentation.spi.service.ApiListingScannerPlugin -import springfox.documentation.spi.service.DefaultsProviderPlugin -import springfox.documentation.spi.service.DocumentationPlugin -import springfox.documentation.spi.service.ModelNamesRegistryFactoryPlugin -import springfox.documentation.spi.service.OperationBuilderPlugin -import springfox.documentation.spi.service.ParameterBuilderPlugin - -import springfox.documentation.spring.web.paths.OperationPathDecorator -import springfox.documentation.spring.web.paths.PathMappingDecorator -import springfox.documentation.spring.web.paths.PathSanitizer -import springfox.documentation.spring.web.paths.QueryStringUriTemplateDecorator -import springfox.documentation.spring.web.plugins.DefaultResponseTypeReader -import springfox.documentation.spring.web.plugins.DocumentationPluginsManager -import springfox.documentation.spring.web.readers.operation.OperationModelsProvider -import springfox.documentation.spring.web.readers.parameter.ExpandedParameterBuilder -import springfox.documentation.spring.web.readers.parameter.ParameterNameReader -import springfox.documentation.spring.web.scanners.ApiListingReader -import springfox.documentation.spring.web.scanners.MediaTypeReader - -import java.util.stream.Stream - -import static java.util.stream.Collectors.* -import static org.springframework.plugin.core.OrderAwarePluginRegistry.* - -@SuppressWarnings("GrMethodMayBeStatic") -trait ServicePluginsSupport implements SchemaPluginsSupport { - - DocumentationPluginsManager defaultWebPlugins() { - def resolver = new TypeResolver() - def enumTypeDeterminer = new JacksonEnumTypeDeterminer() - def plugins = new DocumentationPluginsManager() - plugins.apiListingPlugins = of(Stream.of(new MediaTypeReader(), new ApiListingReader()).collect(toList())) - plugins.documentationPlugins = of([]) - plugins.parameterExpanderPlugins = of([new ExpandedParameterBuilder( - resolver, - enumTypeDeterminer - )]) - plugins.parameterPlugins = of([new ParameterNameReader()]) - plugins.operationBuilderPlugins = of([]) - plugins.operationModelsProviders = of([new OperationModelsProvider(defaultSchemaPlugins())]) - plugins.defaultsProviders = of([]) - plugins.apiListingScanners = of([]) - plugins.pathDecorators = of([ - new OperationPathDecorator(), - new PathSanitizer(), - new PathMappingDecorator(), - new QueryStringUriTemplateDecorator()]) - plugins.responsePlugins = of([new DefaultResponseTypeReader()]) - plugins.modelNameRegistryFactoryPlugins = of([]) - return plugins - } - - DocumentationPluginsManager customWebPlugins( - List documentationPlugins = [], - List operationPlugins = [], - List paramPlugins = [], - List defaultProviderPlugins = [], - List pathDecorators = [new OperationPathDecorator(), - new PathSanitizer(), - new PathMappingDecorator(), - new QueryStringUriTemplateDecorator()], - List listingScanners = [], - ModelNamesRegistryFactoryPlugin[] modelNamesGenerators) { - - def resolver = new TypeResolver() - def enumTypeDeterminer = new JacksonEnumTypeDeterminer() - def plugins = new DocumentationPluginsManager() - plugins.apiListingPlugins = of(Stream.of(new MediaTypeReader(), new ApiListingReader()).collect(toList())) - plugins.documentationPlugins = of(documentationPlugins) - plugins.parameterExpanderPlugins = of([new ExpandedParameterBuilder( - resolver, - enumTypeDeterminer - )]) - plugins.parameterPlugins = of(paramPlugins) - plugins.operationBuilderPlugins = of(operationPlugins) - plugins.operationModelsProviders = of([new OperationModelsProvider(defaultSchemaPlugins())]) - plugins.defaultsProviders = of(defaultProviderPlugins) - plugins.pathDecorators = of(pathDecorators) - plugins.apiListingScanners = of(listingScanners) - plugins.modelNameRegistryFactoryPlugins = of(modelNamesGenerators) - return plugins - } - -} diff --git a/springfox-spring-web/src/test/groovy/springfox/documentation/spring/web/paths/OperationPathDecoratorSpec.groovy b/springfox-spring-web/src/test/groovy/springfox/documentation/spring/web/paths/OperationPathDecoratorSpec.groovy deleted file mode 100644 index bb92f85d8fb..00000000000 --- a/springfox-spring-web/src/test/groovy/springfox/documentation/spring/web/paths/OperationPathDecoratorSpec.groovy +++ /dev/null @@ -1,36 +0,0 @@ -package springfox.documentation.spring.web.paths - -import springfox.documentation.spi.service.contexts.PathContext -import springfox.documentation.spi.service.contexts.RequestMappingContext -import springfox.documentation.spring.web.plugins.DocumentationContextSpec - -import static java.util.Optional.* - -class OperationPathDecoratorSpec extends DocumentationContextSpec { - def "Creates path adjustment in relation to servlet mapping" () { - given: - def requestMappingContext = Mock(RequestMappingContext) - PathContext ctx = new PathContext(requestMappingContext, empty()) - and: - requestMappingContext.getDocumentationContext() >> documentationContext() - and: - def sut = new OperationPathDecorator() - when: - def decorator = sut.decorator(ctx) - and: - def decorated = decorator.apply(mappingPattern) - then: - decorated == expected - where: - mappingPattern | expected - "" | "/" - "/" | "/" - "/businesses" | "/businesses" - "businesses" | "/businesses" - "/businesses/{businessId}" | "/businesses/{businessId}" - "/foo/bar:{baz}" | "/foo/bar:{baz}" - "/foo:{foo}/bar:{baz}" | "/foo:{foo}/bar:{baz}" - "/foo/bar:{baz}" | "/foo/bar:{baz}" - "/foo//bar:{baz}" | "/foo/bar:{baz}" - } -} diff --git a/springfox-spring-web/src/test/groovy/springfox/documentation/spring/web/paths/PathMappingDecoratorSpec.groovy b/springfox-spring-web/src/test/groovy/springfox/documentation/spring/web/paths/PathMappingDecoratorSpec.groovy deleted file mode 100644 index f33c3f9cd94..00000000000 --- a/springfox-spring-web/src/test/groovy/springfox/documentation/spring/web/paths/PathMappingDecoratorSpec.groovy +++ /dev/null @@ -1,31 +0,0 @@ -package springfox.documentation.spring.web.paths - -import springfox.documentation.spi.service.contexts.PathContext -import springfox.documentation.spi.service.contexts.RequestMappingContext -import springfox.documentation.spring.web.plugins.DocumentationContextSpec - -import static java.util.Optional.* - -class PathMappingDecoratorSpec extends DocumentationContextSpec { - def "Creates path adjustment in relation to servlet mapping" () { - given: - def requestMappingContext = Mock(RequestMappingContext) - PathContext ctx = new PathContext(requestMappingContext, empty()) - and: - plugin.pathMapping(pathMapping) - requestMappingContext.getDocumentationContext() >> documentationContext() - and: - def sut = new PathMappingDecorator() - when: - def decorator = sut.decorator(ctx) - and: - def decorated = decorator.apply("test") - then: - decorated == prefix + "test"; - where: - pathMapping | prefix - null | "/" - "" | "" - "pathMapping" | "pathMapping" - } -} diff --git a/springfox-spring-web/src/test/groovy/springfox/documentation/spring/web/paths/PathSanitizerSpec.groovy b/springfox-spring-web/src/test/groovy/springfox/documentation/spring/web/paths/PathSanitizerSpec.groovy deleted file mode 100644 index 84372962c49..00000000000 --- a/springfox-spring-web/src/test/groovy/springfox/documentation/spring/web/paths/PathSanitizerSpec.groovy +++ /dev/null @@ -1,38 +0,0 @@ -package springfox.documentation.spring.web.paths - -import spock.lang.Unroll -import springfox.documentation.spi.service.contexts.PathContext -import springfox.documentation.spi.service.contexts.RequestMappingContext -import springfox.documentation.spring.web.plugins.DocumentationContextSpec - -import static java.util.Optional.* - -class PathSanitizerSpec extends DocumentationContextSpec { - @Unroll - def "Creates path adjustment in relation to servlet mapping" () { - given: - def requestMappingContext = Mock(RequestMappingContext) - PathContext ctx = new PathContext(requestMappingContext, empty()) - and: - requestMappingContext.getDocumentationContext() >> documentationContext() - and: - def sut = new PathSanitizer() - when: - def decorator = sut.decorator(ctx) - and: - def decorated = decorator.apply(mappingPattern) - then: - decorated == expected - where: - mappingPattern | expected - "" | "/" - "/" | "/" - "/businesses" | "/businesses" - "/{businessId:\\w+}" | "/{businessId}" - "/businesses/{businessId}" | "/businesses/{businessId}" - "/foo/bar:{baz}" | "/foo/bar:{baz}" - "/foo:{foo}/bar:{baz}" | "/foo:{foo}/bar:{baz}" - "/foo/bar:{baz:\\w+}" | "/foo/bar:{baz}" - "/foo//bar:{baz:\\w+}" | "/foo/bar:{baz}" - } -} diff --git a/springfox-spring-web/src/test/groovy/springfox/documentation/spring/web/paths/PathsSpec.groovy b/springfox-spring-web/src/test/groovy/springfox/documentation/spring/web/paths/PathsSpec.groovy deleted file mode 100644 index 782d86ca660..00000000000 --- a/springfox-spring-web/src/test/groovy/springfox/documentation/spring/web/paths/PathsSpec.groovy +++ /dev/null @@ -1,94 +0,0 @@ -/* - * - * Copyright 2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.spring.web.paths -import spock.lang.Specification - -import static springfox.documentation.spring.web.paths.Paths.* - -class PathsSpec extends Specification { - def "maybe chomping the leading slash works"() { - expect: - maybeChompLeadingSlash(input) == expected - - where: - input || expected - "/test" || "test" - "test" || "test" - "/test/test2" || "test/test2" - "/test/test2/" || "test/test2/" - "/test/@test2/" || "test/@test2/" - "" || "" - null || null - } - - def "maybe chomping the trailing slash works"() { - expect: - maybeChompTrailingSlash(input) == expected - - where: - input || expected - "/test" || "/test" - "test" || "test" - "/test/test2" || "/test/test2" - "/test/test2/" || "/test/test2" - "/test/@test2/" || "/test/@test2" - "" || "" - null || null - } - - def "extracting first path segment"() { - expect: - firstPathSegment(input) == expected - - where: - input || expected - "/test" || "/test" - "test" || "test" - "/test/test2" || "/test" - "/test/test2/" || "/test" - "/test/@test2/" || "/test" - "/test@/test2/" || "/test" - "/tes\nt/test2/"|| "/tes" - "\n/tes\nt/test2/"|| "\n/tes\nt/test2/" - "" || "" - null || null - } - - def "Splitting on camel case"() { - expect: - splitCamelCase(input, "-") == expected - - where: - input || expected - "firstSecond" || "first-Second" - "FirstSecond" || "First-Second" - "FirstNSecond" || "First-N-Second" - "First" || "First" - "" || "" - null || "" - } - - def "Cannot instantiate HandlerMethodReturnTypes helper class" () { - when: - new Paths() - then: - thrown(UnsupportedOperationException) - } -} diff --git a/springfox-spring-web/src/test/groovy/springfox/documentation/spring/web/paths/QueryStringUriTemplateDecoratorSpec.groovy b/springfox-spring-web/src/test/groovy/springfox/documentation/spring/web/paths/QueryStringUriTemplateDecoratorSpec.groovy deleted file mode 100644 index a9022e83ff0..00000000000 --- a/springfox-spring-web/src/test/groovy/springfox/documentation/spring/web/paths/QueryStringUriTemplateDecoratorSpec.groovy +++ /dev/null @@ -1,85 +0,0 @@ -package springfox.documentation.spring.web.paths - -import springfox.documentation.builders.ParameterBuilder -import springfox.documentation.service.AllowableListValues -import springfox.documentation.service.AllowableValues -import springfox.documentation.service.Operation -import springfox.documentation.spi.service.contexts.PathContext -import springfox.documentation.spi.service.contexts.RequestMappingContext -import springfox.documentation.spring.web.plugins.DocumentationContextSpec - -import static java.util.Optional.* - -class QueryStringUriTemplateDecoratorSpec extends DocumentationContextSpec { - def "Is active only when the uri template is enabled" () { - given: - def sut = new QueryStringUriTemplateDecorator() - expect: - sut.supports(contextBuilder.enableUrlTemplating(true).build()) - !sut.supports(contextBuilder.enableUrlTemplating(false).build()) - } - - def "Creates path adjustment in relation to servlet mapping" () { - given: - def requestMappingContext = Mock(RequestMappingContext) - PathContext ctx = new PathContext(requestMappingContext, operation(params, allowedValues)) - and: - requestMappingContext.getDocumentationContext() >> documentationContext() - and: - def sut = new QueryStringUriTemplateDecorator() - when: - def decorator = sut.decorator(ctx) - and: - def decorated = decorator.apply(path) - then: - decorated == path + queryTemplate; - where: - path | params | queryTemplate | allowedValues - "" | [] | "" | [test1:null] - "" | ["test1"] | "{?test1}" | [test1:null] - "/path" | ["test2"] | "{?test2}" | [test1:null] - "/path" | ["test1", "test2"] | "{?test1,test2}" | [test1:null] - "/path?test3=1" | ["test1", "test2"] | "{&test1,test2}" | [test1:null] - "/path?test3=1" | ["test1", "test1"] | "{&test1}" | [test1:null] - "" | [] | "" | [test1:[]] - "" | ["test1"] | "{?test1}" | [test1:[]] - "/path" | ["test2"] | "{?test2}" | [test1:[]] - "/path" | ["test1", "test2"] | "{?test1,test2}" | [test1:[]] - "/path?test3=1" | ["test1", "test2"] | "{&test1,test2}" | [test1:[]] - "/path?test3=1" | ["test1", "test1"] | "{&test1}" | [test1:[]] - "" | [] | "" | [test1:["1"]] - "" | ["test1"] | "?test1=1" | [test1:["1"]] - "/path" | ["test2"] | "{?test2}" | [test1:["1"]] - "/path" | ["test1", "test2"] | "?test1=1{&test2}"| [test1:["1"]] - "/path?test3=1" | ["test1", "test2"] | "&test1=1{&test2}"| [test1:["1"]] - "/path?test3=1" | ["test1", "test1"] | "&test1=1" | [test1:["1"]] - "" | [] | "" | [test1:["1", "2"]] - "" | ["test1"] | "{?test1}" | [test1:["1", "2"]] - "/path" | ["test2"] | "{?test2}" | [test1:["1", "2"]] - "/path" | ["test1", "test2"] | "{?test1,test2}" | [test1:["1", "2"]] - "/path?test3=1" | ["test1", "test2"] | "{&test1,test2}" | [test1:["1", "2"]] - "/path?test3=1" | ["test1", "test1"] | "{&test1}" | [test1:["1", "2"]] - } - - Optional operation(List paramNames, allowableValueLookup) { - if (paramNames == null) { - return empty() - } - def operation = Mock(Operation) - operation.getParameters() >> paramNames.collect { - new ParameterBuilder() - .name(it) - .parameterType("query") - .allowableValues(allowableValue(allowableValueLookup[it])) - .build() } - of(operation) - } - - AllowableValues allowableValue(values) { - if (values) { - new AllowableListValues(values, 'string') - } else { - null - } - } -} diff --git a/springfox-spring-web/src/test/groovy/springfox/documentation/spring/web/plugins/DocumentationContextSpec.groovy b/springfox-spring-web/src/test/groovy/springfox/documentation/spring/web/plugins/DocumentationContextSpec.groovy deleted file mode 100644 index d23ba5852a3..00000000000 --- a/springfox-spring-web/src/test/groovy/springfox/documentation/spring/web/plugins/DocumentationContextSpec.groovy +++ /dev/null @@ -1,66 +0,0 @@ -/* - * - * Copyright 2015-2019 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.spring.web.plugins - -import com.fasterxml.classmate.TypeResolver -import spock.lang.Specification -import springfox.documentation.spi.DocumentationType -import springfox.documentation.spi.service.contexts.Defaults -import springfox.documentation.spi.service.contexts.DocumentationContextBuilder -import springfox.documentation.spi.service.contexts.OperationContext -import springfox.documentation.spring.web.mixins.ServicePluginsSupport -import springfox.documentation.spring.web.paths.DefaultPathProvider -import springfox.documentation.spring.web.readers.operation.ApiOperationReader - -import static springfox.documentation.spi.service.contexts.Orderings.* - -class DocumentationContextSpec extends Specification implements ServicePluginsSupport { - DocumentationContextBuilder contextBuilder - Docket plugin - ApiOperationReader operationReader - private defaultConfiguration - - def setup() { - defaultConfiguration = new DefaultConfiguration( - new Defaults(), - new TypeResolver(), - new DummyPathProvider()) - - contextBuilder = this.defaultConfiguration.create(DocumentationType.SWAGGER_12) - .requestHandlers([]) - .operationOrdering(nickNameComparator()) - plugin = new Docket(DocumentationType.SWAGGER_12) - operationReader = Mock(ApiOperationReader) - } - - def documentationContext() { - plugin.configure(contextBuilder) - } - - def context() { - OperationContext context = Mock() - context.documentationContext >> documentationContext() - context.consumes() >> [] - return context - } - - class DummyPathProvider extends DefaultPathProvider { - } -} diff --git a/springfox-spring-web/src/test/groovy/springfox/documentation/spring/web/plugins/DocumentationPluginsBootstrapperSpec.groovy b/springfox-spring-web/src/test/groovy/springfox/documentation/spring/web/plugins/DocumentationPluginsBootstrapperSpec.groovy deleted file mode 100644 index 976f4d996a8..00000000000 --- a/springfox-spring-web/src/test/groovy/springfox/documentation/spring/web/plugins/DocumentationPluginsBootstrapperSpec.groovy +++ /dev/null @@ -1,157 +0,0 @@ -/* - * - * Copyright 2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.spring.web.plugins - -import com.fasterxml.classmate.TypeResolver -import org.springframework.mock.env.MockEnvironment -import spock.lang.Specification -import springfox.documentation.service.Documentation -import springfox.documentation.spi.DocumentationType -import springfox.documentation.spi.service.DocumentationPlugin -import springfox.documentation.spi.service.RequestHandlerProvider -import springfox.documentation.spi.service.contexts.Defaults -import springfox.documentation.spi.service.contexts.DocumentationContextBuilder -import springfox.documentation.spring.web.DocumentationCache -import springfox.documentation.spring.web.paths.DefaultPathProvider -import springfox.documentation.spring.web.scanners.ApiDocumentationScanner - -class DocumentationPluginsBootstrapperSpec extends Specification { - - DocumentationPluginsManager pluginManager = Mock(DocumentationPluginsManager) - Documentation group = Mock(Documentation) - ApiDocumentationScanner apiGroup = Mock(ApiDocumentationScanner) - RequestHandlerProvider handlerProvider = Mock(RequestHandlerProvider) - - DocumentationPluginsBootstrapper bootstrapper = - new DocumentationPluginsBootstrapper(pluginManager, - [handlerProvider], - new DocumentationCache(), - apiGroup, - new TypeResolver(), - new Defaults(), - new DefaultPathProvider(), - new MockEnvironment()) - - def setup() { - pluginManager.applyDefaults(_, _) >> new DocumentationContextBuilder(DocumentationType.SWAGGER_12) - handlerProvider.requestHandlers() >> [] - apiGroup.scan(_) >> group - group.getGroupName() >> "default" - } - - def "Custom plugins are sensitive to being enabled or disabled"() { - given: - Docket enabledPlugin = Mock(Docket) - Docket disabledPlugin = Mock(Docket) - and: - enabledPlugin.groupName >> "enabled" - disabledPlugin.groupName >> "disabled" - enabledPlugin.documentationType >> DocumentationType.SWAGGER_12 - disabledPlugin.documentationType >> DocumentationType.SWAGGER_12 - when: - enabledPlugin.isEnabled() >> true - disabledPlugin.isEnabled() >> false - pluginManager.documentationPlugins() >> [enabledPlugin, disabledPlugin] - - and: - bootstrapper.start() - - then: - 1 * enabledPlugin.configure(_) - 0 * disabledPlugin.configure(_) - } - - def "Custom plugins are configured"() { - given: - DocumentationPlugin plugin = Mock(DocumentationPlugin) - plugin.documentationType >> DocumentationType.SWAGGER_12 - when: - pluginManager.documentationPlugins() >> [plugin] - plugin.isEnabled() >> true - - and: - bootstrapper.start() - - then: - 1 * plugin.configure(_) - } - - def "Documentation bootstrapper start parameters"() { - given: - DocumentationPlugin plugin = Mock(DocumentationPlugin) - plugin.documentationType >> DocumentationType.SWAGGER_12 - when: - pluginManager.documentationPlugins() >> [plugin] - plugin.isEnabled() >> true - - then: - bootstrapper.autoStartup - !bootstrapper.isRunning() - bootstrapper.phase == Integer.MAX_VALUE - } - - def "Documentation bootstrapper stop calls callback"() { - given: - DocumentationPlugin plugin = Mock(DocumentationPlugin) - plugin.documentationType >> DocumentationType.SWAGGER_12 - def stopped = false - when: - pluginManager.documentationPlugins() >> [plugin] - plugin.isEnabled() >> true - - and: - bootstrapper.stop({stopped = true}) - then: - stopped - } - - def "Bootstrapper now supports starting and stopping"() { - given: - DocumentationPlugin plugin = Mock(DocumentationPlugin) - plugin.documentationType >> DocumentationType.SWAGGER_12 - when: - pluginManager.documentationPlugins() >> [plugin] - plugin.isEnabled() >> true - - and: - bootstrapper.start() - bootstrapper.stop() - bootstrapper.start() - - then: - 2 * plugin.configure(_) - } - - def "Starting the Bootstrapper only configures the plugin once"() { - given: - DocumentationPlugin plugin = Mock(DocumentationPlugin) - plugin.documentationType >> DocumentationType.SWAGGER_12 - when: - pluginManager.documentationPlugins() >> [plugin] - plugin.isEnabled() >> true - - and: - bootstrapper.start() - bootstrapper.start() - - then: - 1 * plugin.configure(_) - } -} diff --git a/springfox-spring-web/src/test/groovy/springfox/documentation/spring/web/plugins/DuplicateGroupsDetectorSpec.groovy b/springfox-spring-web/src/test/groovy/springfox/documentation/spring/web/plugins/DuplicateGroupsDetectorSpec.groovy deleted file mode 100644 index 78a67a52635..00000000000 --- a/springfox-spring-web/src/test/groovy/springfox/documentation/spring/web/plugins/DuplicateGroupsDetectorSpec.groovy +++ /dev/null @@ -1,93 +0,0 @@ -/* - * - * Copyright 2015-2019 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ -package springfox.documentation.spring.web.plugins - -import spock.lang.Specification -import springfox.documentation.spi.DocumentationType -import springfox.documentation.spi.service.DocumentationPlugin - -import java.util.stream.Stream - -import static java.util.Collections.* -import static java.util.stream.Collectors.* -import static springfox.documentation.spring.web.plugins.DuplicateGroupsDetector.* - -class DuplicateGroupsDetectorSpec extends Specification { - def "The DuplicateGroupsDetector cannot be instantiated"() { - when: - new DuplicateGroupsDetector() - then: - thrown(UnsupportedOperationException) - } - - def "The plugin list is empty"() { - when: - def plugins = new ArrayList<>() - and: - ensureNoDuplicateGroups(plugins) - then: - noExceptionThrown() - } - - def "The plugin list has one element"() { - given: - def plugin1 = Mock(DocumentationPlugin) - def plugins = singletonList(plugin1) - and: - plugin1.getGroupName() >> "group1" - when: - ensureNoDuplicateGroups(plugins) - then: - noExceptionThrown() - } - - def "The plugin list has multiple unique elements"() { - given: - def plugin1 = Mock(DocumentationPlugin) - def plugin2 = Mock(DocumentationPlugin) - def plugins = Stream.of(plugin1, plugin2).collect(toList()) - and: - plugin1.getGroupName() >> "group1" - plugin2.getGroupName() >> "group2" - when: - ensureNoDuplicateGroups(plugins) - then: - noExceptionThrown() - } - - def "The plugin list has duplicate elements"() { - given: - def plugin1 = Mock(DocumentationPlugin) - def plugin2 = Mock(DocumentationPlugin) - def plugins = Stream.of(plugin1, plugin2).collect(toList()) - and: - plugin1.getGroupName() >> "group1" - plugin2.getGroupName() >> "group1" - when: - ensureNoDuplicateGroups(plugins) - then: - thrown(IllegalStateException) - } - - def "A plugin with a null groupName is not considered a duplicate"() { - def plugins = [new Docket(DocumentationType.SWAGGER_2)] - expect: - ensureNoDuplicateGroups(plugins) - } -} diff --git a/springfox-spring-web/src/test/groovy/springfox/documentation/spring/web/plugins/JacksonSerializerConventionSpec.groovy b/springfox-spring-web/src/test/groovy/springfox/documentation/spring/web/plugins/JacksonSerializerConventionSpec.groovy deleted file mode 100644 index d7751e0d52d..00000000000 --- a/springfox-spring-web/src/test/groovy/springfox/documentation/spring/web/plugins/JacksonSerializerConventionSpec.groovy +++ /dev/null @@ -1,80 +0,0 @@ -/* - * - * Copyright 2017-2019 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ -package springfox.documentation.spring.web.plugins - -import com.fasterxml.classmate.TypeResolver -import com.fasterxml.jackson.databind.annotation.JsonDeserialize -import com.fasterxml.jackson.databind.annotation.JsonSerialize -import org.springframework.stereotype.Component -import spock.lang.Specification -import spock.lang.Unroll - -@Component -class JacksonSerializerConventionSpec extends Specification { - def resolver = new TypeResolver() - - @Unroll - def "Identifies serializers and deserializers for #original.simpleName" () { - given: - def sut = conventionInThisPackage() - when: - def rules = sut.rules() - then: - rules.find { it.original == resolver.resolve(original) }?.alternate == substitute ?: resolver.resolve(substitute) - - where: - original | substitute - Same | A - Different | A - MissingSerialize | B - MissingDeserialize | A - MissingBoth | null - } - - def conventionInThisPackage() { - new JacksonSerializerConvention(resolver, "springfox.documentation.spring.web.plugins") - } - - @JsonSerialize(as=A) - @JsonDeserialize(as=A) - class Same { - } - - @JsonSerialize(as=A) - @JsonDeserialize(as=B) - class Different { - } - - @JsonDeserialize(as=B) - class MissingSerialize { - } - - @JsonSerialize(as=A) - class MissingDeserialize { - } - - class MissingBoth { - } - - class A { - } - - class B { - } -} diff --git a/springfox-spring-web/src/test/groovy/springfox/documentation/spring/web/plugins/OperationModelsBuilderSpec.groovy b/springfox-spring-web/src/test/groovy/springfox/documentation/spring/web/plugins/OperationModelsBuilderSpec.groovy deleted file mode 100644 index 348d0c502f3..00000000000 --- a/springfox-spring-web/src/test/groovy/springfox/documentation/spring/web/plugins/OperationModelsBuilderSpec.groovy +++ /dev/null @@ -1,57 +0,0 @@ -/* - * - * Copyright 2015-2019 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ -package springfox.documentation.spring.web.plugins - -import com.fasterxml.classmate.TypeResolver -import spock.lang.Specification -import springfox.documentation.spi.DocumentationType -import springfox.documentation.spi.schema.AlternateTypeProvider -import springfox.documentation.spi.schema.GenericTypeNamingStrategy -import springfox.documentation.spi.service.contexts.OperationModelContextsBuilder -import springfox.documentation.spring.web.dummy.models.Example - -import static java.util.Collections.* - -class OperationModelsBuilderSpec extends Specification { - OperationModelContextsBuilder sut = - new OperationModelContextsBuilder("group", - DocumentationType.SWAGGER_12, - "0", - Mock(AlternateTypeProvider), - Mock(GenericTypeNamingStrategy), - emptySet()) - - def "Manages a unique set of model contexts"() { - given: - sut.addInputParam(new TypeResolver().resolve(Example)) - - when: - def models = sut.build() - - then: - models.size() == 1 - - and: - sut.addInputParam(new TypeResolver().resolve(Example)) - sut.build().size() == 1 - sut.addReturn(new TypeResolver().resolve(Example)) - sut.build().size() == 2 - } - -} diff --git a/springfox-spring-web/src/test/groovy/springfox/documentation/spring/web/plugins/ResolvedMethodParameterEquivalenceSpec.groovy b/springfox-spring-web/src/test/groovy/springfox/documentation/spring/web/plugins/ResolvedMethodParameterEquivalenceSpec.groovy deleted file mode 100644 index 3add0ac19d7..00000000000 --- a/springfox-spring-web/src/test/groovy/springfox/documentation/spring/web/plugins/ResolvedMethodParameterEquivalenceSpec.groovy +++ /dev/null @@ -1,28 +0,0 @@ -package springfox.documentation.spring.web.plugins - -import com.fasterxml.classmate.TypeResolver -import spock.lang.Specification -import spock.lang.Unroll -import springfox.documentation.service.ResolvedMethodParameter - -class ResolvedMethodParameterEquivalenceSpec extends Specification { - @Unroll - def "two methods parameters are considered same => #areSame" (){ - given: - def sut = new ResolvedMethodParameterEquivalence() - expect: - sut.test(first, second) == areSame - (sut.doHash(first) == sut.doHash(second)) == areSame - where: - first | second | areSame - param("a", String) | param("b", String) | false - param("a", String) | param("a", String, 2) | false - param("a", Integer) | param("a", String) | false - param("a", String, 2) | param("a", String, 2) | true - - } - - def param(String name, Class aClass, int index = 0) { - new ResolvedMethodParameter(index, name, [], new TypeResolver().resolve(aClass)) - } -} diff --git a/springfox-spring-web/src/test/groovy/springfox/documentation/spring/web/readers/operation/CachingOperationNameGeneratorSpec.groovy b/springfox-spring-web/src/test/groovy/springfox/documentation/spring/web/readers/operation/CachingOperationNameGeneratorSpec.groovy deleted file mode 100644 index 5c1002ee927..00000000000 --- a/springfox-spring-web/src/test/groovy/springfox/documentation/spring/web/readers/operation/CachingOperationNameGeneratorSpec.groovy +++ /dev/null @@ -1,36 +0,0 @@ -/* - * - * Copyright 2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ -package springfox.documentation.spring.web.readers.operation - -import spock.lang.Specification - -class CachingOperationNameGeneratorSpec extends Specification { - def "Generates unique name when called twice" (){ - given: - CachingOperationNameGenerator sut = new CachingOperationNameGenerator() - when: - def first = sut.startingWith("first") - and: - def second = sut.startingWith("first") - then: - first.equals("first") - and: - second.equals("first_1") - } -} diff --git a/springfox-spring-web/src/test/groovy/springfox/documentation/spring/web/readers/operation/HandlerMethodResolverSpec.groovy b/springfox-spring-web/src/test/groovy/springfox/documentation/spring/web/readers/operation/HandlerMethodResolverSpec.groovy deleted file mode 100644 index 0a2772ca51a..00000000000 --- a/springfox-spring-web/src/test/groovy/springfox/documentation/spring/web/readers/operation/HandlerMethodResolverSpec.groovy +++ /dev/null @@ -1,298 +0,0 @@ -/* - * - * Copyright 2015-2019 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.spring.web.readers.operation - -import com.fasterxml.classmate.GenericType -import com.fasterxml.classmate.MemberResolver -import com.fasterxml.classmate.TypeResolver -import com.fasterxml.classmate.members.ResolvedMethod -import org.springframework.http.HttpStatus -import org.springframework.http.ResponseEntity -import org.springframework.util.MultiValueMap -import spock.lang.Specification -import springfox.documentation.spring.web.dummy.DummyClass -import springfox.documentation.spring.web.dummy.models.Example -import springfox.documentation.spring.web.dummy.models.Parent -import springfox.documentation.spring.web.mixins.HandlerMethodsSupport - -import java.lang.reflect.ParameterizedType -import java.lang.reflect.Type -import java.util.function.Predicate -import java.util.stream.Stream - -import static java.util.stream.Collectors.* -import static springfox.documentation.spring.web.readers.operation.HandlerMethodResolver.*; - -class HandlerMethodResolverSpec extends Specification implements HandlerMethodsSupport{ - def "Methods with same name are distinguished based on variance of parameters and return types" () { - given: - def sut = new HandlerMethodResolver(new TypeResolver()) - def resolvedParameters = sut.methodParameters(handlerMethod) - .collect() { it.parameterType.getErasedType().simpleName } - .sort() - def resolvedReturnType = sut.methodReturnType(handlerMethod).erasedType.simpleName - expect: - parameters == resolvedParameters - returnType == resolvedReturnType - where: - handlerMethod | returnType | parameters - methodWithChild() | "void" | ["Child", "Integer"] - methodWithParent()| "ResponseEntity"| ["Integer", "Parent"] - } - - - def "Overloaded methods are resolved correctly" () { - given: - def sut = new HandlerMethodResolver(new TypeResolver()) - def resolvedParameters = sut.methodParameters(handlerMethod) - .collect() { it.parameterType.getErasedType().simpleName } - .sort() - def resolvedReturnType = sut.methodReturnType(handlerMethod).erasedType.simpleName - expect: - parameters == resolvedParameters - returnType == resolvedReturnType - where: - handlerMethod | returnType | parameters - loadDetailsWithOneParameter() | "DTO[]" | ["String"] - loadDetailsWithTwoParameter() | "DTO[]" | ["Date", "String"] - } - - def "When method was not resolvable calling methodParameters returns empty list" () { - given: - def sut = new HandlerMethodResolver(new TypeResolver()) { - } - when: - def handlerMethod = unresolvableMethod() - and: - def parameters = sut.methodParameters(handlerMethod) - then: - parameters.size() == 0 - } - - def "When method was not resolvable calling methodReturnType returns return type as resolved" () { - given: - def sut = new HandlerMethodResolver(new TypeResolver()) { - } - when: - def returnType = sut.methodReturnType(handlerMethod) - then: - expectedReturnType.equals(returnType.erasedType.simpleName) - where: - handlerMethod | expectedReturnType - methodWithChild() | "void" - methodWithParent()| "ResponseEntity" - } - - def "Sorts on argument count" () { - given: - def resolver = new TypeResolver() - def memberResolver = new MemberResolver(resolver) - def dummyClass = memberResolver.resolve(resolver.resolve(DummyClass), null, null) - def allMethods = Stream.of(dummyClass.memberMethods).collect(toList()) - - when: - def list = allMethods.stream().filter(subset()).collect(toList()) - def sorted = list.stream().sorted(byArgumentCount()).collect(toList()) - - then: - sorted.get(0).name == 'methodWithNoArgs' - sorted.get(1).name == 'methodWithOneArgs' - sorted.get(2).name == 'methodWithTwoArgs' - where: - handlerMethods << [ - methodOnDummyClass('methodWithTwoArgs', int, String), - methodOnDummyClass('methodWithOneArgs', int), - methodOnDummyClass('methodWithNoArgs') - ] - } - - private Predicate subset() { - new Predicate() { - @Override - boolean test(ResolvedMethod input) { - return ['methodWithNoArgs', 'methodWithOneArgs', 'methodWithTwoArgs'].contains(input.name) - } - } - } - - def "Is able to determine if both types are void" () { - given: - def resolver = new TypeResolver() - def sut = new HandlerMethodResolver(resolver) - and: - def resolvedType = resolver.resolve(subClass) - expect: - sut.bothAreVoids(resolvedType, superClass) == areSame - where: - superClass | subClass | areSame - Void.TYPE | Integer | false - Void.TYPE | Void | true - Void.TYPE | Void.TYPE | true - Void | Integer | false - Void | Void | true - Void | Void.TYPE | true - } - - def "Is able to determine super classes" () { - given: - def resolver = new TypeResolver() - def sut = new HandlerMethodResolver(resolver) - and: - def resolvedType = resolver.resolve(subClass) - expect: - sut.isSuperClass(resolvedType, superClass) == isSuperClass - where: - superClass | subClass | isSuperClass - Parent | DummyClass.Child | false - Parent | Example | true - String | Integer | false - Object | String | true - Integer.TYPE | Integer | false - } - - def "Is able to determine sub classes" () { - given: - def resolver = new TypeResolver() - def sut = new HandlerMethodResolver(resolver) - and: - def resolvedType = resolver.resolve(superClass) - expect: - sut.isSubClass(resolvedType, subClass) == isSubClass - where: - superClass | subClass | isSubClass - Parent | DummyClass.Child | false - Parent | Example | true - String | Integer | false - Object | String | true - } - - def "Is able to determine generic super classes" () { - given: - def resolver = new TypeResolver() - def sut = new HandlerMethodResolver(resolver) - and: - def resolvedType = resolver.resolve(ChildResponseEntity, subClass) - def superClassParameterized = parameterizedType(superClass, parameterizedType) - expect: - sut.isGenericTypeSuperClass(resolvedType, superClassParameterized) == isSuperClass - where: - parameterizedType | superClass | subClass | isSuperClass - ResponseEntity | Parent | DummyClass.Child | true - ResponseEntity | Parent | Example | true - ResponseEntity | String | Integer | true - ResponseEntity | Object | String | true - ChildResponseEntity | Parent | DummyClass.Child | true - ChildResponseEntity | Parent | Example | true - ChildResponseEntity | String | Integer | true - ChildResponseEntity | Object | String | true - GenericType | Parent | DummyClass.Child | false - GenericType | Parent | Example | false - GenericType | String | Integer | false - GenericType | Object | String | false - } - - def "Is able to determine generic classes are covariant" () { - given: - def resolver = new TypeResolver() - def sut = new HandlerMethodResolver(resolver) - and: - def resolvedType = resolver.resolve(ChildResponseEntity, subClass) - def superClassParameterized = parameterizedType(superClass, parameterizedType) - expect: - sut.covariant(resolvedType, superClassParameterized) == isSuperClass - where: - parameterizedType | superClass | subClass | isSuperClass - ResponseEntity | Parent | DummyClass.Child | true - ResponseEntity | Parent | Example | true - ResponseEntity | String | Integer | true - ResponseEntity | Object | String | true - ChildResponseEntity | Parent | DummyClass.Child | true - ChildResponseEntity | Parent | Example | true - ChildResponseEntity | String | Integer | true - ChildResponseEntity | Object | String | true - GenericType | Parent | DummyClass.Child | false - GenericType | Parent | Example | false - GenericType | String | Integer | false - GenericType | Object | String | false - } - - def "Is able to determine generic sub classes" () { - given: - def resolver = new TypeResolver() - def sut = new HandlerMethodResolver(resolver) - and: - def resolvedType = resolver.resolve(ResponseEntity, superClass) - ParameterizedType superClassParameterized = parameterizedType(subClass, parameterizedType) - expect: - sut.isGenericTypeSubclass(resolvedType, superClassParameterized) == isSubclass - where: - parameterizedType | superClass | subClass | isSubclass - ResponseEntity | Parent | DummyClass.Child | true - ResponseEntity | Parent | Example | true - ResponseEntity | String | Integer | true - ResponseEntity | Object | String | true - ChildResponseEntity | Parent | DummyClass.Child | true - ChildResponseEntity | Parent | Example | true - ChildResponseEntity | String | Integer | true - ChildResponseEntity | Object | String | true - GenericType | Parent | DummyClass.Child | false - GenericType | Parent | Example | false - GenericType | String | Integer | false - GenericType | Object | String | false - } - - class ChildResponseEntity extends ResponseEntity { - - ChildResponseEntity(HttpStatus statusCode) { - super(statusCode) - } - - ChildResponseEntity(Object body, HttpStatus statusCode) { - super(body, statusCode) - } - - ChildResponseEntity(MultiValueMap headers, HttpStatus statusCode) { - super(headers, statusCode) - } - - ChildResponseEntity(Object body, MultiValueMap headers, HttpStatus statusCode) { - super(body, headers, statusCode) - } - } - - static ParameterizedType parameterizedType(typeArgument, parameterizedType) { - new ParameterizedType() { - @Override - Type[] getActualTypeArguments() { - [typeArgument] - } - - @Override - Type getRawType() { - parameterizedType - } - - @Override - Type getOwnerType() { - ResponseEntity - } - } - } -} diff --git a/springfox-spring-web/src/test/groovy/springfox/documentation/spring/web/readers/parameter/ExpandedParameterBuilderSpec.groovy b/springfox-spring-web/src/test/groovy/springfox/documentation/spring/web/readers/parameter/ExpandedParameterBuilderSpec.groovy deleted file mode 100644 index 8aba3b18bc1..00000000000 --- a/springfox-spring-web/src/test/groovy/springfox/documentation/spring/web/readers/parameter/ExpandedParameterBuilderSpec.groovy +++ /dev/null @@ -1,117 +0,0 @@ -package springfox.documentation.spring.web.readers.parameter - -import com.fasterxml.classmate.TypeResolver -import com.fasterxml.classmate.members.ResolvedField -import spock.lang.Specification -import spock.lang.Unroll -import springfox.documentation.builders.ParameterBuilder -import springfox.documentation.builders.RequestParameterBuilder -import springfox.documentation.schema.ExampleEnum -import springfox.documentation.schema.JacksonEnumTypeDeterminer -import springfox.documentation.schema.property.field.FieldProvider -import springfox.documentation.spi.DocumentationType -import springfox.documentation.spi.service.contexts.ParameterExpansionContext - -class ExpandedParameterBuilderSpec extends Specification { - def "List of enums are expanded correctly"() { - given: - ExpandedParameterBuilder sut = new ExpandedParameterBuilder( - new TypeResolver(), - new JacksonEnumTypeDeterminer() - ) - - and: - ParameterExpansionContext context = new ParameterExpansionContext( - "Test", - "", - "", - new ModelAttributeParameterMetadataAccessor( - [named("enums").rawMember], - named("enums").type, - "enums"), - DocumentationType.SWAGGER_12, - new ParameterBuilder(), - new RequestParameterBuilder()) - - when: - sut.apply(context) - def param = context.parameterBuilder.build() - - then: - param.name == "enums" - param.modelRef.type == "List" - param.modelRef.itemModel().isPresent() - - and: - def itemModel = param.modelRef.itemModel().get() - itemModel.type == "string" - itemModel.getAllowableValues().values.size() == 2 - } - - @Unroll - def "List of scalar type for #field is expanded correctly"() { - given: - ExpandedParameterBuilder sut = new ExpandedParameterBuilder( - new TypeResolver(), - new JacksonEnumTypeDeterminer() - ) - - and: - ParameterExpansionContext context = new ParameterExpansionContext( - "Test", - "", - "", - new ModelAttributeParameterMetadataAccessor( - [named(field).rawMember], - named(field).type, - field), - DocumentationType.SWAGGER_12, - new ParameterBuilder(), - new RequestParameterBuilder()) - - when: - sut.apply(context) - def param = context.parameterBuilder.build() - - then: - param.name == field - param.modelRef.type == paramType - param.modelRef.itemModel().isPresent() - - and: - def itemModel = param.modelRef.itemModel().get() - itemModel.type == itemType - - where: - field | paramType | itemType - "enums" | "List" | "string" - "strings" | "List" | "string" - "integers" | "List" | "int" - "uuids" | "List" | "uuid" - "enumsArray" | "Array" | "string" - "stringsArray" | "Array" | "string" - "integersArray" | "Array" | "int" - "uuidsArray" | "Array" | "uuid" - } - - def named(String name) { - def resolver = new TypeResolver() - FieldProvider fieldProvider = new FieldProvider(resolver) - for (ResolvedField field : fieldProvider.in(resolver.resolve(A))) { - if (field.name == name) { - return field - } - } - } - - class A { - public List enums; - public List strings; - public List integers; - public List uuids; - public ExampleEnum[] enumsArray; - public String[] stringsArray; - public Integer[] integersArray; - public UUID[] uuidsArray; - } -} diff --git a/springfox-spring-web/src/test/groovy/springfox/documentation/spring/web/readers/parameter/ModelAttributeParameterExpanderSpec.groovy b/springfox-spring-web/src/test/groovy/springfox/documentation/spring/web/readers/parameter/ModelAttributeParameterExpanderSpec.groovy deleted file mode 100644 index 585017a596a..00000000000 --- a/springfox-spring-web/src/test/groovy/springfox/documentation/spring/web/readers/parameter/ModelAttributeParameterExpanderSpec.groovy +++ /dev/null @@ -1,299 +0,0 @@ -/* - * - * Copyright 2015-2018 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License") - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.spring.web.readers.parameter - -import com.fasterxml.classmate.TypeResolver -import org.joda.time.LocalDateTime -import springfox.documentation.schema.JacksonEnumTypeDeterminer -import springfox.documentation.schema.property.bean.AccessorsProvider -import springfox.documentation.schema.property.field.FieldProvider -import springfox.documentation.spi.schema.EnumTypeDeterminer -import springfox.documentation.spring.web.dummy.models.Example -import springfox.documentation.spring.web.dummy.models.ModelAttributeComplexTypeExample -import springfox.documentation.spring.web.dummy.models.ModelAttributeExample -import springfox.documentation.spring.web.dummy.models.SomeType -import springfox.documentation.spring.web.plugins.DocumentationContextSpec - -import java.beans.BeanInfo -import java.beans.IntrospectionException - -import static springfox.documentation.schema.AlternateTypeRules.* - -class ModelAttributeParameterExpanderSpec extends DocumentationContextSpec { - TypeResolver typeResolver - EnumTypeDeterminer enumTypeDeterminer - ModelAttributeParameterExpander sut - - def setup() { - typeResolver = new TypeResolver() - enumTypeDeterminer = new JacksonEnumTypeDeterminer() - plugin.alternateTypeRules(newRule(typeResolver.resolve(LocalDateTime), typeResolver.resolve(String))) - sut = new ModelAttributeParameterExpander( - new FieldProvider(typeResolver), - new AccessorsProvider(typeResolver), - enumTypeDeterminer) - sut.pluginsManager = defaultWebPlugins() - } - - def "should expand parameters"() { - when: - def parameters = sut.expand(new ExpansionContext("", typeResolver.resolve(Example), context())) - .collect { it -> it.legacy.get() } - - then: - parameters.size() == 10 - parameters.find { it.name == 'parentBeanProperty' } - parameters.find { it.name == 'foo' } - parameters.find { it.name == 'bar' } - parameters.find { it.name == 'readOnlyString' } - parameters.find { it.name == 'enumType' } - parameters.find { it.name == 'annotatedEnumType' } - parameters.find { it.name == 'propertyWithNoSetterMethod' } - parameters.find { it.name == 'allCapsSet' } - parameters.find { it.name == 'nestedType.name' } - parameters.find { it.name == 'localDateTime' } - } - - def "should expand lists and nested types"() { - when: - def parameters = sut.expand(new ExpansionContext("", typeResolver.resolve(ModelAttributeExample), context())) - .collect { it -> it.legacy.get() } - - then: - parameters.size() == 6 - parameters.find { it.name == 'stringProp' } - parameters.find { it.name == 'intProp' } - parameters.find { it.name == 'listProp' } - parameters.find { it.name == 'arrayProp' } - parameters.find { it.name == 'complexProp.name' } - parameters.find { it.name == 'accountTypes' } - } - - def "should expand complex types"() { - when: - def parameters = sut.expand(new ExpansionContext("", typeResolver.resolve(ModelAttributeComplexTypeExample), context())) - .collect { it -> it.legacy.get() } - - then: - parameters.size() == 12 - parameters.find { it.name == 'stringProp' } - parameters.find { it.name == 'intProp' } - parameters.find { it.name == 'listProp' } - parameters.find { it.name == 'arrayProp' } - parameters.find { it.name == 'complexProp.name' } - parameters.find { it.name == 'fancyPets[0].categories[0].name' } - parameters.find { it.name == 'fancyPets[0].id' } - parameters.find { it.name == 'fancyPets[0].name' } - parameters.find { it.name == 'fancyPets[0].age' } - parameters.find { it.name == 'categories[0].name' } - parameters.find { it.name == 'modelAttributeProperty' } - parameters.find { it.name == 'accountTypes' } - } - - def "should expand parameters when parent name is not empty"() { - when: - def parameters = sut.expand(new ExpansionContext("parent", typeResolver.resolve(Example), context())) - .collect { it -> it.legacy.get() } - - then: - parameters.size() == 10 - parameters.find { it.name == 'parent.parentBeanProperty' } - parameters.find { it.name == 'parent.foo' } - parameters.find { it.name == 'parent.bar' } - parameters.find { it.name == 'parent.enumType' } - parameters.find { it.name == 'parent.annotatedEnumType' } - parameters.find { it.name == 'parent.propertyWithNoSetterMethod' } - parameters.find { it.name == 'parent.allCapsSet' } - parameters.find { it.name == 'parent.nestedType.name' } - parameters.find { it.name == 'parent.localDateTime' } - } - - def "should not expand causing stack overflow"() { - when: - def parameters = sut.expand(new ExpansionContext("parent", typeResolver.resolve(SomeType), context())) - .collect { it -> it.legacy.get() } - - then: - parameters.size() == 3 - parameters.find { it.name == 'parent.string1' } - parameters.find { it.name == 'parent.otherType.string2' } - parameters.find { it.name == 'parent.otherType.parent.string1' } - } - - def "Should return empty set when there is an exception"() { - given: - ModelAttributeParameterExpander expander = - new ModelAttributeParameterExpander( - new FieldProvider(typeResolver), - new AccessorsProvider(typeResolver), - enumTypeDeterminer) { - @Override - BeanInfo getBeanInfo(Class clazz) throws IntrospectionException { - throw new IntrospectionException("Fail") - } - } - expander.pluginsManager = defaultWebPlugins() - - when: - def parameters = expander.expand(new ExpansionContext("", typeResolver.resolve(Example), context())) - .collect { it -> it.legacy.get() } - - then: - parameters.size() == 0 - } - - def "should handle expansion of Book"() { - given: - def parameters = sut.expand( - new ExpansionContext( - "", - typeResolver.resolve(Book), - context())) - .collect { it.legacy.get() } - - expect: - parameters.size() == 3 - parameters.find { it.name == 'id' } - parameters.find { it.name == 'authors[0].id' } - parameters.find { it.name == 'authors[0].books[0].id' } - } - - def "should handle expansion item with public fields"() { - given: - def parameters = sut.expand( - new ExpansionContext( - "", - typeResolver.resolve(Bug2423), - context())) - .collect { it.legacy.get() } - - expect: - parameters.size() == 2 - parameters.find { it.name == 'from' } - parameters.find { it.name == 'to' } - } - - class Bug2423 { - public String from - public String to - } - - class Book { - private Long id - private Set authors - - Long getId() { - return id - } - - void setId(Long id) { - this.id = id - } - - Set getAuthors() { - return authors - } - - void setAuthors(Set authors) { - this.authors = authors - } - } - - class Author { - private Long id - private List books - - Long getId() { - return id - } - - void setId(Long id) { - this.id = id - } - - List getBooks() { - return books - } - - void setBooks(List books) { - this.books = books - } - } - - def "should handle expansion of User"() { - given: - def parameters = sut.expand( - new ExpansionContext( - "", - typeResolver.resolve(User), - context())) - .collect { it -> it.legacy.get() } - - expect: - parameters.size() == 2 - parameters.find { it.name == 'office.parent.name' } - parameters.find { it.name == 'office.name' } - } - - class User { - Office office - - Office getOffice() { - return office - } - - void setOffice(Office office) { - this.office = office - } - } - - class Office extends TreeEntity { - String name - - String getName() { - return name - } - - void setName(String name) { - this.name = name - } - } - - class TreeEntity { - T parent - User user - - User getUser() { - return user - } - - void setUser(User user) { - this.user = user - } - - T getParent() { - return parent - } - - void setParent(T parent) { - this.parent = parent - } - } -} diff --git a/springfox-spring-web/src/test/groovy/springfox/documentation/spring/web/readers/parameter/ParameterTypeDeterminerSpec.groovy b/springfox-spring-web/src/test/groovy/springfox/documentation/spring/web/readers/parameter/ParameterTypeDeterminerSpec.groovy deleted file mode 100644 index d60c861b14b..00000000000 --- a/springfox-spring-web/src/test/groovy/springfox/documentation/spring/web/readers/parameter/ParameterTypeDeterminerSpec.groovy +++ /dev/null @@ -1,38 +0,0 @@ -package springfox.documentation.spring.web.readers.parameter - -import spock.lang.Specification -import spock.lang.Unroll - -import static org.springframework.http.HttpMethod.* -import static org.springframework.http.MediaType.* -import static springfox.documentation.spring.web.readers.parameter.ParameterTypeDeterminer.determineScalarParameterType - -class ParameterTypeDeterminerSpec extends Specification { - def "Cannot instantiate this class"() { - when: - new ParameterTypeDeterminer() - - then: - thrown(UnsupportedOperationException) - } - - @Unroll - def "Determines the right parameter type given consumes media type #consumes and http method #httpMethod"() { - when: - def actual = determineScalarParameterType( - consumes as Set, - httpMethod) - - then: - actual == expectedParameterType - - where: - httpMethod | consumes | expectedParameterType - PUT | [APPLICATION_FORM_URLENCODED] | "query" - POST | [APPLICATION_FORM_URLENCODED] | "form" - GET | [APPLICATION_FORM_URLENCODED] | "query" - PUT | [MULTIPART_FORM_DATA] | "query" - POST | [MULTIPART_FORM_DATA] | "formData" - GET | [MULTIPART_FORM_DATA] | "query" - } -} diff --git a/springfox-spring-web/src/test/groovy/springfox/documentation/spring/web/scanners/ModelNamesRegistrySpec.groovy b/springfox-spring-web/src/test/groovy/springfox/documentation/spring/web/scanners/ModelNamesRegistrySpec.groovy deleted file mode 100644 index f7d9a8d934f..00000000000 --- a/springfox-spring-web/src/test/groovy/springfox/documentation/spring/web/scanners/ModelNamesRegistrySpec.groovy +++ /dev/null @@ -1,102 +0,0 @@ -package springfox.documentation.spring.web.scanners - -import com.fasterxml.classmate.TypeResolver -import spock.lang.Shared -import spock.lang.Specification -import springfox.documentation.schema.DefaultGenericTypeNamingStrategy -import springfox.documentation.schema.ModelSpecification -import springfox.documentation.schema.mixins.ModelProviderSupport -import springfox.documentation.service.ModelNamesRegistry -import springfox.documentation.spring.web.dummy.Address -import springfox.documentation.spring.web.dummy.ModelWithSameNameClasses - -import static java.util.Collections.* -import static springfox.documentation.spi.DocumentationType.* -import static springfox.documentation.spi.schema.contexts.ModelContext.* - -class ModelNamesRegistrySpec - extends Specification - implements ModelProviderSupport { - def sut = new ModelSpecificationRegistryBuilder() - @Shared - def resolver = new TypeResolver() - @Shared - def namingStrategy = new DefaultGenericTypeNamingStrategy() - - def "Request and response types are detected correctly"() { - given: - def provider = defaultModelSpecificationProvider() - def type = ModelWithSameNameClasses - - when: - def (asInput, asReturn, modelNamesRegistry) = requestResponseAndNamesRegistry(provider, type) - - then: - modelNamesRegistry.modelsByName().keySet().size() == 8 - modelNamesRegistry.nameByKey(asInput.compound.get().modelKey).get() == ModelWithSameNameClasses.simpleName + "Req" - modelNamesRegistry.nameByKey(asReturn.compound.get().modelKey).get() == ModelWithSameNameClasses.simpleName + "Res" - } - - def "Handles recursive types"() { - given: - def provider = defaultModelSpecificationProvider() - def type = Address - - when: - def (asInput, asReturn, modelNamesRegistry) = requestResponseAndNamesRegistry(provider, type) - - then: - modelNamesRegistry.modelsByName().keySet().size() == 4 - modelNamesRegistry.nameByKey(asInput.compound.get().modelKey).get() == Address.simpleName - modelNamesRegistry.nameByKey(asReturn.compound.get().modelKey).get() == Address.simpleName - } - - - ModelNamesRegistry modelNamesRegistry(ModelSpecification... specifications) { - modelNamesRegistry(Arrays.asList(specifications)) - } - - ModelNamesRegistry modelNamesRegistry(Collection specifications) { - specifications.each { - sut.add(it) - } - new DefaultModelNamesRegistryFactory().modelNamesRegistry(sut.build()) - } - - def requestResponseAndNamesRegistry( - provider, - type) { - def inputParam = inputParam( - "0_0", - "group", - resolver.resolve(type), - Optional.empty(), - new HashSet<>(), - OAS_30, - alternateTypeProvider(), - namingStrategy, - emptySet()) - def returnParam = returnValue( - "0_0", - "group", - resolver.resolve(type), - Optional.empty(), - OAS_30, - alternateTypeProvider(), - namingStrategy, - emptySet()) - ModelSpecification asInput = provider.modelSpecificationsFor( - inputParam).get() - def inputDependencies = provider.modelDependenciesSpecifications(inputParam) - - ModelSpecification asReturn = provider.modelSpecificationsFor( - returnParam).get() - def returnDependencies = provider.modelDependenciesSpecifications(returnParam) - - def models = [asInput, asReturn] - models.addAll(inputDependencies) - models.addAll(returnDependencies) - - [asInput, asReturn, modelNamesRegistry(models)] - } -} diff --git a/springfox-spring-web/src/test/groovy/springfox/documentation/spring/web/scanners/PathMappingAdjusterSpec.groovy b/springfox-spring-web/src/test/groovy/springfox/documentation/spring/web/scanners/PathMappingAdjusterSpec.groovy deleted file mode 100644 index b81544eb4b0..00000000000 --- a/springfox-spring-web/src/test/groovy/springfox/documentation/spring/web/scanners/PathMappingAdjusterSpec.groovy +++ /dev/null @@ -1,47 +0,0 @@ -/* - * - * Copyright 2015-2019 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.spring.web.scanners - -import spock.lang.Specification -import springfox.documentation.spi.service.contexts.DocumentationContext -import springfox.documentation.spring.web.paths.PathMappingAdjuster - -import static java.util.Optional.* - -class PathMappingAdjusterSpec extends Specification { - def "Adjust path mapping according to servlet registration" () { - given: - def context = Mock(DocumentationContext) - and: - context.pathMapping >> ofNullable(pathMapping) - when: - def sut = new PathMappingAdjuster(context) - then: - sut.adjustedPath(path) == expected - - where: - pathMapping | path | expected - "/" | "/v1" | "/v1" - "/path" | "/v1" | "/path/v1" - "" | "/v1" | "/v1" - null | "/v1" | "/v1" - - } -} diff --git a/springfox-spring-web/src/test/groovy/springfox/documentation/spring/web/scanners/ResourceGroupsSpec.groovy b/springfox-spring-web/src/test/groovy/springfox/documentation/spring/web/scanners/ResourceGroupsSpec.groovy deleted file mode 100644 index d6a13c190c6..00000000000 --- a/springfox-spring-web/src/test/groovy/springfox/documentation/spring/web/scanners/ResourceGroupsSpec.groovy +++ /dev/null @@ -1,31 +0,0 @@ -package springfox.documentation.spring.web.scanners - -import spock.lang.Specification -import spock.lang.Unroll -import springfox.documentation.builders.ApiDescriptionBuilder - -import static springfox.documentation.spring.web.plugins.Docket.* - -class ResourceGroupsSpec extends Specification { - @Unroll - def "belongsTo tests api descriptions #api.groupName correctly"() { - given: - def sut = ResourceGroups.belongsTo("test") - - expect: - sut.test(api) == matches - - where: - api | matches - apiDescription() | true - apiDescription(DEFAULT_GROUP_NAME) | false - apiDescription("test") | true - apiDescription("different") | false - } - - def apiDescription(name) { - new ApiDescriptionBuilder() - .groupName(name) - .build() - } -} diff --git a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/Address.java b/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/Address.java deleted file mode 100644 index 36c450b3cd1..00000000000 --- a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/Address.java +++ /dev/null @@ -1,88 +0,0 @@ -/* - * - * Copyright 2017-2019 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ -package springfox.documentation.spring.web.dummy; - - -public class Address { - - private long id; - private String address1; - private String address2; - private String city; - private String state; - private String zip; - - private Person person; - - public long getId() { - return id; - } - - public void setId(long id) { - this.id = id; - } - - public String getAddress1() { - return address1; - } - - public void setAddress1(String address1) { - this.address1 = address1; - } - - public String getAddress2() { - return address2; - } - - public void setAddress2(String address2) { - this.address2 = address2; - } - - public String getCity() { - return city; - } - - public void setCity(String city) { - this.city = city; - } - - public String getState() { - return state; - } - - public void setState(String state) { - this.state = state; - } - - public String getZip() { - return zip; - } - - public void setZip(String zip) { - this.zip = zip; - } - - public Person getPerson() { - return person; - } - - public void setPerson(Person person) { - this.person = person; - } -} diff --git a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/AlternateTypeContainer.java b/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/AlternateTypeContainer.java deleted file mode 100644 index 914b67ade1b..00000000000 --- a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/AlternateTypeContainer.java +++ /dev/null @@ -1,31 +0,0 @@ -/* - * - * Copyright 2018-2019 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ -package springfox.documentation.spring.web.dummy; - -public class AlternateTypeContainer { - private ToReplaceWithString stringValue; - - public ToReplaceWithString getStringValue() { - return stringValue; - } - - public void setStringValue(ToReplaceWithString stringValue) { - this.stringValue = stringValue; - } -} diff --git a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/Bug2219ListingScanner.java b/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/Bug2219ListingScanner.java deleted file mode 100644 index bab3526782e..00000000000 --- a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/Bug2219ListingScanner.java +++ /dev/null @@ -1,76 +0,0 @@ -/* - * - * Copyright 2017-2019 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ -package springfox.documentation.spring.web.dummy; - -import org.springframework.http.HttpMethod; -import springfox.documentation.builders.ModelSpecificationBuilder; -import springfox.documentation.builders.OperationBuilder; -import springfox.documentation.builders.RequestParameterBuilder; -import springfox.documentation.schema.ScalarType; -import springfox.documentation.service.ApiDescription; -import springfox.documentation.service.ParameterType; -import springfox.documentation.spi.DocumentationType; -import springfox.documentation.spi.service.ApiListingScannerPlugin; -import springfox.documentation.spi.service.contexts.DocumentationContext; -import springfox.documentation.spring.web.readers.operation.CachingOperationNameGenerator; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.List; - -public class Bug2219ListingScanner implements ApiListingScannerPlugin { - - @Override - public List apply(DocumentationContext context) { - return new ArrayList<>( - Arrays.asList( - new ApiDescription( - "different-group", - "/bugs/2219", - "This is a bug summary", - "This is a bug-fix for 2219", - Collections.singletonList( - new OperationBuilder( - new CachingOperationNameGenerator()) - .authorizations(new ArrayList<>()) - .codegenMethodNameStem("bug2219GET") - .method(HttpMethod.GET) - .notes("This is a test method") - .requestParameters( - Collections.singletonList( - new RequestParameterBuilder() - .description("description of bug 2219") - .name("description") - .in(ParameterType.QUERY) - .required(true) - .query(q -> new ModelSpecificationBuilder() - .scalarModel(ScalarType.STRING) - .build()) - .build())) - .build()), - false))); - } - - @Override - public boolean supports(DocumentationType delimiter) { - return true; - } - -} diff --git a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/Category.java b/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/Category.java deleted file mode 100644 index c66c76de756..00000000000 --- a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/Category.java +++ /dev/null @@ -1,36 +0,0 @@ -/* - * - * Copyright 2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.spring.web.dummy; - -public class Category { - private String name; - - public Category(String name) { - this.name = name; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } -} diff --git a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/DummyClass.java b/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/DummyClass.java deleted file mode 100644 index aff1e3f704f..00000000000 --- a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/DummyClass.java +++ /dev/null @@ -1,616 +0,0 @@ -/* - * - * Copyright 2015-2019 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.spring.web.dummy; - -import com.fasterxml.jackson.annotation.JsonView; -import io.swagger.annotations.ApiImplicitParam; -import io.swagger.annotations.ApiImplicitParams; -import io.swagger.annotations.ApiOperation; -import io.swagger.annotations.ApiParam; -import io.swagger.annotations.ApiResponse; -import io.swagger.annotations.ApiResponses; -import io.swagger.annotations.Authorization; -import io.swagger.annotations.AuthorizationScope; -import io.swagger.annotations.Extension; -import io.swagger.annotations.ExtensionProperty; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.validation.BindingResult; -import org.springframework.web.bind.annotation.ModelAttribute; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RequestPart; -import org.springframework.web.bind.annotation.ResponseBody; -import org.springframework.web.bind.annotation.ResponseStatus; -import org.springframework.web.multipart.MultipartFile; -import springfox.documentation.annotations.ApiIgnore; -import springfox.documentation.schema.Views; -import springfox.documentation.spring.web.dummy.DummyModels.Ignorable; -import springfox.documentation.spring.web.dummy.models.Bar; -import springfox.documentation.spring.web.dummy.models.Country; -import springfox.documentation.spring.web.dummy.models.Holder; -import springfox.documentation.spring.web.dummy.models.House; -import springfox.documentation.spring.web.dummy.models.EnumType; -import springfox.documentation.spring.web.dummy.models.Example; -import springfox.documentation.spring.web.dummy.models.FancyPet; -import springfox.documentation.spring.web.dummy.models.Foo; -import springfox.documentation.spring.web.dummy.models.FoobarDto; -import springfox.documentation.spring.web.dummy.models.MapFancyPet; -import springfox.documentation.spring.web.dummy.models.Pet; -import springfox.documentation.spring.web.dummy.models.PetWithJsonView; -import springfox.documentation.spring.web.dummy.models.Pirate; -import springfox.documentation.spring.web.dummy.models.RecursiveTypeWithConditions; -import springfox.documentation.spring.web.dummy.models.RecursiveTypeWithNonEqualsConditionsMiddleWithCircle; -import springfox.documentation.spring.web.dummy.models.RecursiveTypeWithNonEqualsConditionsOuter; -import springfox.documentation.spring.web.dummy.models.RecursiveTypeWithNonEqualsConditionsOuterWithModel; -import springfox.documentation.spring.web.dummy.models.RecursiveTypeWithNonEqualsConditionsOuterWithSubTypes; -import springfox.documentation.spring.web.dummy.models.SameFancyPet; -import springfox.documentation.spring.web.dummy.models.Street; -import springfox.documentation.spring.web.dummy.models.Treeish; -import springfox.documentation.spring.web.dummy.models.Wrapper; - -import jakarta.servlet.ServletRequest; -import jakarta.servlet.http.HttpServletResponse; -import java.net.URI; -import java.util.Date; -import java.util.List; -import java.util.Map; - -@RequestMapping(produces = { "application/json" }, consumes = { "application/json", "application/xml" }) -@ApiResponses({ - @ApiResponse(code = 404, response = RestError.class, message = "Not Found") - }) -public class DummyClass { - - - @ApiParam - public void annotatedWithApiParam() { - throw new UnsupportedOperationException(); - } - - public void dummyMethod() { - throw new UnsupportedOperationException(); - } - - public void methodWithOneArgs(int a) { - throw new UnsupportedOperationException(); - } - - public void methodWithTwoArgs( - int a, - String b) { - throw new UnsupportedOperationException(); - } - - public void methodWithNoArgs() { - throw new UnsupportedOperationException(); - } - - @ApiOperation(value = "description", httpMethod = "GET") - public void methodWithHttpGETMethod() { - throw new UnsupportedOperationException(); - } - - @ApiOperation(value = "description", nickname = "unique") - public void methodWithNickName() { - throw new UnsupportedOperationException(); - } - - @ApiOperation(value = "description", httpMethod = "GET", hidden = true) - public void methodThatIsHidden() { - throw new UnsupportedOperationException(); - } - - @ApiOperation(value = "description", httpMethod = "RUBBISH") - public void methodWithInvalidHttpMethod() { - throw new UnsupportedOperationException(); - } - - @ApiOperation(value = "summary", httpMethod = "RUBBISH") - public void methodWithSummary() { - throw new UnsupportedOperationException(); - } - - @ApiOperation(value = "", notes = "some notes") - public void methodWithNotes() { - throw new UnsupportedOperationException(); - } - - @ApiOperation(value = "", nickname = "a nickname") - public void methodWithNickname() { - throw new UnsupportedOperationException(); - } - - @ApiOperation(value = "", position = 5) - public void methodWithPosition() { - throw new UnsupportedOperationException(); - } - - @ApiOperation(value = "", consumes = "application/xml") - public void methodWithXmlConsumes() { - throw new UnsupportedOperationException(); - } - - @ApiOperation(value = "", produces = "application/xml") - public void methodWithXmlProduces() { - throw new UnsupportedOperationException(); - } - - @ApiOperation(value = "", produces = "application/xml, application/json", consumes = "application/xml, " + - "application/json") - public void methodWithMultipleMediaTypes() { - throw new UnsupportedOperationException(); - } - - @ApiOperation(value = "", produces = "application/xml", consumes = "application/xml") - public void methodWithBothXmlMediaTypes() { - throw new UnsupportedOperationException(); - } - - @ApiOperation(value = "", produces = "application/json", consumes = "application/xml") - public void methodWithMediaTypeAndFile(MultipartFile multipartFile) { - throw new UnsupportedOperationException(); - } - - @ApiOperation(value = "", response = DummyModels.FunkyBusiness.class) - public void methodApiResponseClass() { - throw new UnsupportedOperationException(); - } - - @ApiResponses({ - @ApiResponse(code = 201, response = Void.class, message = "Rule Scheduled successfully"), - @ApiResponse(code = 500, response = RestError.class, message = "Internal Server Error"), - @ApiResponse(code = 406, response = RestError.class, message = "Not acceptable") }) - public void methodAnnotatedWithApiResponse() { - throw new UnsupportedOperationException(); - } - - @ApiOperation(value = "methodWithExtensions", - extensions = { - @Extension(properties = @ExtensionProperty(name = "x-test1", value = "value1")), - @Extension(name = "test2", properties = @ExtensionProperty(name = "name2", value = "value2")) - } - ) - public void methodWithExtensions() { - throw new UnsupportedOperationException(); - } - - @ApiOperation(value = "SomeVal", - authorizations = @Authorization(value = "oauth2", - scopes = { @AuthorizationScope(scope = "scope", - description = "scope description") - })) - public void methodWithAuth() { - throw new UnsupportedOperationException(); - } - - @ApiOperation(value = "") - public DummyModels.FunkyBusiness methodWithAPiAnnotationButWithoutResponseClass() { - return null; - } - - @ApiOperation(value = "") - public DummyModels.Paginated methodWithGenericType() { - return null; - } - - public ResponseEntity methodWithGenericPrimitiveArray() { - return null; - } - - public byte[] methodWithByteArray() { - return null; - } - - public ResponseEntity methodWithGenericComplexArray() { - return null; - } - - public ResponseEntity methodWithEnumResponse() { - return null; - } - - public ResponseEntity methodWithAlternateType(AlternateTypeContainer container) { - return null; - } - - @Deprecated - public void methodWithDeprecated() { - throw new UnsupportedOperationException(); - } - - public void methodWithServletRequest(ServletRequest req) { - throw new UnsupportedOperationException(); - } - - public void methodWithBindingResult(BindingResult res) { - throw new UnsupportedOperationException(); - } - - public void methodWithInteger(Integer integer) { - throw new UnsupportedOperationException(); - } - - public void methodWithAnnotatedInteger(@Ignorable Integer integer) { - throw new UnsupportedOperationException(); - } - - public void methodWithURIAsRequestParam(@RequestParam URI uri) { - throw new UnsupportedOperationException(); - } - - public void methodWithURIAsPathVariable(@PathVariable URI uri) { - throw new UnsupportedOperationException(); - } - - public void methodWithModelAttribute(@ModelAttribute Example example) { - throw new UnsupportedOperationException(); - } - - public void methodWithoutModelAttribute(Example example) { - throw new UnsupportedOperationException(); - } - - public void methodWithTreeishModelAttribute(@ModelAttribute Treeish example) { - throw new UnsupportedOperationException(); - } - - @RequestMapping("/businesses/{businessId}") - public void methodWithSinglePathVariable(@PathVariable String businessId) { - throw new UnsupportedOperationException(); - - } - - @RequestMapping("/businesses/{businessId}") - public void methodWithSingleEnum(BusinessType businessType) { - throw new UnsupportedOperationException(); - - } - - @RequestMapping("/businesses/{businessId}") - public void methodWithSingleEnumArray(BusinessType[] businessTypes) { - throw new UnsupportedOperationException(); - - } - - @RequestMapping("/businesses/{businessId}/employees/{employeeId}/salary") - public void methodWithRatherLongRequestPath() { - throw new UnsupportedOperationException(); - - } - - @RequestMapping(value = "/parameter-conditions", params = "test=testValue") - public void methodWithParameterRequestCondition() { - - } - - @ApiImplicitParam(name = "Authentication", dataType = "string", required = true, paramType = "header", - value = "Authentication token") - public void methodWithApiImplicitParam() { - throw new UnsupportedOperationException(); - } - - @ApiImplicitParam(name = "Authentication", dataType = "string", required = true, paramType = "header", - value = "Authentication token") - public void methodWithApiImplicitParamAndInteger(Integer integer) { - throw new UnsupportedOperationException(); - } - - @ApiImplicitParam(name = "Authentication", dataType = "Example", required = true, paramType = "header", - value = "Authentication token") - public void methodWithApiImplicitParamAndExample(Integer integer) { - throw new UnsupportedOperationException(); - } - - @ApiImplicitParam(name = "Authentication", dataType = "string", required = true, paramType = "header", - value = "Authentication token", allowMultiple = true) - public void methodWithApiImplicitParamAndAllowMultiple(Integer integer) { - throw new UnsupportedOperationException(); - } - - @ApiImplicitParams({ - @ApiImplicitParam(name = "lang", dataType = "string", required = true, paramType = "query", - value = "Language", defaultValue = "EN", allowableValues = "EN,FR"), - @ApiImplicitParam(name = "Authentication", - dataType = "string", - required = true, - paramType = "header", - value = "Authentication token") - }) - public void methodWithApiImplicitParams(Integer integer) { - throw new UnsupportedOperationException(); - } - - public interface ApiImplicitParamsInterface { - @ApiImplicitParams({ - @ApiImplicitParam(name = "lang", dataType = "string", required = true, paramType = "query", - value = "Language", defaultValue = "EN", allowableValues = "EN,FR") - }) - @ApiImplicitParam(name = "Authentication", dataType = "string", required = true, paramType = "header", - value = "Authentication token") - void methodWithApiImplicitParam(); - } - - public static class ApiImplicitParamsClass implements ApiImplicitParamsInterface { - @Override - public void methodWithApiImplicitParam() { - } - } - - @ApiImplicitParams({ - @ApiImplicitParam(name = "common-header", dataType = "string", required = true, paramType = "header") - }) - public class ApiImplicitParamsAllowMultipleClass implements ApiImplicitParamsInterface { - @Override - public void methodWithApiImplicitParam() { - } - } - - @ResponseBody - public DummyModels.BusinessModel methodWithConcreteResponseBody() { - return null; - } - - @ResponseBody - public Map methodWithMapReturn() { - return null; - } - - @ResponseBody - @ResponseStatus(value = HttpStatus.ACCEPTED, reason = "Accepted request") - public DummyModels.BusinessModel methodWithResponseStatusAnnotation() { - return null; - } - - @ResponseBody - @ResponseStatus(value = HttpStatus.NO_CONTENT) - public void methodWithResponseStatusAnnotationAndEmptyReason() { - throw new UnsupportedOperationException(); - } - - @ResponseBody - public DummyModels.AnnotatedBusinessModel methodWithModelPropertyAnnotations() { - return null; - } - - @ResponseBody - public DummyModels.NamedBusinessModel methodWithModelAnnotations() { - return null; - } - - @ResponseBody - public List methodWithListOfBusinesses() { - return null; - } - - @ResponseBody - public DummyModels.CorporationModel methodWithConcreteCorporationModel() { - return null; - } - - @ResponseBody - public Date methodWithDateResponseBody() { - return null; - } - - public void methodParameterWithRequestBodyAnnotation( - @RequestBody DummyModels.BusinessModel model, - HttpServletResponse response, - DummyModels.AnnotatedBusinessModel annotatedBusinessModel) { - throw new UnsupportedOperationException(); - } - - public void methodParameterWithRequestPartAnnotation( - @RequestPart DummyModels.BusinessModel model, - HttpServletResponse response, - DummyModels.AnnotatedBusinessModel annotatedBusinessModel) { - throw new UnsupportedOperationException(); - } - - public void methodParameterWithRequestPartAnnotationOnSimpleType( - @RequestPart String model, - HttpServletResponse response, - DummyModels.AnnotatedBusinessModel annotatedBusinessModel) { - throw new UnsupportedOperationException(); - } - - @ResponseBody - public DummyModels.AnnotatedBusinessModel methodWithSameAnnotatedModelInReturnAndRequestBodyParam( - @RequestBody DummyModels.AnnotatedBusinessModel model) { - return null; - } - - @ApiResponses({ @ApiResponse(code = 413, message = "a message") }) - public void methodWithApiResponses() { - throw new UnsupportedOperationException(); - } - - @ApiIgnore - public static class ApiIgnorableClass { - @ApiIgnore - public void dummyMethod() { - throw new UnsupportedOperationException(); - } - } - - @ResponseBody - public DummyModels.ModelWithSerializeOnlyProperty methodWithSerializeOnlyPropInReturnAndRequestBodyParam( - @RequestBody DummyModels.ModelWithSerializeOnlyProperty model) { - return null; - } - - @ResponseBody - public FoobarDto methodToTestFoobarDto(@RequestBody FoobarDto model) { - return null; - } - - @ResponseBody - public Pirate methodToTestBidirectionalRecursiveTypes(@RequestBody Pirate model) { - throw new UnsupportedOperationException(); - } - - @ResponseBody - public RecursiveTypeWithConditions methodToTestBidirectionalRecursiveTypesWithConditions( - @RequestBody RecursiveTypeWithConditions model) { - throw new UnsupportedOperationException(); - } - - @ResponseBody - public RecursiveTypeWithNonEqualsConditionsOuter methodToTestBidirectionalRecursiveTypesWithNonEqualsConditions( - @RequestBody RecursiveTypeWithNonEqualsConditionsOuter model) { - throw new UnsupportedOperationException(); - } - - @ResponseBody - public Wrapper methodToTestBidirectionalRecursiveTypesWithModel( - @RequestBody Pet model) { - throw new UnsupportedOperationException(); - } - - @ResponseBody - public void methodToTestBidirectionalRecursiveTypesWithModel( - @RequestBody Wrapper model) { - throw new UnsupportedOperationException(); - } - - @ResponseBody - public RecursiveTypeWithNonEqualsConditionsOuterWithModel methodToTestBidirectionalRecursiveTypesWithCircle( - @RequestBody RecursiveTypeWithNonEqualsConditionsMiddleWithCircle model) { - throw new UnsupportedOperationException(); - } - - @ResponseBody - public RecursiveTypeWithNonEqualsConditionsMiddleWithCircle methodToTestBidirectionalRecursiveTypesWithCircle() { - throw new UnsupportedOperationException(); - } - - @ResponseBody - public RecursiveTypeWithNonEqualsConditionsOuterWithSubTypes methodToTestBidirectionalRecursiveTypesWithKnownTypes( - @RequestBody RecursiveTypeWithConditions model) { - throw new UnsupportedOperationException(); - } - - @ResponseBody - public Holder methodToTestSpareModelsWithKnownTypes( - @RequestBody Foo model1, @RequestBody Holder model2) { - throw new UnsupportedOperationException(); - } - - @ResponseBody - public List methodToTestCyclicStructure(@RequestBody Street street, @RequestBody Country country) { - throw new UnsupportedOperationException(); - } - - @ResponseBody - public Pet methodToTestIssue182(@RequestBody springfox.documentation.spring.web.dummy.models.same.Pet pet) { - throw new UnsupportedOperationException(); - } - - @ResponseBody - public Map> methodToTestSerializationAndDeserialization( - @RequestBody Map pet) { - throw new UnsupportedOperationException(); - } - - @ResponseBody - public MapFancyPet methodToTestSameClassesWithDifferentProperties(@RequestBody SameFancyPet fancyPet) { - throw new UnsupportedOperationException(); - } - - @ResponseBody - @JsonView(Views.SecondView.class) - public PetWithJsonView methodToTestJsonView(@RequestBody @JsonView(Views.FirstView.class) PetWithJsonView pet) { - throw new UnsupportedOperationException(); - } - - @ResponseBody - public List methodToTestOrdering(@RequestBody SameFancyPet fancyPet) { - throw new UnsupportedOperationException(); - } - - @ResponseBody - public List methodToTestOrdering(@RequestBody SameFancyPet fancyPet, - @RequestParam String id) { - throw new UnsupportedOperationException(); - } - - @ResponseBody - public List methodToTestOrdering(@RequestParam String id) { - throw new UnsupportedOperationException(); - } - - public enum BusinessType { - PRODUCT(1), - SERVICE(2); - private int value; - - BusinessType(int value) { - this.value = value; - } - - public int getValue() { - return value; - } - } - - public class CustomClass { - } - - public class MethodsWithSameName { - public ResponseEntity methodToTest( - Integer integer, - Parent child) { - return null; - } - - public void methodToTest( - Integer integer, - Child child) { - throw new UnsupportedOperationException(); - } - - } - - public class MethodResolutionToDemonstrate1241 { - public DTO[] loadDetails(String id) { - return null; - } - - public DTO[] loadDetails( - String id, - Date since) { - return null; - } - } - - public class DTO { - - } - - class Parent { - - } - - class Child extends Parent { - - } -} \ No newline at end of file diff --git a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/DummyClassWithRequestMapping.java b/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/DummyClassWithRequestMapping.java deleted file mode 100644 index 677937fb5d9..00000000000 --- a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/DummyClassWithRequestMapping.java +++ /dev/null @@ -1,25 +0,0 @@ -/* - * - * Copyright 2017-2018 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ -package springfox.documentation.spring.web.dummy; - -import org.springframework.web.bind.annotation.RequestMapping; - -@RequestMapping("/dummy") -public class DummyClassWithRequestMapping { -} diff --git a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/DummyClassWithRequestMappingWithMultipleMappings.java b/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/DummyClassWithRequestMappingWithMultipleMappings.java deleted file mode 100644 index b7ea24b1d77..00000000000 --- a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/DummyClassWithRequestMappingWithMultipleMappings.java +++ /dev/null @@ -1,25 +0,0 @@ -/* - * - * Copyright 2017-2019 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ -package springfox.documentation.spring.web.dummy; - -import org.springframework.web.bind.annotation.RequestMapping; - -@RequestMapping({"dummy", "/dummy2"}) -public class DummyClassWithRequestMappingWithMultipleMappings { -} diff --git a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/DummyClassWithRequestMappingWithoutForwardSlash.java b/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/DummyClassWithRequestMappingWithoutForwardSlash.java deleted file mode 100644 index e531dc28942..00000000000 --- a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/DummyClassWithRequestMappingWithoutForwardSlash.java +++ /dev/null @@ -1,25 +0,0 @@ -/* - * - * Copyright 2017-2019 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ -package springfox.documentation.spring.web.dummy; - -import org.springframework.web.bind.annotation.RequestMapping; - -@RequestMapping("dummy") -public class DummyClassWithRequestMappingWithoutForwardSlash { -} diff --git a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/DummyController.java b/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/DummyController.java deleted file mode 100644 index 3abb807e889..00000000000 --- a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/DummyController.java +++ /dev/null @@ -1,32 +0,0 @@ -/* - * - * Copyright 2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.spring.web.dummy; - -import io.swagger.annotations.Api; -import org.springframework.stereotype.Controller; - -@Controller -@Api(value = "Group name", position = 2) -public class DummyController { - - public void dummyMethod() { - //just a dummy method for testing - } -} diff --git a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/DummyControllerWithApiDescription.java b/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/DummyControllerWithApiDescription.java deleted file mode 100644 index f74f872bce2..00000000000 --- a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/DummyControllerWithApiDescription.java +++ /dev/null @@ -1,31 +0,0 @@ -/* - * - * Copyright 2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.spring.web.dummy; - -import io.swagger.annotations.Api; -import org.springframework.stereotype.Controller; - -@Controller -@Api(value = "Group name", description = "Dummy Controller Description", position = 2) -public class DummyControllerWithApiDescription { - public void dummyMethod() { - - } -} \ No newline at end of file diff --git a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/DummyControllerWithResourcePath.java b/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/DummyControllerWithResourcePath.java deleted file mode 100644 index 17f61c0840e..00000000000 --- a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/DummyControllerWithResourcePath.java +++ /dev/null @@ -1,31 +0,0 @@ -/* - * - * Copyright 2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.spring.web.dummy; - -import io.swagger.annotations.Api; -import org.springframework.web.bind.annotation.RequestMapping; - -@Api -@RequestMapping(value = "/resource-path") -public class DummyControllerWithResourcePath { - public void dummyMethod() { - - } -} \ No newline at end of file diff --git a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/DummyControllerWithTags.java b/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/DummyControllerWithTags.java deleted file mode 100644 index 1284c4f43af..00000000000 --- a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/DummyControllerWithTags.java +++ /dev/null @@ -1,30 +0,0 @@ -/* - * - * Copyright 2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ -package springfox.documentation.spring.web.dummy; - -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiOperation; - -@Api(tags = {"Tag1", "Tag2"}) -public class DummyControllerWithTags { - @ApiOperation(value = "dummyMethod", tags = {"Tag3", "Tag4"}) - public void dummyMethod() { - // empty method - } -} diff --git a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/DummyDeprecatedController.java b/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/DummyDeprecatedController.java deleted file mode 100644 index 4cf7fc2c7a0..00000000000 --- a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/DummyDeprecatedController.java +++ /dev/null @@ -1,31 +0,0 @@ -/* - * - * Copyright 2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.spring.web.dummy; - -import org.springframework.stereotype.Controller; - -@Controller -@Deprecated -public class DummyDeprecatedController { - - public void dummyMethod() { - - } -} diff --git a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/DummyModels.java b/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/DummyModels.java deleted file mode 100644 index 77b8f318049..00000000000 --- a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/DummyModels.java +++ /dev/null @@ -1,147 +0,0 @@ -/* - * - * Copyright 2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.spring.web.dummy; - -import com.fasterxml.jackson.annotation.JsonIgnore; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; - -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -public class DummyModels { - - public class BusinessModel { - private String name; - private String numEmployees; - - public BusinessModel() { - } - - public String getNumEmployees() { - return numEmployees; - } - - public void setNumEmployees(String numEmployees) { - this.numEmployees = numEmployees; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - } - - public class AnnotatedBusinessModel { -// @ApiModelProperty(value = "The name of this business", required = true) - private String name; - // @ApiModelProperty(value = "Total number of current employees") - private String numEmployees; - - @ApiModelProperty(value = "The name of this business", required = true) - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - @ApiModelProperty(value = "Total number of current employees") - public String getNumEmployees() { - return numEmployees; - } - - public void setNumEmployees(String numEmployees) { - this.numEmployees = numEmployees; - } - } - - @ApiModel(value = "AlternateBusinessModelName", description = "Swagger annotated model") - public class NamedBusinessModel extends BusinessModel { - } - - public class CorporationModel extends BusinessModel { - } - - public class Paginated { - - } - - public class FunkyBusiness { - private String id; - private String name; - - public String getId() { - return id; - } - - public void setId(String id) { - this.id = id; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - } - - public class ModelWithSerializeOnlyProperty { - private String alwaysVisible; - @JsonIgnore - private Long visibleForSerialize; - - public String getAlwaysVisible() { - return alwaysVisible; - } - - - public void setAlwaysVisible(String alwaysVisible) { - this.alwaysVisible = alwaysVisible; - } - - @JsonProperty - @JsonInclude - public Long getVisibleForSerialize() { - return visibleForSerialize; - } - - @JsonIgnore - public void setVisibleForSerialize(Long visibleForSerialize) { - this.visibleForSerialize = visibleForSerialize; - } - } - - @Target(ElementType.PARAMETER) - @Retention(RetentionPolicy.RUNTIME) - public @interface Ignorable { - } - -} diff --git a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/DummyRequestMappingHandlerAdapter.java b/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/DummyRequestMappingHandlerAdapter.java deleted file mode 100644 index 9052be204ba..00000000000 --- a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/DummyRequestMappingHandlerAdapter.java +++ /dev/null @@ -1,25 +0,0 @@ -/* - * - * Copyright 2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.spring.web.dummy; - -import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter; - -public class DummyRequestMappingHandlerAdapter extends RequestMappingHandlerAdapter { -} diff --git a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/FancyPet.java b/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/FancyPet.java deleted file mode 100644 index 4e1dba249e0..00000000000 --- a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/FancyPet.java +++ /dev/null @@ -1,34 +0,0 @@ -/* - * - * Copyright 2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.spring.web.dummy; - -import java.util.List; - -public class FancyPet extends Pet { - private List categories; - - public List getCategories() { - return categories; - } - - public void setCategories(List categories) { - this.categories = categories; - } -} diff --git a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/ModelWithSameNameClasses.java b/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/ModelWithSameNameClasses.java deleted file mode 100644 index 40f48c8c8fb..00000000000 --- a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/ModelWithSameNameClasses.java +++ /dev/null @@ -1,98 +0,0 @@ -/* - * - * Copyright 2017 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.spring.web.dummy; - -import java.util.List; -import java.util.Map; - -public class ModelWithSameNameClasses { - - private FancyPet fancyPet; - - private SameFancyPet moreFancyPet; - - private List fancyPets; - - private Map fancyPetsMap; - - private List>> crazyFancyPets; - - private List>> weirdFancyPets; - - private Map>> madFancyPets; - - public FancyPet getFancyPet() { - return fancyPet; - } - - public void setFancyPet(FancyPet fancyPet) { - this.fancyPet = fancyPet; - } - - public SameFancyPet getMoreFancyPet() { - return moreFancyPet; - } - - public void setMoreFancyPet(SameFancyPet moreFancyPet) { - this.moreFancyPet = moreFancyPet; - } - - public List getFancyPets() { - return fancyPets; - } - - public void setFancyPets(List fancyPets) { - this.fancyPets = fancyPets; - } - - public Map getFancyPetsMap() { - return fancyPetsMap; - } - - public void setFancyPetsMap(Map fancyPetsMap) { - this.fancyPetsMap = fancyPetsMap; - } - - public List>> getCrazyFancyPets() { - return crazyFancyPets; - } - - public void setCrazyFancyPets(List>> crazyFancyPets) { - this.crazyFancyPets = crazyFancyPets; - } - - public List>> getWeirdFancyPets() { - return weirdFancyPets; - } - - public void setWeirdFancyPets( - List>> weirdFancyPets) { - this.weirdFancyPets = weirdFancyPets; - } - - public Map>> getMadFancyPets() { - return madFancyPets; - } - - public void setMadFancyPets( - Map>> madFancyPets) { - this.madFancyPets = madFancyPets; - } -} diff --git a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/Person.java b/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/Person.java deleted file mode 100644 index 46b3125e343..00000000000 --- a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/Person.java +++ /dev/null @@ -1,83 +0,0 @@ -/* - * - * Copyright 2017-2019 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ -package springfox.documentation.spring.web.dummy; - -import java.util.List; - -public class Person { - - private long id; - - private String firstName; - private String lastName; - - private Address address; - - private Category category; - - private List tags; - - public String getFirstName() { - return firstName; - } - - public void setFirstName(String firstName) { - this.firstName = firstName; - } - - public String getLastName() { - return lastName; - } - - public void setLastName(String lastName) { - this.lastName = lastName; - } - - public long getId() { - return id; - } - - public void setId(long id) { - this.id = id; - } - - public Address getAddress() { - return address; - } - - public void setAddress(Address address) { - this.address = address; - } - - public Category getCategory() { - return category; - } - - public void setCategory(Category category) { - this.category = category; - } - - public List getTags() { - return tags; - } - - public void setTags(List tags) { - this.tags = tags; - } -} \ No newline at end of file diff --git a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/Pet.java b/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/Pet.java deleted file mode 100644 index 849dd68998b..00000000000 --- a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/Pet.java +++ /dev/null @@ -1,50 +0,0 @@ -/* - * - * Copyright 2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.spring.web.dummy; - -public class Pet { - private String id; - private String name; - private int age; - - public String getId() { - return id; - } - - public void setId(String id) { - this.id = id; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public int getAge() { - return age; - } - - public void setAge(int age) { - this.age = age; - } -} diff --git a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/ResponseExampleTestController.java b/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/ResponseExampleTestController.java deleted file mode 100644 index 1985931c589..00000000000 --- a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/ResponseExampleTestController.java +++ /dev/null @@ -1,71 +0,0 @@ -/* - * - * Copyright 2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ -package springfox.documentation.spring.web.dummy; - -import io.swagger.annotations.ApiOperation; -import io.swagger.annotations.ApiResponse; -import io.swagger.annotations.ApiResponses; -import io.swagger.annotations.Example; -import io.swagger.annotations.ExampleProperty; - -public class ResponseExampleTestController { - - @ApiOperation(value = "operationWithOneExample") - @ApiResponses(value = {@ApiResponse(code = 200, message = "")}) - public void operationWithNoExamples() { - // An endpoint with no Examples - } - - @ApiOperation(value = "operationWithOneExample") - @ApiResponses(value = - { - @ApiResponse(code = 200, message = "", examples = @Example( - value = @ExampleProperty( - value = "value", mediaType = "mediaType")))}) - public void operationWithOneExample() { - // An endpoint with one Example - } - - @ApiOperation(value = "operationWithTwoExamples") - @ApiResponses(value = - { - @ApiResponse(code = 200, message = "", examples = @Example( - value = { - @ExampleProperty( - value = "value1", mediaType = "mediaType1"), - @ExampleProperty( - value = "value2", mediaType = "mediaType2")}))}) - public void operationWithTwoExamples() { - // An endpoint with two Examples - } - - @ApiOperation(value = "operationWithEmptyExample") - @ApiResponses(value = - { - @ApiResponse(code = 200, message = "", examples = @Example( - value = { - @ExampleProperty( - value = "value1", mediaType = "mediaType1"), - @ExampleProperty( - value = "", mediaType = "mediaType2")}))}) - public void operationWithEmptyExample() { - // An endpoint with an Example that has an empty value - } - -} diff --git a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/ResponseHeaderTestController.java b/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/ResponseHeaderTestController.java deleted file mode 100644 index 4f64b0b44cd..00000000000 --- a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/ResponseHeaderTestController.java +++ /dev/null @@ -1,109 +0,0 @@ -/* - * - * Copyright 2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ -package springfox.documentation.spring.web.dummy; - -import io.swagger.annotations.ApiOperation; -import io.swagger.annotations.ApiResponse; -import io.swagger.annotations.ApiResponses; -import io.swagger.annotations.ResponseHeader; - -public class ResponseHeaderTestController { - - public void noAnnotationHeaders() { - } - - @ApiOperation(value = "operationHeadersOnly") - @ApiResponses(value = - { - @ApiResponse(code = 200, message = "") - } - ) - public void defaultWithBoth() { - } - - @ApiOperation(value = "operationHeadersOnly", - responseHeaders = - { - @ResponseHeader(name = "header1", response = String.class) - } - ) - public void operationHeadersOnly() { - } - - @ApiOperation(value = "operationHeadersOnly", - responseHeaders = - { - @ResponseHeader(name = "header1", response = String.class, responseContainer = "List") - } - ) - public void operationHeadersOnlyCollection() { - } - - @ApiResponses(value = - { - @ApiResponse( - code = 200, - message = "", - responseHeaders = { - @ResponseHeader(name = "header1", response = String.class) - }) - } - ) - public void responseHeadersOnly() { - } - - @ApiOperation(value = "operationHeadersOnly", - responseHeaders = - { - @ResponseHeader(name = "header1", response = String.class) - } - ) - @ApiResponses(value = - { - @ApiResponse( - code = 200, - message = "", - responseHeaders = { - @ResponseHeader(name = "header1", response = Integer.class) - }) - } - ) - public void bothWithOverride() { - } - - @ApiOperation(value = "operationHeadersOnly", - responseHeaders = - { - @ResponseHeader(name = "header1", response = String.class) - } - ) - @ApiResponses(value = - { - @ApiResponse( - code = 200, - message = "", - responseHeaders = { - @ResponseHeader(name = "header2", response = Integer.class) - }) - } - ) - public void bothWithoutOverride() { - } - -} diff --git a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/RestError.java b/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/RestError.java deleted file mode 100644 index 84fee72a26c..00000000000 --- a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/RestError.java +++ /dev/null @@ -1,36 +0,0 @@ -/* - * - * Copyright 2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.spring.web.dummy; - -public class RestError { - private String message; - - public RestError() { - this(""); - } - - public RestError(String message) { - this.message = message; - } - - public String getMessage() { - return message; - } -} diff --git a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/SameCategory.java b/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/SameCategory.java deleted file mode 100644 index 8911ea5fc5c..00000000000 --- a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/SameCategory.java +++ /dev/null @@ -1,60 +0,0 @@ -/* - * - * Copyright 2017 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.spring.web.dummy; - -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.JsonProperty.Access; -import io.swagger.annotations.ApiModelProperty; - -public class SameCategory extends Category { - - @ApiModelProperty(value = "Id field", required = true) - private Integer id; - - @ApiModelProperty(value = "Type field", readOnly = true) - private String type; - - public SameCategory( - String name, - Integer id, - String type) { - super(name); - this.id = id; - this.type = type; - } - - @JsonProperty(value = "_id", access = Access.WRITE_ONLY) - public Integer getId() { - return id; - } - - public void setId(Integer id) { - this.id = id; - } - - @JsonProperty(value = "_type", access = Access.READ_ONLY) - public String getType() { - return type; - } - - public void setType(String type) { - this.type = type; - } -} \ No newline at end of file diff --git a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/SameFancyPet.java b/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/SameFancyPet.java deleted file mode 100644 index 41cf777b39c..00000000000 --- a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/SameFancyPet.java +++ /dev/null @@ -1,33 +0,0 @@ -/* - * - * Copyright 2017 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.spring.web.dummy; - -public class SameFancyPet extends SamePet { - - private SameCategory extendedCategory; - - public SameCategory getExtendedCategory() { - return extendedCategory; - } - - public void setExtendedCategory(SameCategory extendedCategories) { - this.extendedCategory = extendedCategories; - } -} \ No newline at end of file diff --git a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/SamePet.java b/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/SamePet.java deleted file mode 100644 index 3dfd00066a4..00000000000 --- a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/SamePet.java +++ /dev/null @@ -1,73 +0,0 @@ -/* - * - * Copyright 2017 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.spring.web.dummy; - -import com.fasterxml.jackson.annotation.JsonIgnore; -import com.fasterxml.jackson.annotation.JsonProperty; - -public class SamePet { - private String id; - private String name; - private int age; - private String color; - private Double weight; - - public String getId() { - return id; - } - - public void setId(String id) { - this.id = id; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public int getAge() { - return age; - } - - public void setAge(int age) { - this.age = age; - } - - public String getColor() { - return color; - } - - public void setColor(String color) { - this.color = color; - } - - @JsonIgnore - public Double getWeight() { - return weight; - } - - @JsonProperty("pet_weight") - public void setWeight(Double weight) { - this.weight = weight; - } -} \ No newline at end of file diff --git a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/Tag.java b/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/Tag.java deleted file mode 100644 index 61a4c7e0deb..00000000000 --- a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/Tag.java +++ /dev/null @@ -1,53 +0,0 @@ -/* - * - * Copyright 2017-2019 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ -package springfox.documentation.spring.web.dummy; - -import java.util.List; - -public class Tag { - private long id; - - private String name; - - private List people; - - public long getId() { - return id; - } - - public void setId(long id) { - this.id = id; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public List getPeople() { - return people; - } - - public void setPeople(List people) { - this.people = people; - } -} diff --git a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/ToReplaceWithString.java b/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/ToReplaceWithString.java deleted file mode 100644 index 62e971fd637..00000000000 --- a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/ToReplaceWithString.java +++ /dev/null @@ -1,23 +0,0 @@ -/* - * - * Copyright 2017-2019 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ -package springfox.documentation.spring.web.dummy; - -public class ToReplaceWithString { - -} diff --git a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/controllers/AbstractController.java b/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/controllers/AbstractController.java deleted file mode 100644 index d7f39143ea9..00000000000 --- a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/controllers/AbstractController.java +++ /dev/null @@ -1,49 +0,0 @@ -/* - * - * Copyright 2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.spring.web.dummy.controllers; - -import io.swagger.annotations.ApiResponse; -import io.swagger.annotations.ApiResponses; -import org.springframework.hateoas.RepresentationModel; -import org.springframework.http.HttpEntity; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestMethod; - -public abstract class AbstractController { - - @RequestMapping(value = "/create-t", method = RequestMethod.PUT) - public void create(@RequestBody T toCreate) { - throw new UnsupportedOperationException(); - } - - @RequestMapping(value = "/get-t/{id}", method = RequestMethod.GET) - @ApiResponses(value = {@ApiResponse(code = 405, message = "Invalid input")}) - public T get(@PathVariable("id") ID id) { - throw new UnsupportedOperationException(); - } - - @RequestMapping(value = "/delete-t/{id}", method = RequestMethod.DELETE) - @ApiResponses(value = {@ApiResponse(code = 405, message = "Invalid input")}) - public HttpEntity delete(@PathVariable("id") ID id) { - throw new UnsupportedOperationException(); - } -} diff --git a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/controllers/AbstractPetService.java b/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/controllers/AbstractPetService.java deleted file mode 100644 index 32878630512..00000000000 --- a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/controllers/AbstractPetService.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * - * Copyright 2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.spring.web.dummy.controllers; - -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestMethod; -import org.springframework.web.bind.annotation.ResponseBody; -import springfox.documentation.spring.web.dummy.models.Pet; - -public abstract class AbstractPetService { - - // some dependency here - // some crud here - // e.g. - @RequestMapping(method = RequestMethod.POST) - @ResponseBody - public int createObject(@RequestBody T object) { - // do some logic here - return 1; - } -} - diff --git a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/controllers/BugsController.java b/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/controllers/BugsController.java deleted file mode 100644 index 3d7ee74648e..00000000000 --- a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/controllers/BugsController.java +++ /dev/null @@ -1,1096 +0,0 @@ -/* - * - * Copyright 2015-2019 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ -package springfox.documentation.spring.web.dummy.controllers; - -import com.fasterxml.jackson.annotation.JsonCreator; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.JsonUnwrapped; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiImplicitParam; -import io.swagger.annotations.ApiImplicitParams; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import io.swagger.annotations.ApiOperation; -import io.swagger.annotations.ApiParam; -import io.swagger.annotations.ApiResponse; -import io.swagger.annotations.ApiResponses; -import io.swagger.annotations.Authorization; -import io.swagger.annotations.AuthorizationScope; -import org.springframework.hateoas.EntityModel; -import org.springframework.http.MediaType; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.ModelAttribute; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestMethod; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RequestPart; -import org.springframework.web.bind.annotation.RestController; -import org.springframework.web.multipart.MultipartFile; -import springfox.documentation.annotations.ApiIgnore; -import springfox.documentation.spring.web.dummy.models.Bug1749; -import springfox.documentation.spring.web.dummy.models.EHDTOApplicatorUnits; -import springfox.documentation.spring.web.dummy.models.EnumType; -import springfox.documentation.spring.web.dummy.models.Example; -import springfox.documentation.spring.web.dummy.models.LanguageResponse; -import springfox.documentation.spring.web.dummy.models.Response; - -import jakarta.servlet.http.HttpServletResponse; -import javax.validation.Valid; -import javax.validation.constraints.NotNull; -import javax.validation.constraints.Pattern; -import javax.validation.constraints.Size; -import javax.xml.bind.annotation.XmlAttribute; -import javax.xml.bind.annotation.XmlElement; -import javax.xml.bind.annotation.XmlType; -import java.beans.ConstructorProperties; -import java.net.MalformedURLException; -import java.net.URI; -import java.net.URL; -import java.nio.ByteBuffer; -import java.sql.Date; -import java.util.List; -import java.util.Map; -import java.util.Optional; -import java.util.Set; -import java.util.UUID; - -import static org.springframework.http.MediaType.*; -import static org.springframework.web.bind.annotation.RequestMethod.*; - -@Api(tags = "Bugs") -@RestController -@RequestMapping("/bugs") -public class BugsController { - @RequestMapping(value = "1306", method = POST) - public ResponseEntity> bug1306(@RequestParam Map paramMap) { - return ResponseEntity.ok(null); - } - - @ApiImplicitParams( - @ApiImplicitParam(name = "custom-header", - dataTypeClass = String.class, - allowMultiple = true, - paramType = "header") - ) - @RequestMapping(value = "1209", method = POST) - public ResponseEntity bug1209() { - return ResponseEntity.ok(""); - } - - @RequestMapping(value = "1162", method = POST) - public ResponseEntity bug1162() { - return ResponseEntity.ok(new Date(new java.util.Date().getTime())); - } - - @RequestMapping(value = "1376-bare", method = POST) - public URL issue1376Bare() throws MalformedURLException { - return new URL("http://example.org"); - } - - @RequestMapping(value = "1376-property", method = POST) - public Bug1376 issue1376Property() throws MalformedURLException { - return new Bug1376(new URL("http://example.org")); - } - - @RequestMapping(value = "1376-input-bare", method = POST) - public void issue1376Input(URL url) throws MalformedURLException { - } - - @RequestMapping(value = "1376-input-property", method = POST) - public void issue1376Input(Bug1376 bug) throws MalformedURLException { - } - - @RequestMapping(value = "1420", method = GET) - @ApiOperation(tags = { "foo" }, value = "issue1420") - public String issue1420() { - return "1420"; - } - - @RequestMapping(value = "1440", method = GET) - public EntityModel issue1440() { - return EntityModel.of("1420"); - } - - @RequestMapping(value = "1475", method = GET) - public Map> mapOfLists() { - throw new UnsupportedOperationException(); - } - - @RequestMapping(value = "1475-example", method = GET) - public Map> mapOfListOfExample() { - throw new UnsupportedOperationException(); - } - - @RequestMapping(value = "1605", method = GET) - public byte[] byteArrayResponse() { - throw new UnsupportedOperationException(); - } - - @RequestMapping(value = "1676", method = GET) - public void apiModelProperty(@RequestBody Bug1676 value) { - throw new UnsupportedOperationException(); - } - - @RequestMapping(value = "1632", method = GET) - public void fileCustomType(@RequestBody File value) { - throw new UnsupportedOperationException(); - } - - @RequestMapping(value = "1632s", method = GET) - public void filesCustomType(@RequestBody List values) { - throw new UnsupportedOperationException(); - } - - @RequestMapping(value = "1697", method = GET) - public void payloadWithByteBuffer(@RequestBody Bug1697 body) { - throw new UnsupportedOperationException(); - } - - @RequestMapping(value = "1627", method = GET) - public void bug1627(@RequestBody Bug1627 body) { - throw new UnsupportedOperationException(); - } - - @RequestMapping(value = "2081", method = GET) - public void bug2081(Bug2081 criteria) { - throw new UnsupportedOperationException(); - } - - @ApiOperation(value = "Remove an apple from a user", notes = "Remove an apple from a user. You must specify the " - + "user name and the apple name.", response = Void.class, consumes = "application/json, application/xml", - produces = "application/json, application/xml") - @ApiResponses({ @ApiResponse(code = 200, message = "The apple is removed") }) - @RequestMapping(value = "1722", method = POST) - public void bug1722(@RequestBody String test) { - } - - @RequestMapping(value = "1734", method = GET) - public void bug1734( - @ApiParam(name = "offset", value = "The value of offset", defaultValue = "0") - @RequestParam(value = "offset", defaultValue = "0", required = false) - int offset) { - throw new UnsupportedOperationException(); - } - - @RequestMapping(value = "1740", method = GET) - public Bug1740 bug1740() { - return new Bug1740(); - } - - @ApiResponses(value = { - @ApiResponse(code = 200, - message = "list of ids", - response = String.class), - @ApiResponse(code = 204, - message = "no ids found", - response = Void.class) - }) - @RequestMapping(value = "/1750a", method = GET) - public ResponseEntity bug1750a() { - throw new UnsupportedOperationException(); - } - - @ApiOperation(value = "1750b", response = String.class) - @ApiResponses(value = { - @ApiResponse(code = 200, - message = "list of ids", - response = String.class), - @ApiResponse(code = 204, - message = "no ids found", - response = Void.class) - }) - @RequestMapping(value = "/1750b", method = GET) - public ResponseEntity bug1750b() { - throw new UnsupportedOperationException(); - } - - @RequestMapping(value = "/1777", method = GET) - public ResponseEntity bug1777() { - throw new UnsupportedOperationException(); - } - - - @RequestMapping(value = "/1778", method = GET) - public ResponseEntity bug1778(TestClass testClass, TestClass2 testClass2) { - return ResponseEntity.ok().build(); - } - - @ApiOperation(value = "Retrieve all the companies") - @RequestMapping(value = "/1749", method = GET) - public List getAllPaged( - @Valid Bug1749 request, - HttpServletResponse response, - @RequestParam(required = false) String email, - @RequestParam(required = false) String companyName, - @RequestParam(required = false) Boolean like) throws Exception { - throw new UnsupportedOperationException(); - } - - @RequestMapping(value = "/1819a", method = PUT) - public void modelWithListOfEnumsAsJson(@RequestBody Model1819 model) { - } - - @RequestMapping(value = "/1819b", method = POST) - public void modelWithListOfEnumsAsModelAttribute(@ModelAttribute Model1819 model) { - } - - @GetMapping("/1864") - public void test(@Valid Model1864 req) { - - } - - @GetMapping(value = "/1841", produces = APPLICATION_ATOM_XML_VALUE) - public void method1() { - } - - @SuppressWarnings("deprecation") - @GetMapping(value = "/1841", produces = APPLICATION_JSON_UTF8_VALUE) - public void method2() { - } - - @RequestMapping(value = "/1939", - method = GET, - produces = "application/jwt") - @ApiOperation(value = "authenticate a user using a given set of " - + "credentials, producing a JWT token that may be " - + "used for future API operations if successful") - @Valid - public ResponseEntity - authenticate(@RequestParam("username") - String username, - @RequestParam("password") - String password, - @RequestParam(required = false, name = "credential-source-id") - String credentialSourceID) { - return ResponseEntity.ok("Success!"); - } - - @GetMapping(value = "/1907", produces = APPLICATION_XML_VALUE) - public void xmlPayload(@RequestBody Model1907 xml) { - } - - @RequestMapping(path = "/2114", method = PUT) - ResponseEntity bug2114( - @PathVariable(value = "siteId") UUID siteId, - @RequestParam(value = "siteSecret") UUID siteSecret, - @RequestParam(value = "xmlUrl") URI xmlUrl, - @RequestParam(value = "stripHtmlTags", required = false, defaultValue = "false") Boolean stripHtmlTags, - @RequestParam(value = "clearIndex", required = false, defaultValue = "false") Boolean clearIndex - ) { - return null; - } - - @RequestMapping(value = "/2118", method = GET) - public String bug2118(@RequestBody @ModelAttribute Example person) { - return "ok"; - } - - @RequestMapping(method = GET, path = "{propertyKey}/{environmentKey}") - public ResponseEntity getProperty( - @ApiParam(name = "propertyKey", value = "Key of the property", required = true) - @PathVariable("propertyKey") Key propertyKey, - @ApiParam(name = "environmentKey", value = "Key of the environment", required = false) - @PathVariable("environmentKey") Key environmentKey - ) { - return ResponseEntity.ok(""); - } - - @ApiOperation(value = "2107") - @GetMapping(value = "/2107/{someId}", produces = APPLICATION_JSON_VALUE) - public String getSomeById( - @ApiParam(value = "This is the description", defaultValue = "1f1f1f", required = true, name = "someId", type = - "java.lang.String") - @PathVariable("someId") Id someId) { - return ""; - } - - @RequestMapping(value = "/1894", method = POST) - public void cacheEvict1() { - - } - - @RequestMapping(value = "/1894", method = POST, consumes = APPLICATION_FORM_URLENCODED_VALUE) - public void cacheEvict2() { - - } - - @SuppressWarnings("deprecation") - @PostMapping(value = "/1887/{env}/{list-id}/emails", - produces = APPLICATION_JSON_UTF8_VALUE, - consumes = APPLICATION_JSON_UTF8_VALUE) - @ApiOperation(value = "1887 example", response = Example.class) - public ResponseEntity>> addEmailsToList( - @PathVariable String env, - @PathVariable("list-id") String listId, - @RequestBody List emails) { - return ResponseEntity.ok(null); - } - - @PostMapping(path = "/1965-form-data", consumes = "multipart/form-data") - public ResponseEntity bug1965FormData(Example sfData) { - return ResponseEntity.ok(null); - } - - @PostMapping(path = "/1965", consumes = "multipart/form-data") - public ResponseEntity bug1965( - @Valid @RequestPart(name = "sfParamMap") @RequestParam Map paramMap, - @Valid @RequestPart(name = "sfId") @RequestParam Integer sfId, - @Valid @RequestPart(name = "sfData") Example sfData, - @RequestParam(name = "file", required = false) MultipartFile supportFile) { - return ResponseEntity.ok(null); - } - - @GetMapping("/1926/filtered") - public Lang filtered(@RequestBody LangNotFilteredWrapper wrapper) { - return null; - } - - @GetMapping("/1926/not-filtered") - public Lang notFiltered(@RequestBody LangFilteredWrapper wrapper) { - return null; - } - - @ApiOperation(value = "测试RequesetParam", notes = "测试RequesetParam") - @ApiImplicitParams({ - @ApiImplicitParam(name = "date", value = "日期:2017-09-01", required = true, dataType = "String", paramType = - "path"), - @ApiImplicitParam(name = "name", value = "名称", required = false, dataType = "string") - }) - @GetMapping("/2029") - public String bug2020(@RequestParam(required = true, value = "date") String date, - @RequestParam(required = false, value = "name") String name) { - return date + name; - } - - @GetMapping(path = "/{bar}/2148") - @ApiImplicitParam(name = "bar", dataType = "long", value = "example") - ResponseEntity bug2148( - @ApiIgnore @PathVariable("bar") Example example, - @RequestParam("year") Optional year) { - - return ResponseEntity.notFound().build(); - } - - @GetMapping(path = "/2161") - ResponseEntity bug2161And2249and2469(@RequestBody Status status) { - return ResponseEntity.ok(""); - } - - @GetMapping(path = "/1881") - ResponseEntity bug1881(@RequestBody Bug1881 container) { - return ResponseEntity.ok(""); - } - - @ApiOperation(value = "Get all examples", nickname = "bug2268", notes = "Get all examples ", response = Example.class, - responseContainer = "List", authorizations = { - @Authorization(value = "user_auth", scopes = { - @AuthorizationScope(scope = "ADMIN", description = "Manage users"), - @AuthorizationScope(scope = "USER", description = "Maintain own user") - }) - }, tags = { "example" }) - @ApiResponses(value = { - @ApiResponse(code = 200, message = "Success", response = Example.class, responseContainer = "List"), - }) - @RequestMapping(value = "/2268", - produces = { "application/json" }, - method = RequestMethod.GET) - ResponseEntity> bug2268( - @ApiParam(value = "Filter the list") - @Valid - @RequestParam(value = "$filter", required = false) String filter) { - return null; - } - - @SuppressWarnings("deprecation") - @RequestMapping(value = "/bug2203", method = RequestMethod.GET, - produces = MediaType.APPLICATION_JSON_UTF8_VALUE) - public ResponseEntity> bug2203() { - return ResponseEntity.ok(null); - } - - @GetMapping("/bug1827") - public String addBook( - @ModelAttribute Book book, - @RequestParam(required = false) String[] authorIds) { - return ""; - } - - @GetMapping("/bug2282") - @ApiOperation("/bug2282") - public String bug2282(User user) { - return ""; - } - - @PostMapping(value = "/bug2230", consumes = MediaType.APPLICATION_ATOM_XML_VALUE) - @ApiOperation("/bug2230") - public String bug2230( - @RequestBody EHDTOApplicatorUnits applicatorUnits) { - return ""; - } - - @GetMapping(value = "/bug2182") - @ApiOperation("/bug2182") - public ProductVO bug2182() { - return null; - } - - @GetMapping({ "/bug2220", "/bug2220/{bar}" }) - public void bug2220(@PathVariable(value = "bar", required = false) String bar) { - } - - @ApiResponses({ - @ApiResponse(code = 404, message = "No object was found with the given ID"), - @ApiResponse(code = 200, message = "The object was deleted successfully.", - response = void.class) - }) - @GetMapping("/bug1944") - public void bug1944() { - } - - @PostMapping("/2378") - public void upperCaseField(@RequestBody UpperCasedField input) { - } - - @PostMapping("/2391") - public void bug2391(@ModelAttribute Bug2391 input) { - } - - @RequestMapping(value = "/2368", method = RequestMethod.GET) - public ResponseEntity bug2368(@ModelAttribute @Valid GenericRequest voidRequest) { - return ResponseEntity.ok(null); - } - - @PostMapping("/2479") - public void bug2479(@RequestBody Bug2479 input) { - } - - - @PostMapping("/2415") - public void bug2415(@RequestBody Bug2415 input) { - } - - @GetMapping("/2415") - public ResponseEntity bug2415( - @Pattern(regexp = "^[A-Za-z0-9]{8,16}$") - @Size(min = 8, max = 16) - @RequestParam String input) { - return ResponseEntity.ok("test"); - } - - @GetMapping("/2423") - public void bug2423(Bug2423 input) { - } - - @PostMapping("/2822") - public void bug2822(@ApiParam(example = "exampleMessage") @RequestBody String message) { - // Empty body is sufficient for testing - } - - @SuppressWarnings("VisibilityModifier") - public class Bug2423 { - public String from; - public String to; - } - - public class Bug2415 { - private String test; - - @Pattern(regexp = "^[A-Za-z0-9]{8,16}$") - @Size(min = 8, max = 16) - public String getTest() { - return test; - } - - public void setTest(String test) { - this.test = test; - } - } - - public class GenericRequest { - - @NotNull - private T parameters; - - public T getParameters() { - return parameters; - } - - public void setParameters(T parameters) { - this.parameters = parameters; - } - - } - - public class ProductVO { - private String name; - - @JsonUnwrapped(prefix = "specification_") - private Specification specification; - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public Specification getSpecification() { - return specification; - } - - public void setSpecification(Specification specification) { - this.specification = specification; - } - } - - public class Specification { - private String name; - @JsonUnwrapped(prefix = "child_") - private SpecificationChild child; - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public SpecificationChild getChild() { - return child; - } - - public void setChild(SpecificationChild child) { - this.child = child; - } - } - - public class SpecificationChild { - private String name; - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - } - - public class User { - private Office office; - - public Office getOffice() { - return office; - } - - public void setOffice(Office office) { - this.office = office; - } - } - - public class Office extends TreeEntity { - } - - public class TreeEntity { - // private T parent ; - private User user; - - public User getUser() { - return user; - } - - public void setUser(User user) { - this.user = user; - } - } - - public class Book { - private Long id; - private String name; - private Set authors; - - public Long getId() { - return id; - } - - public void setId(Long id) { - this.id = id; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public Set getAuthors() { - return authors; - } - - public void setAuthors(Set authors) { - this.authors = authors; - } - } - - public class Author { - private Long id; - private String name; - private List books; - - public Long getId() { - return id; - } - - public String getName() { - return name; - } - - public List getBooks() { - return books; - } - } - - public enum Lang { - zh, en - } - - @XmlType(name = "model1907", namespace = "urn:bugs") - public static class Model1907 { - - @NotNull - @XmlAttribute - private String somename; - @NotNull - @XmlElement - private Example example; - - public Model1907() { - } - - public String getSomename() { - return somename; - } - - public void setSomename(String somename) { - this.somename = somename; - } - - public Example getExample() { - return example; - } - - public void setExample(Example example) { - this.example = example; - } - } - - public static class Bug2081Filter { - private String importantField; - - public String getImportantField() { - return importantField; - } - - public void setImportantField(String importantField) { - this.importantField = importantField; - } - } - - public static class Bug2081 { - private Bug2081Filter a; - private Bug2081Filter b; - - public Bug2081Filter getA() { - return a; - } - - public void setA(Bug2081Filter a) { - this.a = a; - } - - public Bug2081Filter getB() { - return b; - } - - public void setB(Bug2081Filter b) { - this.b = b; - } - } - - public static class Bug1881 { - private Map data1; - private Map> data2; - - public Map getData1() { - return data1; - } - - public void setData1(Map data1) { - this.data1 = data1; - } - - public Map> getData2() { - return data2; - } - - public void setData2(Map> data2) { - this.data2 = data2; - } - } - - @JsonInclude(JsonInclude.Include.NON_NULL) - public class Status { - @ApiModelProperty(example = "false") - private final Boolean enabled; - @ApiModelProperty(example = "'1235'") - private final String integerString; - @ApiModelProperty(example = "'[test] n/a'") - private final String bug2469; - - @JsonProperty("bug_1964") - @ApiModelProperty(required = true) - private boolean bug1964; - - @JsonCreator - Status( - @JsonProperty("enabled") Boolean enabled, - @JsonProperty("integerString") String integerString, - @JsonProperty("bug2469") String bug2469) { - this.enabled = enabled; - this.integerString = integerString; - this.bug2469 = bug2469; - } - - @JsonProperty("enabled") - public Boolean isEnabled() { - return enabled; - } - - @JsonProperty("integerString") - public String getIntegerString() { - return integerString; - } - - @JsonProperty("bug_1964") - @ApiModelProperty(required = true) - public boolean isBug1964() { - return bug1964; - } - - public String getBug2469() { - return bug2469; - } - } - - public class LangNotFilteredWrapper { - private Lang lang; - - public LangNotFilteredWrapper(Lang lang) { - this.lang = lang; - } - - public Lang getLang() { - return lang; - } - } - - public class LangFilteredWrapper { - private Lang lang; - - @ConstructorProperties({ "lang" }) - public LangFilteredWrapper(Lang lang) { - this.lang = lang; - } - - public Lang getLang() { - return lang; - } - } - - public class Id { - - private final Long id; - - public Id(Long id) { - this.id = id; - } - - public Long getId() { - return id; - } - } - - public class Key { - - // if enabled, name will be shown @ApiModelProperty(value = "my description") - private final String key; - - @JsonCreator - public Key(@JsonProperty("key") String keyContent) { - key = keyContent; - } - - public String getKey() { - return key; - } - } - - public class Model1864 { - @NotNull - private String somename; - - public String getSomename() { - return somename; - } - - public void setSomename(String somename) { - this.somename = somename; - } - } - - public class Model1819 { - - private List enumTypes; - - public List getEnumTypes() { - return enumTypes; - } - - public void setEnumTypes(List enumTypes) { - this.enumTypes = enumTypes; - } - } - - class TestClass { - - private String s; - - public String getS() { - return s; - } - - public void setS(String s) { - this.s = s; - } - } - - class TestClass2 { - - private String e; - - public String getE() { - return e; - } - - public void setE(String e) { - this.e = e; - } - } - - @ApiModel(description = "Test 1777") - public class Bug1777 { - @ApiModelProperty(value = "经度", required = true) - private Double longitude; - - public Double getLongitude() { - return longitude; - } - - public void setLongitude(Double longitude) { - this.longitude = longitude; - } - } - - public class Bug1627 { - private String name; - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - } - - class Bug1697 { - private ByteBuffer bar; - - public ByteBuffer getBar() { - return bar; - } - - public void setBar(ByteBuffer bar) { - this.bar = bar; - } - } - - class File { - private String name; - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - } - - class Bug1676 { - @ApiModelProperty(value = "Horizontal position", required = false, example = "200") - private float xAxis; - @ApiModelProperty(value = "Vertical position", required = false, example = "500") - private float yAxis; - - public float getxAxis() { - return xAxis; - } - - public void setxAxis(float xAxis) { - this.xAxis = xAxis; - } - - public float getyAxis() { - return yAxis; - } - - public void setyAxis(float yAxis) { - this.yAxis = yAxis; - } - } - - class Bug1376 { - - private URL url; - - Bug1376(URL url) { - this.url = url; - } - - public URL getUrl() { - return url; - } - - public void setUrl(URL url) { - this.url = url; - } - - } - - public class LinkAlternate { - private String href; - - public String getHref() { - return href; - } - - public void setHref(String href) { - this.href = href; - } - } - - public class Bug1740 { - private String value; - - @JsonUnwrapped - private Bug1740Inner inner; - - public String getValue() { - return value; - } - - public Bug1740Inner getInner() { - return inner; - } - - private final class Bug1740Inner { - private String innerValue; - - public String getInnerValue() { - return innerValue; - } - } - } - - private class UpperCasedField { - @ApiModelProperty(name = "AGE", value = "the age of person") - @SuppressWarnings("MemberName") - private Integer AGE; - - @SuppressWarnings({ "MemberName", "VisibilityModifier" }) - public Integer YEAR; - - public Integer getAGE() { - return AGE; - } - - @SuppressWarnings("ParameterName") - public void setAGE(Integer AGE) { - this.AGE = AGE; - } - } - - public class Bug2391 { - @ApiModelProperty(name = "from_country_id", position = 1, required = true) - private Long fromCountryId; - - @ModelAttribute("from_country_id") - public Long getFromCountryId() { - return fromCountryId; - } - - public void setFromCountryId(Long fromCountryId) { - this.fromCountryId = fromCountryId; - } - } - - private class Bug2479 { - @ApiModelProperty("First") - private Example first; - - @ApiModelProperty("Second") - private Example second; - - public Example getFirst() { - return first; - } - - public void setFirst(Example first) { - this.first = first; - } - - public Example getSecond() { - return second; - } - - public void setSecond(Example second) { - this.second = second; - } - } -} diff --git a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/controllers/BusinessService.java b/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/controllers/BusinessService.java deleted file mode 100644 index d608a7fc38f..00000000000 --- a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/controllers/BusinessService.java +++ /dev/null @@ -1,102 +0,0 @@ -/* - * - * Copyright 2015-2019 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.spring.web.dummy.controllers; - -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiOperation; -import io.swagger.annotations.ApiParam; -import io.swagger.annotations.ApiResponse; -import io.swagger.annotations.ApiResponses; -import io.swagger.annotations.Authorization; -import io.swagger.annotations.AuthorizationScope; -import org.springframework.http.HttpStatus; -import org.springframework.http.MediaType; -import org.springframework.http.ResponseEntity; -import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestMethod; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.ResponseBody; -import springfox.documentation.spring.web.dummy.models.Business; - -import java.util.ArrayList; -import java.util.List; - -import static org.springframework.http.HttpStatus.*; -import static org.springframework.http.MediaType.*; -import static org.springframework.web.bind.annotation.RequestMethod.*; - - -@Controller -@Api(value = "/", description = "Services to demonstrate path variable resolution") -@RequestMapping(produces = {MediaType.ALL_VALUE, MediaType.APPLICATION_JSON_VALUE}, - consumes = MediaType.APPLICATION_JSON_VALUE) -public class BusinessService { - - @RequestMapping(value = "/businesses/aliased/{otherId}", method = RequestMethod.GET) - @ApiOperation(value = "Find a business by its id", nickname = "findBusinessById") - public String getAliasedPathVariable( - @ApiParam(value = "ID of business", required = true) @PathVariable("otherId") String businessId) { - return "This is only a test"; - } - - @RequestMapping(value = "/businesses/non-aliased/{businessId}", method = RequestMethod.GET) - @ApiOperation(value = "Find a business by its id", nickname = "findBusinessById", - authorizations = @Authorization(value = "oauth2", - scopes = {@AuthorizationScope(scope = "scope", description = "scope description") - })) - public String getNonAliasedPathVariable( - @ApiParam(value = "ID of business", required = true) @PathVariable("businessId") String businessId) { - return "This is only a test"; - } - - @RequestMapping(value = "/businesses/vanilla/{businessId}", method = RequestMethod.GET) - public String getVanillaPathVariable(@PathVariable String businessId) { - return "This is only a test"; - } - - @RequestMapping(value = "/businesses/responseEntity/{businessId}", method = RequestMethod.GET) - public ResponseEntity getResponseEntity(@PathVariable String businessId) { - return new ResponseEntity("This is only a test", HttpStatus.OK); - } - - @RequestMapping(value = { "/businesses/typeEcho" }, method = POST, consumes = APPLICATION_JSON_VALUE, - produces = APPLICATION_JSON_VALUE) - @ResponseBody - public ResponseEntity businessTypeEcho(@RequestBody Business.BusinessType business) { - return new ResponseEntity(Business.BusinessType.PRODUCT, OK); - } - - @RequestMapping(value = { "/businesses/demonstratesApiModelName" }, method = POST, consumes = APPLICATION_JSON_VALUE, - produces = APPLICATION_JSON_VALUE) - @ResponseBody - @ApiResponses(value = {@ApiResponse(code = 200, message = "Business", response = Business.class)}) - public String businessAsString() { - return ""; - } - - @RequestMapping(value = {"/businesses/byTypes"}, method = GET, produces = APPLICATION_JSON_VALUE) - @ResponseBody - public List businessesByCategories(@RequestParam Business.BusinessType[] types) { - return new ArrayList<>(); - } -} \ No newline at end of file diff --git a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/controllers/CommonRestController.java b/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/controllers/CommonRestController.java deleted file mode 100644 index 66a5ba1aa76..00000000000 --- a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/controllers/CommonRestController.java +++ /dev/null @@ -1,22 +0,0 @@ -/* - * - * Copyright 2017-2019 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ -package springfox.documentation.spring.web.dummy.controllers; - -public class CommonRestController { -} diff --git a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/controllers/ConcreteController.java b/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/controllers/ConcreteController.java deleted file mode 100644 index a1df5bd6b66..00000000000 --- a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/controllers/ConcreteController.java +++ /dev/null @@ -1,30 +0,0 @@ -/* - * - * Copyright 2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.spring.web.dummy.controllers; - -import org.springframework.hateoas.EntityModel; -import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.RequestMapping; -import springfox.documentation.spring.web.dummy.models.Pet; - -@Controller -@RequestMapping("/foo") -public class ConcreteController extends AbstractController, String> { -} diff --git a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/controllers/ConsumesProducesService.java b/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/controllers/ConsumesProducesService.java deleted file mode 100644 index 0fe916ac92b..00000000000 --- a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/controllers/ConsumesProducesService.java +++ /dev/null @@ -1,63 +0,0 @@ -/* - * - * Copyright 2015-2019 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.spring.web.dummy.controllers; - -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiOperation; -import org.springframework.http.MediaType; -import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.*; - -@Controller -@Api(description = "Services to demonstrate produces/consumes override behaviour on document and operation level") -@RequestMapping(path = "/consumes-produces") -public class ConsumesProducesService { - - @GetMapping("/without-operation-produces") - @ApiOperation("Does not have operation produces defined") - public String withoutOperationProduces() { - throw new UnsupportedOperationException(); - } - - @GetMapping(value = "/with-operation-produces", produces = MediaType.APPLICATION_XML_VALUE) - @ApiOperation("Does have operation produces defined") - public String withOperationProduces() { - throw new UnsupportedOperationException(); - } - - @PostMapping("/without-operation-consumes") - @ApiOperation("Does not have operation consumes defined") - public void withoutOperationConsumes(@RequestBody String test) { - throw new UnsupportedOperationException(); - } - - @PostMapping(value = "/with-operation-consumes", consumes = MediaType.APPLICATION_XML_VALUE) - @ApiOperation("Does have operation consumes defined") - public void withOperationConsumes(@RequestBody String test) { - throw new UnsupportedOperationException(); - } - - @PostMapping(value = "/with-operation-consumes-produces", consumes = MediaType.APPLICATION_XML_VALUE, produces = - MediaType.APPLICATION_XML_VALUE) - @ApiOperation("Does have operation consumes and produces defined") - public void withOperationConsumesAndProduces(@RequestBody String test) { - throw new UnsupportedOperationException(); - } -} diff --git a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/controllers/ControllerWithNoRequestMappingService.java b/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/controllers/ControllerWithNoRequestMappingService.java deleted file mode 100644 index 39bc6c82445..00000000000 --- a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/controllers/ControllerWithNoRequestMappingService.java +++ /dev/null @@ -1,38 +0,0 @@ -/* - * - * Copyright 2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.spring.web.dummy.controllers; - -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestMethod; -import org.springframework.web.util.UriComponentsBuilder; -import springfox.documentation.spring.web.dummy.models.EnumType; -import springfox.documentation.spring.web.dummy.models.Example; -import springfox.documentation.spring.web.dummy.models.NestedType; - -@Controller -public class ControllerWithNoRequestMappingService { - @RequestMapping(value = "/no-request-mapping", method = RequestMethod.GET) - public ResponseEntity exampleWithNoRequestMapping(UriComponentsBuilder builder) { - return new ResponseEntity(new Example("Hello", 1, EnumType.ONE, new NestedType("test")), HttpStatus.OK); - } -} diff --git a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/controllers/CyclicStructuresController.java b/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/controllers/CyclicStructuresController.java deleted file mode 100644 index 41aee268021..00000000000 --- a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/controllers/CyclicStructuresController.java +++ /dev/null @@ -1,57 +0,0 @@ -/* - * - * Copyright 2020 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ -package springfox.documentation.spring.web.dummy.controllers; - -import java.util.List; - -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestMethod; -import org.springframework.web.bind.annotation.RestController; - -import io.swagger.annotations.ApiResponse; -import io.swagger.annotations.ApiResponses; -import springfox.documentation.spring.web.dummy.models.City; -import springfox.documentation.spring.web.dummy.models.Country; -import springfox.documentation.spring.web.dummy.models.District; -import springfox.documentation.spring.web.dummy.models.House; -import springfox.documentation.spring.web.dummy.models.Region; -import springfox.documentation.spring.web.dummy.models.Street; - -@RestController -@RequestMapping("/cyclic-structures") -public class CyclicStructuresController { - - @RequestMapping(value = "/create-street", method = RequestMethod.PUT) - public List createCyclicStreet(@RequestBody Street street) { - throw new UnsupportedOperationException(); - } - - @RequestMapping(value = "/create-city", method = RequestMethod.PUT) - public List createCyclicCity(@RequestBody City city) { - throw new UnsupportedOperationException(); - } - - @RequestMapping(value = "/create-country", method = RequestMethod.PUT) - @ApiResponses(value = { @ApiResponse(code = 405, message = "Invalid input") }) - public List createCyclicCountry(@RequestBody Country country) { - throw new UnsupportedOperationException(); - } - -} diff --git a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/controllers/EnumService.java b/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/controllers/EnumService.java deleted file mode 100644 index 4b789c529b0..00000000000 --- a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/controllers/EnumService.java +++ /dev/null @@ -1,64 +0,0 @@ -/* - * - * Copyright 2015-2019 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.spring.web.dummy.controllers; - - -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiOperation; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestMethod; -import springfox.documentation.spring.web.dummy.models.EnumCollection; -import springfox.documentation.spring.web.dummy.models.EnumType; - -import java.util.Set; -import java.util.stream.Stream; - -import static java.util.Collections.*; -import static java.util.stream.Collectors.*; - -@Controller -@RequestMapping("/enums") -@Api(value = "", description = "Service that return enums") -public class EnumService { - - @RequestMapping(value = "/wrapped", method = RequestMethod.GET) - @ApiOperation(value = "Example with wrapped enum collection") - public EnumCollection getCollectionValue() { - EnumCollection result = new EnumCollection(); - result.setTypes(Stream.of(EnumType.ONE, EnumType.TWO).collect(toSet())); - return result; - } - - @RequestMapping(value = "/entity", method = RequestMethod.GET) - @ApiOperation(value = "Example with response entity single value") - public ResponseEntity getResponseEntityValue() { - return new ResponseEntity<>(EnumType.ONE, HttpStatus.OK); - } - - @RequestMapping(value = "/collection", method = RequestMethod.GET) - @ApiOperation(value = "Example with response entity collection") - public ResponseEntity> getResponseEntityCollection() { - return new ResponseEntity<>(singleton(EnumType.ONE), HttpStatus.OK); - } - -} diff --git a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/controllers/ExcludedService.java b/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/controllers/ExcludedService.java deleted file mode 100644 index f51bd2ca943..00000000000 --- a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/controllers/ExcludedService.java +++ /dev/null @@ -1,46 +0,0 @@ -/* - * - * Copyright 2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.spring.web.dummy.controllers; - -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiParam; -import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestMethod; -import springfox.documentation.annotations.ApiIgnore; -import springfox.documentation.spring.web.dummy.models.Pet; - -@Controller -@ApiIgnore -@RequestMapping("/excluded") -@Api(value = "", description = "Operations that are excluded") -public class ExcludedService { - @RequestMapping(method = RequestMethod.POST) - public void someExcludedOperation( - @ApiParam(value = "Pet object that needs to be added to the store", required = true) Pet pet) { - throw new RuntimeException("NotImplementedException"); - } - - @RequestMapping(value = "/another", method = RequestMethod.POST) - public void anotherExcludedOperation( - @ApiParam(value = "Pet object that needs to be added to the store", required = true) Pet pet) { - throw new RuntimeException("NotImplementedException"); - } -} diff --git a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/controllers/FancyPetService.java b/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/controllers/FancyPetService.java deleted file mode 100644 index d4c3b91757e..00000000000 --- a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/controllers/FancyPetService.java +++ /dev/null @@ -1,62 +0,0 @@ -/* - * - * Copyright 2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.spring.web.dummy.controllers; - -import io.swagger.annotations.Api; -import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestMethod; -import org.springframework.web.bind.annotation.ResponseBody; -import springfox.documentation.spring.web.dummy.models.FancyPet; -import springfox.documentation.spring.web.dummy.models.Pet; - -@Controller -@RequestMapping("/fancypets") -@Api(value = "Fancy Pet Service", description = "Operations about fancy pets") -public class FancyPetService extends AbstractPetService { - - // some subclass dependency here - // override one of superclass - @Override - @ResponseBody - public int createObject(@RequestBody FancyPet object) { - int id = super.createObject(object); - // do some logic with sub class - return id; - } - - - //Example of generic type constraint - @RequestMapping(method = RequestMethod.PUT) - public void updatePet(@RequestBody T pet) { - throw new UnsupportedOperationException(); - } - - // overload one of superclass - @ResponseBody - @RequestMapping(method = RequestMethod.POST, value = "?{someId}") - public int createObject(@RequestBody FancyPet object, @PathVariable int someId) { - int id = super.createObject(object); - // do some logic with sub class - return id; - } -} diff --git a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/controllers/FeatureDemonstrationService.java b/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/controllers/FeatureDemonstrationService.java deleted file mode 100644 index 423922f5360..00000000000 --- a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/controllers/FeatureDemonstrationService.java +++ /dev/null @@ -1,308 +0,0 @@ -/* - * - * Copyright 2016-2019 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.spring.web.dummy.controllers; - -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiImplicitParam; -import io.swagger.annotations.ApiImplicitParams; -import io.swagger.annotations.ApiOperation; -import io.swagger.annotations.ApiParam; -import io.swagger.annotations.ApiResponse; -import io.swagger.annotations.ApiResponses; -import io.swagger.annotations.ExampleProperty; -import io.swagger.annotations.Extension; -import io.swagger.annotations.ExtensionProperty; -import org.joda.time.LocalDate; -import org.springframework.http.HttpEntity; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.ModelAttribute; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestMethod; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RequestPart; -import org.springframework.web.bind.annotation.ResponseBody; -import org.springframework.web.multipart.MultipartFile; -import org.springframework.web.util.UriComponentsBuilder; -import springfox.documentation.spring.web.dummy.models.Business; -import springfox.documentation.spring.web.dummy.models.EnumObjectType; -import springfox.documentation.spring.web.dummy.models.EnumType; -import springfox.documentation.spring.web.dummy.models.Example; -import springfox.documentation.spring.web.dummy.models.FancyPet; -import springfox.documentation.spring.web.dummy.models.ModelAttributeExample; -import springfox.documentation.spring.web.dummy.models.ModelWithArrayOfArrays; -import springfox.documentation.spring.web.dummy.models.ModelWithMapProperty; -import springfox.documentation.spring.web.dummy.models.ModelWithObjectNode; -import springfox.documentation.spring.web.dummy.models.NestedType; -import springfox.documentation.spring.web.dummy.models.Pet; -import springfox.documentation.spring.web.dummy.models.PetWithSerializer; -import springfox.documentation.spring.web.dummy.models.Vehicle; - -import java.math.BigDecimal; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -import static java.util.Collections.*; - - -@Controller -@RequestMapping("/features") -@Api(value = "", description = "Demonstration of features", basePath = "features") -public class FeatureDemonstrationService { - - //Uses alternate listing path - @RequestMapping(value = "/{petId}", method = RequestMethod.GET) - @ApiOperation(value = "Find pet by ID", notes = "Returns a pet when ID < 10. " - + "ID > 10 or non-integers will simulate API error conditions", - response = Pet.class, - extensions = { - @Extension(properties = @ExtensionProperty(name = "x-test1", value = "value1")), - @Extension(name = "test2", properties = @ExtensionProperty(name = "name2", value = "value2")) - } - ) - public Pet getPetById( - @ApiParam( - value = "ID of pet that needs to be fetched", - allowableValues = "range[1,5]", - required = true, - example = "3") - @PathVariable("petId") String petId) { - throw new RuntimeException("NotImplementedException"); - } - - //Lists all http methods with this operation - @RequestMapping("/allMethodsAllowed") - public void allMethodAllowed() { - throw new RuntimeException("NotImplementedException"); - } - - //Calculates effective url and ignores UriComponentsBuilder - @RequestMapping(value = "/effective", method = RequestMethod.GET) - public ResponseEntity getEffective(UriComponentsBuilder builder) { - return new ResponseEntity(new Example("Hello", 1, EnumType.ONE, new NestedType("test")), HttpStatus.OK); - } - - //Returns nested generic types - @RequestMapping(value = "/effectives", method = RequestMethod.GET) - private ResponseEntity> getEffectives() { - return new ResponseEntity>(singletonList(new Example("Hello", 1, EnumType.ONE, - new NestedType("test"))), - HttpStatus.OK); - } - - //No request body annotation or swagger annotation - @RequestMapping(value = "/enumObject", method = RequestMethod.GET) - public ResponseEntity getEnumAsObject() { - return ResponseEntity.ok(EnumObjectType.ONE); - } - - //No request body annotation or swagger annotation - @RequestMapping(value = "/bare", method = RequestMethod.POST) - public void getBare(Example example) { - //No-op - } - - //Enum input - @RequestMapping(value = "/status", method = RequestMethod.POST) - public void updateBaz(EnumType enumType) { - //No-op - } - - - //Generic collection input - @RequestMapping(value = "/statuses", method = RequestMethod.POST) - public void updateBazes(List enumType) { - //No-op - } - - //Generic collection input - @RequestMapping(value = "/integers", method = RequestMethod.PUT) - public void updateListOfIntegers(List integers) { - //No-op - } - - //Generic collection input - @RequestMapping(value = "/examples", method = RequestMethod.PUT) - public void updateListOfExamples(List examples) { - //No-op - } - - //LocalDate transformation - @RequestMapping(value = "/date", method = RequestMethod.POST) - public void updateDate(LocalDate localDate) { - //No-op - } - - //BigDecimal transformation - @RequestMapping(value = "/bigDecimal", method = RequestMethod.POST) - public void updateBigDecimal(BigDecimal input) { - //No-op - } - - //boolean transformation - @RequestMapping(value = "/boolean", method = RequestMethod.POST) - public void updateBoolean(Boolean input) { - //No-op - } - - @RequestMapping - @ApiOperation(value = "all") - public HttpEntity all() { - throw new UnsupportedOperationException(); - } - - @RequestMapping(value = "mapProperty", method = RequestMethod.GET) - public ModelWithMapProperty modelWithMapProperty() { - throw new UnsupportedOperationException(); - } - - @RequestMapping(value = "listOfMaps", method = RequestMethod.GET) - public List> listOfMaps() { - throw new UnsupportedOperationException(); - } - - - @RequestMapping(value = "mapOfMapOfExample", method = RequestMethod.GET) - public Map> mapOfMapOfExample() { - throw new UnsupportedOperationException(); - } - - @RequestMapping(value = "addFiles", method = RequestMethod.POST) - @ApiOperation(value = "Add a new contact with file attachment") - public ResponseEntity addFiles(@RequestPart("files") MultipartFile[] files) { - return new ResponseEntity(HttpStatus.OK); - } - - @RequestMapping(value = "/modelAttributes", method = RequestMethod.GET) - public void getModelAttribute(@ModelAttribute ModelAttributeExample example) { - //No-op - } - - @RequestMapping(value = "/arrayOfArrays", method = RequestMethod.POST) - public int[][] arrayOfArrays(@RequestBody Business.BusinessType[][] arrayOfEnums) { - return new int[0][0]; - } - - @RequestMapping(value = "/propertyWithArrayOfArrays", method = RequestMethod.POST) - public void propertyWithArrayOfArrays(@RequestBody ModelWithArrayOfArrays model) { - //No-op - } - - @RequestMapping(value = "/propertyWithObjectNode", method = RequestMethod.POST) - public void propertyWithObjectNode(@RequestBody ModelWithObjectNode model) { - //No-op - } - - @RequestMapping(value = "/1430-body", method = RequestMethod.POST) - public void base64EncodedBody(@RequestBody byte[] base64Encoded) { - //No-op - } - - @RequestMapping(value = "/1430-query", method = RequestMethod.POST) - public void proper(@RequestParam byte[] base64Encoded) { - //No-op - } - - @RequestMapping(value = "/1367/{itemId}", method = RequestMethod.GET, produces = "application/vnd.com.pet+json") - public ResponseEntity findIdentityById(@PathVariable String itemId) { - return new ResponseEntity(new Pet(), HttpStatus.OK); - } - - @RequestMapping(value = "/1367/{itemId}", method = RequestMethod.GET, produces = "application/vnd.com.fancy-pet+json") - public ResponseEntity findById(@PathVariable String itemId) { - return new ResponseEntity(new FancyPet(), HttpStatus.OK); - } - - @RequestMapping(value = "/1490/entity/{itemId}", method = RequestMethod.GET) - @ResponseBody - public ResponseEntity serializablePetEntity(@PathVariable String itemId) { - return new ResponseEntity(new PetWithSerializer(), HttpStatus.OK); - } - - @RequestMapping(value = "/1490/{itemId}", method = RequestMethod.GET) - @ResponseBody - public PetWithSerializer serializablePet(@PathVariable String itemId) { - return new PetWithSerializer(); - } - - @RequestMapping(value = "/1490/{itemId}", method = RequestMethod.PUT) - public void updateSerializablePet(@PathVariable String itemId, @RequestBody PetWithSerializer pet) { - } - - @GetMapping(value = "/inheritance") - public List findVehicles(@RequestParam("type") String type) { - return new ArrayList(); - } - - // tag::question-27[] - @RequestMapping(value = "/2031", method = RequestMethod.POST) - @ResponseBody - @ApiOperation(value = "/2031") - @ApiImplicitParams({ - @ApiImplicitParam( - name = "contents", - dataType = "CustomTypeFor2031", - examples = @io.swagger.annotations.Example( - value = { - @ExampleProperty(value = "{'property': 'test'}", mediaType = "application/json") - })) //<1> - }) - public void save(@PathVariable("keyId") String keyId, - @PathVariable("id") String id, - @RequestBody String contents //<2> - ) { - } - - public static class CustomTypeFor2031 { //<3> - private String property; - - public String getProperty() { - return property; - } - - public void setProperty(String property) { - this.property = property; - } - } - // end::question-27[] - - @RequestMapping(value = "/1570", method = RequestMethod.POST) - @ApiOperation(value = "Demo using examples") - @ApiResponses(value = {@ApiResponse(code = 404, message = "User not found"), - @ApiResponse( - code = 405, - message = "Validation exception", - examples = @io.swagger.annotations.Example( - value = { - @ExampleProperty( - mediaType = "Example json", - value = "{'invalidField': 'address'}"), - @ExampleProperty( - mediaType = "Example string", - value = "The first name was invalid")}))}) - public void saveUser() { - //No-op - } -} diff --git a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/controllers/GenericPetController.java b/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/controllers/GenericPetController.java deleted file mode 100644 index c2582fb1a75..00000000000 --- a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/controllers/GenericPetController.java +++ /dev/null @@ -1,34 +0,0 @@ -/* - * - * Copyright 2017-2019 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ -package springfox.documentation.spring.web.dummy.controllers; - -import org.springframework.http.ResponseEntity; -import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import springfox.documentation.spring.web.dummy.models.Pet; - -@Controller -@RequestMapping("/generic/pets") -public class GenericPetController extends GenericRestController { - @PostMapping("test") - public ResponseEntity test() { - return ResponseEntity.ok(new Pet()); - } -} diff --git a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/controllers/GenericRestController.java b/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/controllers/GenericRestController.java deleted file mode 100644 index 6f2cfd646e2..00000000000 --- a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/controllers/GenericRestController.java +++ /dev/null @@ -1,36 +0,0 @@ -/* - * - * Copyright 2017-2019 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ -package springfox.documentation.spring.web.dummy.controllers; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.ResponseEntity; -import springfox.documentation.spring.web.dummy.models.Pet; - -public abstract class GenericRestController> - extends CommonRestController { - - @Autowired - private S genericService; - - public abstract ResponseEntity test(); - - public S getGenericService() { - return genericService; - } -} diff --git a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/controllers/IRepository.java b/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/controllers/IRepository.java deleted file mode 100644 index edfd18d4c8d..00000000000 --- a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/controllers/IRepository.java +++ /dev/null @@ -1,22 +0,0 @@ -/* - * - * Copyright 2017-2019 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ -package springfox.documentation.spring.web.dummy.controllers; - -public interface IRepository { -} diff --git a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/controllers/InheritedService.java b/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/controllers/InheritedService.java deleted file mode 100644 index 7f4726bd9c0..00000000000 --- a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/controllers/InheritedService.java +++ /dev/null @@ -1,50 +0,0 @@ -/* - * - * Copyright 2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.spring.web.dummy.controllers; - -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiParam; -import io.swagger.annotations.ApiResponse; -import io.swagger.annotations.ApiResponses; -import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestMethod; -import springfox.documentation.spring.web.dummy.models.Pet; - - -@Controller -@RequestMapping("child") -@Api(value = "inheritedService", description = "Interface API") -public interface InheritedService { - - @RequestMapping(value = "child-method", method = RequestMethod.GET) - String getSomething(String parameter); - - @ApiResponses(value = { - @ApiResponse(code = 200, message = "kkj", response = Pet.class) }) - @RequestMapping(value = "/1575", - produces = { "application/json" }, - method = RequestMethod.GET) - Pet demonstrateInheritanceWithAnnotations( - @ApiParam(value = "Parameter 1", required = true) @PathVariable("param1") String param1 - ); - -} \ No newline at end of file diff --git a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/controllers/InheritedServiceImpl.java b/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/controllers/InheritedServiceImpl.java deleted file mode 100644 index 83251c85e92..00000000000 --- a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/controllers/InheritedServiceImpl.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - * - * Copyright 2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.spring.web.dummy.controllers; - -import io.swagger.annotations.ApiParam; -import org.springframework.stereotype.Component; -import org.springframework.web.bind.annotation.PathVariable; -import springfox.documentation.spring.web.dummy.models.Pet; - - -@Component -public class InheritedServiceImpl implements InheritedService { - - @Override - public String getSomething(String parameter) { - return parameter; - } - - @Override - public Pet demonstrateInheritanceWithAnnotations( - @ApiParam(value = "", required = true) - @PathVariable("param1") String param1) { - return null; - } -} \ No newline at end of file diff --git a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/controllers/PetGroomingService.java b/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/controllers/PetGroomingService.java deleted file mode 100644 index 28c80e66d3e..00000000000 --- a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/controllers/PetGroomingService.java +++ /dev/null @@ -1,50 +0,0 @@ -/* - * - * Copyright 2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.spring.web.dummy.controllers; - -import io.swagger.annotations.Api; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestMethod; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.ResponseStatus; - -@Controller -//Demonstrates multiple request mappings at the controller level -@RequestMapping({"/petgrooming", "/pets/grooming", "/pets"}) -@Api(value = "", description = "Grooming operations for pets") -public class PetGroomingService { - - @RequestMapping(method = RequestMethod.GET) - public ResponseEntity canGroom(@RequestParam String type) { - return new ResponseEntity(HttpStatus.OK); - } - - //void returns - @RequestMapping(value = "voidMethod/{input}", method = RequestMethod.DELETE, - headers = {"Accept=application/xml,application/json"}) - @ResponseStatus(value = HttpStatus.OK, reason = "Just testing") - public void groomingFunctionThatReturnsVoid(@PathVariable("input") String input) throws Exception { - } - -} diff --git a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/controllers/PetRepository.java b/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/controllers/PetRepository.java deleted file mode 100644 index 4ce6a10c16d..00000000000 --- a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/controllers/PetRepository.java +++ /dev/null @@ -1,26 +0,0 @@ -/* - * - * Copyright 2017-2019 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ -package springfox.documentation.spring.web.dummy.controllers; - -import org.springframework.stereotype.Component; -import springfox.documentation.spring.web.dummy.models.Pet; - -@Component -class PetRepository implements IRepository { -} diff --git a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/controllers/PetService.java b/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/controllers/PetService.java deleted file mode 100644 index 645a7902f1c..00000000000 --- a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/controllers/PetService.java +++ /dev/null @@ -1,204 +0,0 @@ -/* - * - * Copyright 2015-2019 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.spring.web.dummy.controllers; - -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiOperation; -import io.swagger.annotations.ApiParam; -import io.swagger.annotations.ApiResponse; -import io.swagger.annotations.ApiResponses; -import org.springframework.http.HttpEntity; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestMethod; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.ResponseBody; -import org.springframework.web.multipart.MultipartFile; -import springfox.documentation.spring.web.dummy.models.Pet; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - - - -@Controller -@RequestMapping("/pets") -@Api(value = "", description = "Operations about pets") -public class PetService { - - @RequestMapping(value = "/{petId}", method = RequestMethod.GET) - @ApiOperation(value = "Find pet by ID", notes = "Returns a pet when ID < 10. " - + "ID > 10 or non-integers will simulate API error conditions", - response = Pet.class - ) - public Pet getPetById( - @ApiParam(value = "ID of pet that needs to be fetched", allowableValues = "range[1,5]", - required = true) @PathVariable("petId") String petId) { - throw new RuntimeException("NotImplementedException"); - } - - @RequestMapping(method = RequestMethod.POST) - @ApiOperation(value = "Add a new pet to the store", notes = "Add a new pet to the store") - @ApiResponses(value = { @ApiResponse(code = 405, message = "Invalid input") }) - public void addPet( - @ApiParam(value = "Pet object that needs to be added to the store", required = true) Pet pet) { - throw new RuntimeException("NotImplementedException"); - } - - @RequestMapping(method = RequestMethod.PUT) - @ApiOperation(value = "Update an existing pet") - @ApiResponses(value = { @ApiResponse(code = 400, message = "Invalid ID supplied"), - @ApiResponse(code = 404, message = "Pet not found"), - @ApiResponse(code = 405, message = "Validation exception") }) - public void updatePet( - @ApiParam(value = "Pet object that needs to be added to the store", required = true) @RequestBody Pet pet) { - throw new RuntimeException("NotImplementedException"); - } - - @RequestMapping(value = "/findByStatus", method = RequestMethod.GET, params = {"status"}) - @ApiOperation(value = "Find Pet by status", - notes = "Multiple status values can be provided with comma-separated strings", - response = Pet.class) - @ApiResponses(value = { @ApiResponse(code = 400, message = "Invalid status value") }) - public Pet findPetsByStatus( - @ApiParam(value = "Status values that need to be considered for filter", required = true, - defaultValue = "available", allowableValues = "available,pending,sold", allowMultiple = true) - @RequestParam("status") String status) { - throw new RuntimeException("NotImplementedException"); - } - - @RequestMapping(value = "/findByAge", method = RequestMethod.GET, params = {"age"}) - @ApiOperation(value = "Find Pet by age", - notes = "Exclusive range with infinity", - response = Pet.class) - public Pet findPetsByAge( - @ApiParam(value = "Age values that need to be considered for filter", - allowableValues = "range(0,infinity)") - @RequestParam("age") int age) { - throw new RuntimeException("NotImplementedException"); - } - - @RequestMapping(value = "/findByLegs", method = RequestMethod.GET, params = {"legs"}) - @ApiOperation(value = "Find Pet by legs", - notes = "Exclusive range should work", - response = Pet.class) - public Pet findPetsByLegs( - @ApiParam(value = "Legs values that need to be considered for filter", - allowableValues = "range(0,10)") - @RequestParam("legs") int legs) { - throw new RuntimeException("NotImplementedException"); - } - - @RequestMapping(value = "/findByStamina", method = RequestMethod.GET, params = {"stamina"}) - @ApiOperation(value = "Find Pet by stamina", - notes = "Exclusive range with -infinity", - response = Pet.class) - public Pet findPetsByStamina( - @ApiParam(value = "Stamina values", - allowableValues = "range[-infinity,12)") - @RequestParam("stamina") long stamina) { - throw new RuntimeException("NotImplementedException"); - } - - @RequestMapping(value = "/findByTags", method = RequestMethod.GET) - @ApiOperation(value = "Find Pet by tags", - notes = "Multiple tags can be provided with comma-separated strings. Use tag1, tag2, tag3 for testing.", - response = Pet.class) - @ApiResponses(value = { @ApiResponse(code = 400, message = "Invalid tag value") }) - @Deprecated - public Pet findPetsByTags( - @ApiParam(value = "Tags to filter by", required = true, allowMultiple = true) - @RequestParam("tags") String tags) { - throw new RuntimeException("NotImplementedException"); - } - - - @RequestMapping(value = "/siblings", method = RequestMethod.POST) - public List siblings(Pet pet) { - throw new RuntimeException("NotImplementedException"); - } - - @RequestMapping(method = RequestMethod.GET) - @ApiOperation(value = "List all pets") - //@ApiModel(type = Pet.class, collection = true) - public - @ResponseBody - List listPets() { - return new ArrayList<>(); - } - - @RequestMapping(value = "/{name}", method = RequestMethod.POST) - public HttpEntity petByName(@PathVariable String name) { - throw new RuntimeException("NotImplementedException"); - } - - @RequestMapping(value = "/echo", method = RequestMethod.POST) - @ResponseBody - public Map echo(@RequestBody Map someInput) { - throw new RuntimeException("NotImplementedException"); - } - - @RequestMapping(value = "/transformPetNameToPetMapToAny", method = RequestMethod.POST) - public Map transformPetNameToPetMapToAny(@RequestBody Map someInput) { - throw new RuntimeException("NotImplementedException"); - } - - @RequestMapping(value = "/transformPetNameToPetMapToGenericOpenMap", method = RequestMethod.POST) - public Map transformPetNameToPetMapToGenericOpenMap(@RequestBody Map someInput) { - throw new RuntimeException("NotImplementedException"); - } - - - @RequestMapping(value = "/transformPetNameToPetMapToOpenMap", method = RequestMethod.POST) - public Map transformPetNameToPetMapToOpenMap(@RequestBody Map someInput) { - throw new RuntimeException("NotImplementedException"); - } - - @RequestMapping(value = "/nameToNickNamesMap", method = RequestMethod.POST) - public Map> nameToNickNamesMap() { - throw new RuntimeException("NotImplementedException"); - } - - @RequestMapping(value = "byName/{name}", method = RequestMethod.POST) - public HttpEntity> petEntities(@PathVariable String name) { - return new ResponseEntity>(new ArrayList(), HttpStatus.OK); - } - - @RequestMapping(value = "{a}/{b}", method = RequestMethod.GET) - public ResponseEntity method(@PathVariable("a") String a, @PathVariable("b") String b) { - return new ResponseEntity(HttpStatus.OK); - } - - @RequestMapping(value = "{petId}/pic", method = RequestMethod.POST) - public ResponseEntity updatePic(@PathVariable String petId, MultipartFile pic) { - return new ResponseEntity(HttpStatus.OK); - } - - @RequestMapping(value = "{petId}/pic/{picId}", method = RequestMethod.GET) - public ResponseEntity updatePic(@PathVariable String petId, @PathVariable String picId) { - return new ResponseEntity(HttpStatus.OK); - } - -} diff --git a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/controllers/RootController.java b/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/controllers/RootController.java deleted file mode 100644 index 9ef66036c6d..00000000000 --- a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/controllers/RootController.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * - * Copyright 2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.spring.web.dummy.controllers; - -import io.swagger.annotations.Api; -import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestMethod; -import org.springframework.web.bind.annotation.ResponseBody; - -import java.util.Arrays; -import java.util.List; - -@Controller -@Api(value = "/", position = 0) -public class RootController { - @RequestMapping(value = "/", method = RequestMethod.GET) - public - @ResponseBody - List getAll() { - return Arrays.asList(new String[]{"1", "2"}); - } -} \ No newline at end of file diff --git a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/controllers/SameController.java b/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/controllers/SameController.java deleted file mode 100644 index 34b42db15c8..00000000000 --- a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/controllers/SameController.java +++ /dev/null @@ -1,46 +0,0 @@ -/* - * - * Copyright 2017 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.spring.web.dummy.controllers; - -import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestMethod; - -import io.swagger.annotations.ApiResponse; -import io.swagger.annotations.ApiResponses; -import springfox.documentation.spring.web.dummy.models.ModelWithSameNameClasses; - -@Controller -@RequestMapping("/same") -public class SameController { - - @RequestMapping(value = "/create-same", method = RequestMethod.PUT) - public void create(@RequestBody ModelWithSameNameClasses toCreate) { - throw new UnsupportedOperationException(); - } - - @RequestMapping(value = "/get-same/{id}", method = RequestMethod.GET) - @ApiResponses(value = {@ApiResponse(code = 405, message = "Invalid input")}) - public ModelWithSameNameClasses get(@PathVariable("id") String id) { - throw new UnsupportedOperationException(); - } -} \ No newline at end of file diff --git a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/controllers/SortDirection.java b/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/controllers/SortDirection.java deleted file mode 100644 index 0c4ecef70fa..00000000000 --- a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/controllers/SortDirection.java +++ /dev/null @@ -1,24 +0,0 @@ -/* - * - * Copyright 2017-2019 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ -package springfox.documentation.spring.web.dummy.controllers; - -public enum SortDirection { - ASC, - DESC -} diff --git a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/AccountType.java b/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/AccountType.java deleted file mode 100644 index 5853495c3bd..00000000000 --- a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/AccountType.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * - * Copyright 2017-2019 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ -package springfox.documentation.spring.web.dummy.models; - -public enum AccountType { - CASH("现金账户", 2), - BANK("银行账户", 3); - - private String name; - private int code; - - AccountType(String name, int code) { - this.name = name; - this.code = code; - } - - public String getName() { - return name; - } - - public int getCode() { - return code; - } -} diff --git a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/ApplicationLang.java b/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/ApplicationLang.java deleted file mode 100644 index 70b8e42dbc8..00000000000 --- a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/ApplicationLang.java +++ /dev/null @@ -1,28 +0,0 @@ -/* - * - * Copyright 2017-2019 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ -package springfox.documentation.spring.web.dummy.models; - -import java.io.Serializable; -import java.util.HashMap; -import java.util.Map; - -public class ApplicationLang extends HashMap - implements Map, Serializable { - -} diff --git a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/Bar.java b/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/Bar.java deleted file mode 100644 index f418a3f4de4..00000000000 --- a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/Bar.java +++ /dev/null @@ -1,37 +0,0 @@ -package springfox.documentation.spring.web.dummy.models; - -import java.util.List; - -public class Bar { - - private Integer id; - - private String name; - - private List foos; - - public Integer getId() { - return id; - } - - public void setId(Integer id) { - this.id = id; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public List getFoos() { - return foos; - } - - public void setFoos(List foos) { - this.foos = foos; - } - -} diff --git a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/Bug1749.java b/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/Bug1749.java deleted file mode 100644 index c593fdec917..00000000000 --- a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/Bug1749.java +++ /dev/null @@ -1,120 +0,0 @@ -/* - * - * Copyright 2017-2019 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ -package springfox.documentation.spring.web.dummy.models; - -import com.fasterxml.jackson.annotation.JsonIgnore; -import springfox.documentation.spring.web.dummy.controllers.SortDirection; - -import javax.validation.constraints.Max; -import javax.validation.constraints.Min; -import javax.validation.constraints.NotNull; -import java.util.HashMap; -import java.util.Map; - -public class Bug1749 { - @NotNull - @Min(value = 1, message = "must be > 1") - private Integer pageNumber = 1; - @NotNull - @Max(value = 50, message = "must be < 50") - private Integer pageSize = 20; - private SortDirection sortDirection; - private String sortField; - - public Bug1749(int pageNumber, int pageSize) { - this.pageNumber = pageNumber; - this.pageSize = pageSize; - } - - public Bug1749(int pageNumber, int pageSize, String sortField) { - this(pageNumber, pageSize); - this.sortField = sortField; - } - - public Bug1749(int pageNumber, int pageSize, String sortField, SortDirection sortDirection) { - this(pageNumber, pageSize, sortField); - this.sortDirection = sortDirection; - } - - public Map toMap() { - Map map = new HashMap(); - map.put("pageNumber", Integer.toString(pageNumber)); - map.put("pageSize", Integer.toString(pageSize)); - if (sortDirection != null) { - map.put("sortDirection", sortDirection.toString()); - } - if (sortField != null) { - map.put("sortField", sortField); - } - return map; - } - - // region Auto-generated code - public Bug1749() { - } - - @JsonIgnore - public boolean isAscending() { - return sortDirection == SortDirection.ASC; - } - - @JsonIgnore - public boolean isSet() { - return pageNumber != null && pageSize != null; - } - - public Bug1749 setSort(String field, SortDirection direction) { - this.sortField = field; - this.sortDirection = direction; - return this; - } - - public Integer getPageNumber() { - return pageNumber; - } - - public void setPageNumber(Integer pageNumber) { - this.pageNumber = pageNumber; - } - - public Integer getPageSize() { - return pageSize; - } - - public void setPageSize(Integer pageSize) { - this.pageSize = pageSize; - } - - public SortDirection getSortDirection() { - return sortDirection; - } - - public void setSortDirection(SortDirection sortDirection) { - this.sortDirection = sortDirection; - } - - public String getSortField() { - return sortField; - } - - public void setSortField(String sortField) { - this.sortField = sortField; - } - // endregion -} \ No newline at end of file diff --git a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/Business.java b/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/Business.java deleted file mode 100644 index 750d748a2a6..00000000000 --- a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/Business.java +++ /dev/null @@ -1,60 +0,0 @@ -/* - * - * Copyright 2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.spring.web.dummy.models; - -import com.fasterxml.jackson.annotation.JsonProperty; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import org.joda.time.LocalDate; - -import java.util.Date; - - -@ApiModel(value = "Biz") -@SuppressWarnings("VisibilityModifier") -public class Business { - @ApiModelProperty(hidden = true) - @JsonProperty(value = "_meta") - public String meta = "Hello"; - - //not private - just for testing - public int id; - public String name; - public String owner; - public LocalDate inception; - public BusinessType businessType = BusinessType.PRODUCT; - public Date taxDate = new Date(); - - public enum BusinessType { - PRODUCT(1), - SERVICE(2); - private int value; - - BusinessType(int value) { - this.value = value; - } - - public int getValue() { - return value; - } - } -} - - diff --git a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/Car.java b/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/Car.java deleted file mode 100644 index 40d1862500f..00000000000 --- a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/Car.java +++ /dev/null @@ -1,49 +0,0 @@ -/* - * - * Copyright 2017-2019 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ -package springfox.documentation.spring.web.dummy.models; - -public class Car extends Vehicle { - private int seatingCapacity; - private double topSpeed; - - public Car() { - } - - public Car(String make, String model, int seatingCapacity, double topSpeed) { - super(make, model); - this.seatingCapacity = seatingCapacity; - this.topSpeed = topSpeed; - } - - public int getSeatingCapacity() { - return seatingCapacity; - } - - public void setSeatingCapacity(int seatingCapacity) { - this.seatingCapacity = seatingCapacity; - } - - public double getTopSpeed() { - return topSpeed; - } - - public void setTopSpeed(double topSpeed) { - this.topSpeed = topSpeed; - } -} \ No newline at end of file diff --git a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/Category.java b/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/Category.java deleted file mode 100644 index 24875a1c197..00000000000 --- a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/Category.java +++ /dev/null @@ -1,36 +0,0 @@ -/* - * - * Copyright 2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.spring.web.dummy.models; - -public class Category { - private String name; - - public Category(String name) { - this.name = name; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } -} diff --git a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/City.java b/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/City.java deleted file mode 100644 index 400a69e1894..00000000000 --- a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/City.java +++ /dev/null @@ -1,55 +0,0 @@ -/* - * - * Copyright 2020 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ -package springfox.documentation.spring.web.dummy.models; - -import java.util.List; - -public class City { - - private List districts; - - private Region region; - - private Country country; - - public List getDistricts() { - return districts; - } - - public void setDistricts(List districts) { - this.districts = districts; - } - - public Region getRegion() { - return region; - } - - public void setRegion(Region region) { - this.region = region; - } - - public Country getCountry() { - return country; - } - - public void setCountry(Country country) { - this.country = country; - } - -} diff --git a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/Country.java b/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/Country.java deleted file mode 100644 index 4b2262af91c..00000000000 --- a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/Country.java +++ /dev/null @@ -1,49 +0,0 @@ -/* - * - * Copyright 2020 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ -package springfox.documentation.spring.web.dummy.models; - -import java.util.List; - -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.JsonProperty.Access; - -public class Country { - - @JsonProperty(access = Access.READ_ONLY) - private Long populatuion; - - private List regions; - - public Long getPopulatuion() { - return populatuion; - } - - public void setPopulatuion(Long populatuion) { - this.populatuion = populatuion; - } - - public List getRegions() { - return regions; - } - - public void setRegions(List regions) { - this.regions = regions; - } - -} diff --git a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/CustomAllCapsStringHashSet.java b/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/CustomAllCapsStringHashSet.java deleted file mode 100644 index 2cf0c2c122d..00000000000 --- a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/CustomAllCapsStringHashSet.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * - * Copyright 2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ -package springfox.documentation.spring.web.dummy.models; - -import java.util.Collection; -import java.util.HashSet; -import java.util.Locale; - -public class CustomAllCapsStringHashSet extends HashSet { - - private static final long serialVersionUID = -5157313869620411257L; - private static final Locale EN_LOCALE = new Locale("en_US"); - - @Override - public boolean add(final String e) { - return super.add(e.toUpperCase(EN_LOCALE)); - } - - @Override - public boolean addAll(final Collection c) { - - boolean isChanged = false; - - for (String value : c) { - if (add(value.toUpperCase(EN_LOCALE))) { - isChanged = true; - } - } - return isChanged; - } -} diff --git a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/District.java b/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/District.java deleted file mode 100644 index 74793c49154..00000000000 --- a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/District.java +++ /dev/null @@ -1,65 +0,0 @@ -/* - * - * Copyright 2020 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ -package springfox.documentation.spring.web.dummy.models; - -import java.util.List; - -public class District { - - private List streets; - - private City city; - - private Region region; - - private Country country; - - public List getStreets() { - return streets; - } - - public void setStreets(List streets) { - this.streets = streets; - } - - public City getCity() { - return city; - } - - public void setCity(City city) { - this.city = city; - } - - public Region getRegion() { - return region; - } - - public void setRegion(Region region) { - this.region = region; - } - - public Country getCountry() { - return country; - } - - public void setCountry(Country country) { - this.country = country; - } - -} diff --git a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/EHDTOApplicatorUnits.java b/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/EHDTOApplicatorUnits.java deleted file mode 100644 index 8b5e1595419..00000000000 --- a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/EHDTOApplicatorUnits.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * - * Copyright 2017-2019 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ -package springfox.documentation.spring.web.dummy.models; - -import javax.xml.bind.annotation.XmlAccessType; -import javax.xml.bind.annotation.XmlAccessorType; -import javax.xml.bind.annotation.XmlElement; -import javax.xml.bind.annotation.XmlRootElement; -import java.util.List; - -@XmlRootElement(name = "ApplicatorUnits") -@XmlAccessorType(XmlAccessType.FIELD) -public class EHDTOApplicatorUnits { - @XmlElement(name = "UnitGroup") - private List ehdtoUnitGroups; - - public List getEhdtoUnitGroups() { - return ehdtoUnitGroups; - } - - public void setEhdtoUnitGroups(List ehdtoUnitGroups) { - this.ehdtoUnitGroups = ehdtoUnitGroups; - } -} \ No newline at end of file diff --git a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/EHDTOUnit.java b/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/EHDTOUnit.java deleted file mode 100644 index cc8cb15d580..00000000000 --- a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/EHDTOUnit.java +++ /dev/null @@ -1,59 +0,0 @@ -/* - * - * Copyright 2017-2019 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ -package springfox.documentation.spring.web.dummy.models; - -import javax.xml.bind.annotation.XmlAccessType; -import javax.xml.bind.annotation.XmlAccessorType; -import javax.xml.bind.annotation.XmlAttribute; -import javax.xml.bind.annotation.XmlRootElement; - -@XmlRootElement(name = "Unit") -@XmlAccessorType(XmlAccessType.FIELD) -public class EHDTOUnit { - @XmlAttribute(name = "id") - private String id; - @XmlAttribute(name = "name") - private String name; - @XmlAttribute(name = "unitSystem") - private String unitSystem; - - public String getId() { - return id; - } - - public void setId(String id) { - this.id = id; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public String getUnitSystem() { - return unitSystem; - } - - public void setUnitSystem(String unitSystem) { - this.unitSystem = unitSystem; - } -} diff --git a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/EHDTOUnitGroup.java b/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/EHDTOUnitGroup.java deleted file mode 100644 index fc51a5ad427..00000000000 --- a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/EHDTOUnitGroup.java +++ /dev/null @@ -1,52 +0,0 @@ -/* - * - * Copyright 2017-2019 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ -package springfox.documentation.spring.web.dummy.models; - -import javax.xml.bind.annotation.XmlAccessType; -import javax.xml.bind.annotation.XmlAccessorType; -import javax.xml.bind.annotation.XmlAttribute; -import javax.xml.bind.annotation.XmlElement; -import javax.xml.bind.annotation.XmlRootElement; -import java.util.List; - -@XmlRootElement(name = "UnitGroup") -@XmlAccessorType(XmlAccessType.FIELD) -public class EHDTOUnitGroup { - @XmlAttribute(name = "name") - private String name; - - @XmlElement(name = "unit") - private List ehdtoUnits; - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public List getEhdtoUnits() { - return ehdtoUnits; - } - - public void setEhdtoUnits(List ehdtoUnits) { - this.ehdtoUnits = ehdtoUnits; - } -} \ No newline at end of file diff --git a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/EnumCollection.java b/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/EnumCollection.java deleted file mode 100644 index f20e2a40052..00000000000 --- a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/EnumCollection.java +++ /dev/null @@ -1,34 +0,0 @@ -/* - * - * Copyright 2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ -package springfox.documentation.spring.web.dummy.models; - -import java.util.Set; - -public class EnumCollection { - - private Set types; - - public Set getTypes() { - return types; - } - - public void setTypes(Set types) { - this.types = types; - } -} diff --git a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/EnumObjectType.java b/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/EnumObjectType.java deleted file mode 100644 index 6ec28b1e9ec..00000000000 --- a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/EnumObjectType.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * - * Copyright 2015-2016 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.spring.web.dummy.models; - -import com.fasterxml.jackson.annotation.JsonFormat; - -/** - * Created by yeh on 22.05.2017. - */ - -@JsonFormat(shape = JsonFormat.Shape.OBJECT) -public enum EnumObjectType { - ONE("One", "This in an enum for number 1"), TWO("Two", "This in an enum for number 2"); - - private String name; - private String description; - - EnumObjectType(String name, String description) { - this.name = name; - this.description = description; - } - - public String getName() { - return name; - } - - public String getDescription() { - return description; - } -} diff --git a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/EnumType.java b/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/EnumType.java deleted file mode 100644 index 09fe67c8fed..00000000000 --- a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/EnumType.java +++ /dev/null @@ -1,25 +0,0 @@ -/* - * - * Copyright 2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.spring.web.dummy.models; - -public enum EnumType { - ONE, - TWO -} diff --git a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/Example.java b/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/Example.java deleted file mode 100644 index 3697428ff13..00000000000 --- a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/Example.java +++ /dev/null @@ -1,150 +0,0 @@ -/* - * - * Copyright 2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.spring.web.dummy.models; - -import com.fasterxml.jackson.annotation.JsonProperty; -import io.swagger.annotations.ApiModelProperty; -import io.swagger.annotations.ApiParam; -import org.joda.time.LocalDateTime; - -import java.io.Serializable; - -public class Example extends Parent implements Serializable { - - private static final long serialVersionUID = -8084678021874483017L; - - @ApiParam(value = "description of foo", required = true, allowableValues = "man,chu") - private String foo; - - @ApiModelProperty(value = "description of bar", required = false, example = "10") - private int bar; - - private EnumType enumType; - - @ApiModelProperty(value = "A read only string", readOnly = true) - private String readOnlyString; - - @ApiParam(value = "description of annotatedEnumType", required = false) - private EnumType annotatedEnumType; - - private NestedType nestedType; - - @JsonProperty("propertyWithNoGetterMethod") - private String propertyWithNoGetterMethod; - private String propertyWithNoSetterMethod; - - @ApiParam(value = "local date time desc dd-MM-yyyy hh:mm:ss", required = true) - private LocalDateTime localDateTime; - @ApiParam(value = "description of allCapsSet", required = false) - private CustomAllCapsStringHashSet allCapsSet; - - private Void voidParam; - - public Example(String foo, int bar, EnumType enumType, NestedType nestedType) { - this.foo = foo; - this.bar = bar; - this.enumType = enumType; - this.nestedType = nestedType; - } - - public String getFoo() { - return foo; - } - - public void setFoo(String foo) { - this.foo = foo; - } - - public int getBar() { - return bar; - } - - public void setBar(int bar) { - this.bar = bar; - } - - public EnumType getEnumType() { - return enumType; - } - - public void setEnumType(EnumType enumType) { - this.enumType = enumType; - } - - public EnumType getAnnotatedEnumType() { - return annotatedEnumType; - } - - public void setAnnotatedEnumType(EnumType annotatedEnumType) { - this.annotatedEnumType = annotatedEnumType; - } - - public NestedType getNestedType() { - return nestedType; - } - - public void setNestedType(NestedType nestedType) { - this.nestedType = nestedType; - } - - public void setPropertyWithNoGetterMethod(String propertyWithNoGetterMethod) { - this.propertyWithNoGetterMethod = propertyWithNoGetterMethod; - } - - public String getPropertyWithNoSetterMethod() { - return this.propertyWithNoSetterMethod; - } - - public CustomAllCapsStringHashSet getAllCapsSet() { - return allCapsSet; - } - - public void setAllCapsSet(CustomAllCapsStringHashSet allCapsSet) { - this.allCapsSet = allCapsSet; - } - - public LocalDateTime getLocalDateTime() { - return localDateTime; - } - - public void setLocalDateTime(LocalDateTime localDateTime) { - this.localDateTime = localDateTime; - } - - public String getReadOnlyString() { - return readOnlyString; - } - - public void setReadOnlyString(String readOnlyString) { - this.readOnlyString = readOnlyString; - } - - public Void getVoidParam() { - return voidParam; - } - - public void setVoidParam(Void voidParam) { - this.voidParam = voidParam; - } - - class InnerSynthetic { - } -} - diff --git a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/FancyPet.java b/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/FancyPet.java deleted file mode 100644 index 1fda72625b1..00000000000 --- a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/FancyPet.java +++ /dev/null @@ -1,34 +0,0 @@ -/* - * - * Copyright 2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.spring.web.dummy.models; - -import java.util.List; - -public class FancyPet extends Pet { - private List categories; - - public List getCategories() { - return categories; - } - - public void setCategories(List categories) { - this.categories = categories; - } -} diff --git a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/Foo.java b/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/Foo.java deleted file mode 100644 index bf996b23cdf..00000000000 --- a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/Foo.java +++ /dev/null @@ -1,43 +0,0 @@ -/* - * - * Copyright 2019 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ -package springfox.documentation.spring.web.dummy.models; - -public class Foo { - - private Integer id; - - private String name; - - public Integer getId() { - return id; - } - - public void setId(Integer id) { - this.id = id; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - -} diff --git a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/FoobarDto.java b/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/FoobarDto.java deleted file mode 100644 index 031ddea9b81..00000000000 --- a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/FoobarDto.java +++ /dev/null @@ -1,62 +0,0 @@ -/* - * - * Copyright 2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.spring.web.dummy.models; - -import com.fasterxml.jackson.annotation.JsonIgnore; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; - -public class FoobarDto { - - @JsonIgnore - private final Foobar foobar; - - @JsonIgnore - private Long visibleForSerialize; - - @JsonProperty - @JsonInclude - public Long getVisibleForSerialize() { - return visibleForSerialize; - } - - @JsonIgnore - public void setVisibleForSerialize(Long visibleForSerialize) { - this.visibleForSerialize = visibleForSerialize; - } - - @JsonProperty("foobar") - public String getFoobarCode() { - return foobar == null ? null : foobar.name(); - } - - public Foobar getFoobar() { - return foobar; - } - - public FoobarDto(@JsonProperty("foobar") String foobar) { - this.foobar = Foobar.valueOf(foobar); - } - - public enum Foobar { - FOO, - BAR - } -} diff --git a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/Holder.java b/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/Holder.java deleted file mode 100644 index ee2adfed332..00000000000 --- a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/Holder.java +++ /dev/null @@ -1,43 +0,0 @@ -/* - * - * Copyright 2020 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ -package springfox.documentation.spring.web.dummy.models; - -public class Holder { - - private T content; - - private Wrapper wrapper; - - public T getContent() { - return content; - } - - public void setContent(T content) { - this.content = content; - } - - public Wrapper getWrapper() { - return wrapper; - } - - public void setWrapper(Wrapper wrapper) { - this.wrapper = wrapper; - } - -} diff --git a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/House.java b/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/House.java deleted file mode 100644 index e35bf6e05e8..00000000000 --- a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/House.java +++ /dev/null @@ -1,83 +0,0 @@ -/* - * - * Copyright 2020 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ -package springfox.documentation.spring.web.dummy.models; - -public class House { - - private Integer number; - - private Street street; - - private District district; - - private City city; - - private Region region; - - private Country country; - - public Integer getNumber() { - return number; - } - - public void setNumber(Integer number) { - this.number = number; - } - - public Street getStreet() { - return street; - } - - public void setStreet(Street street) { - this.street = street; - } - - public District getDistrict() { - return district; - } - - public void setDistrict(District district) { - this.district = district; - } - - public City getCity() { - return city; - } - - public void setCity(City city) { - this.city = city; - } - - public Region getRegion() { - return region; - } - - public void setRegion(Region region) { - this.region = region; - } - - public Country getCountry() { - return country; - } - - public void setCountry(Country country) { - this.country = country; - } - -} diff --git a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/Language.java b/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/Language.java deleted file mode 100644 index 176c942d614..00000000000 --- a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/Language.java +++ /dev/null @@ -1,28 +0,0 @@ -/* - * - * Copyright 2017-2019 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ -package springfox.documentation.spring.web.dummy.models; - -import java.io.Serializable; -import java.util.HashMap; -import java.util.Map; - -public class Language extends HashMap - implements Map, Serializable { - -} diff --git a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/LanguageResponse.java b/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/LanguageResponse.java deleted file mode 100644 index aa97dc25dfa..00000000000 --- a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/LanguageResponse.java +++ /dev/null @@ -1,28 +0,0 @@ -/* - * - * Copyright 2017-2019 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ -package springfox.documentation.spring.web.dummy.models; - -import java.io.Serializable; -import java.util.HashMap; -import java.util.Map; - -public class LanguageResponse extends HashMap - implements Map, Serializable { - -} diff --git a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/LanguageText.java b/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/LanguageText.java deleted file mode 100644 index 5cd4a02628c..00000000000 --- a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/LanguageText.java +++ /dev/null @@ -1,38 +0,0 @@ -/* - * - * Copyright 2017-2019 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ -package springfox.documentation.spring.web.dummy.models; - -import com.fasterxml.jackson.annotation.JsonProperty; - -import java.io.Serializable; - -public class LanguageText implements Serializable { - - @JsonProperty("TEXT") - private String text; - - public String getText() { - return text; - } - - public void setText(String text) { - this.text = text; - } - -} diff --git a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/MapFancyPet.java b/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/MapFancyPet.java deleted file mode 100644 index b15453e486c..00000000000 --- a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/MapFancyPet.java +++ /dev/null @@ -1,44 +0,0 @@ -/* - * - * Copyright 2017 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.spring.web.dummy.models; - -import java.util.Map; - -public class MapFancyPet { - private Map fancyPets; - - private SameFancyPet fancyPet; - - public Map getFancyPets() { - return fancyPets; - } - - public void setFancyPets(Map fancyPets) { - this.fancyPets = fancyPets; - } - - public SameFancyPet getFancyPet() { - return fancyPet; - } - - public void setFancyPet(SameFancyPet fancyPet) { - this.fancyPet = fancyPet; - } -} \ No newline at end of file diff --git a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/ModelAttributeComplexTypeExample.java b/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/ModelAttributeComplexTypeExample.java deleted file mode 100644 index f7b8899ad82..00000000000 --- a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/ModelAttributeComplexTypeExample.java +++ /dev/null @@ -1,65 +0,0 @@ -/* - * - * Copyright 2016-2017 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.spring.web.dummy.models; - -import java.util.List; - -public class ModelAttributeComplexTypeExample extends ModelAttributeExample { - - private List fancyPets; - - private Category[] categories; - - private String[] modelAttributeProperty; - - private List recursiveList; - - public List getFancyPets() { - return fancyPets; - } - - public void setFancyPets(List fancyPets) { - this.fancyPets = fancyPets; - } - - public Category[] getCategories() { - return categories; - } - - public void setCategories(Category[] categories) { - this.categories = categories; - } - - public String[] getModelAttributeProperty() { - return modelAttributeProperty; - } - - public void setModelAttributeProperty(String[] modelAttributeProperty) { - this.modelAttributeProperty = modelAttributeProperty; - } - - public List getRecursiveList() { - return recursiveList; - } - - public void setRecursiveList(List recursiveList) { - this.recursiveList = recursiveList; - } -} diff --git a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/ModelAttributeExample.java b/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/ModelAttributeExample.java deleted file mode 100644 index 47a8e54fec0..00000000000 --- a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/ModelAttributeExample.java +++ /dev/null @@ -1,78 +0,0 @@ -/* - * - * Copyright 2015-2019 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ -package springfox.documentation.spring.web.dummy.models; - -import java.util.List; - -public class ModelAttributeExample { - private String stringProp; - private int intProp; - private List listProp; - private int[] arrayProp; - private Category complexProp; - private List accountTypes; - - public String getStringProp() { - return stringProp; - } - - public void setStringProp(String stringProp) { - this.stringProp = stringProp; - } - - public int getIntProp() { - return intProp; - } - - public void setIntProp(int intProp) { - this.intProp = intProp; - } - - public List getListProp() { - return listProp; - } - - public void setListProp(List listProp) { - this.listProp = listProp; - } - - public int[] getArrayProp() { - return arrayProp; - } - - public void setArrayProp(int[] arrayProp) { - this.arrayProp = arrayProp; - } - - public Category getComplexProp() { - return complexProp; - } - - public void setComplexProp(Category complexProp) { - this.complexProp = complexProp; - } - - public List getAccountTypes() { - return accountTypes; - } - - public void setAccountTypes(List accountTypes) { - this.accountTypes = accountTypes; - } -} diff --git a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/ModelAttributeWithHiddenParametersExample.java b/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/ModelAttributeWithHiddenParametersExample.java deleted file mode 100644 index 3b84e10c63f..00000000000 --- a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/ModelAttributeWithHiddenParametersExample.java +++ /dev/null @@ -1,65 +0,0 @@ -/* - * - * Copyright 2016 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.spring.web.dummy.models; - -import io.swagger.annotations.ApiModelProperty; -import io.swagger.annotations.ApiParam; - -public class ModelAttributeWithHiddenParametersExample extends ModelAttributeExample { - @ApiParam(hidden = true) - private Integer category; - private String[] modelAttributeProperty; - @ApiModelProperty(hidden = true) - private String hiddenProperty1; - @ApiModelProperty(hidden = true) - private String hiddenProperty2; - - public Integer getCategory() { - return category; - } - - public void setCategory(Integer category) { - this.category = category; - } - - public String[] getModelAttributeProperty() { - return modelAttributeProperty; - } - - public void setModelAttributeProperty(String[] modelAttributeProperty) { - this.modelAttributeProperty = modelAttributeProperty; - } - - public String getHiddenProperty1() { - return hiddenProperty1; - } - - public void setHiddenProperty1(String hiddenProperty1) { - this.hiddenProperty1 = hiddenProperty1; - } - - public String getHiddenProperty2() { - return hiddenProperty2; - } - - public void setHiddenProperty2(String hiddenProperty2) { - this.hiddenProperty2 = hiddenProperty2; - } -} diff --git a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/ModelWithArrayOfArrays.java b/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/ModelWithArrayOfArrays.java deleted file mode 100644 index a9d9c8a7f05..00000000000 --- a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/ModelWithArrayOfArrays.java +++ /dev/null @@ -1,31 +0,0 @@ -/* - * - * Copyright 2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ -package springfox.documentation.spring.web.dummy.models; - -public class ModelWithArrayOfArrays { - private int[][] arrayOfArrayOfInts; - - public int[][] getArrayOfArrayOfInts() { - return arrayOfArrayOfInts; - } - - public void setArrayOfArrayOfInts(int[][] arrayOfArrayOfInts) { - this.arrayOfArrayOfInts = arrayOfArrayOfInts; - } -} diff --git a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/ModelWithMapProperty.java b/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/ModelWithMapProperty.java deleted file mode 100644 index 63999e2e3b1..00000000000 --- a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/ModelWithMapProperty.java +++ /dev/null @@ -1,38 +0,0 @@ -/* - * - * Copyright 2015-2019 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.spring.web.dummy.models; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; - -import java.util.HashMap; -import java.util.Map; - - - -@ApiModel(description = "Describes model with map property") -public class ModelWithMapProperty { - @ApiModelProperty(value = "Map of params to be sent") - private final Map params = new HashMap<>(); - - public Map getParams() { - return params; - } -} diff --git a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/ModelWithObjectNode.java b/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/ModelWithObjectNode.java deleted file mode 100644 index dd8866853f4..00000000000 --- a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/ModelWithObjectNode.java +++ /dev/null @@ -1,33 +0,0 @@ -/* - * - * Copyright 2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ -package springfox.documentation.spring.web.dummy.models; - -import com.fasterxml.jackson.databind.node.ObjectNode; - -public class ModelWithObjectNode { - private ObjectNode anyObject; - - public ObjectNode getAnyObject() { - return anyObject; - } - - public void setAnyObject(ObjectNode anyObject) { - this.anyObject = anyObject; - } -} diff --git a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/ModelWithSameNameClasses.java b/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/ModelWithSameNameClasses.java deleted file mode 100644 index 0a2985577ca..00000000000 --- a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/ModelWithSameNameClasses.java +++ /dev/null @@ -1,98 +0,0 @@ -/* - * - * Copyright 2017 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.spring.web.dummy.models; - -import java.util.List; -import java.util.Map; - -public class ModelWithSameNameClasses { - - private FancyPet fancyPet; - - private SameFancyPet moreFancyPet; - - private List fancyPets; - - private Map fancyPetsMap; - - private List>> crazyFancyPets; - - private List>> weirdFancyPets; - - private Map>> madFancyPets; - - public FancyPet getFancyPet() { - return fancyPet; - } - - public void setFancyPet(FancyPet fancyPet) { - this.fancyPet = fancyPet; - } - - public SameFancyPet getMoreFancyPet() { - return moreFancyPet; - } - - public void setMoreFancyPet(SameFancyPet moreFancyPet) { - this.moreFancyPet = moreFancyPet; - } - - public List getFancyPets() { - return fancyPets; - } - - public void setFancyPets(List fancyPets) { - this.fancyPets = fancyPets; - } - - public Map getFancyPetsMap() { - return fancyPetsMap; - } - - public void setFancyPetsMap(Map fancyPetsMap) { - this.fancyPetsMap = fancyPetsMap; - } - - public List>> getCrazyFancyPets() { - return crazyFancyPets; - } - - public void setCrazyFancyPets(List>> crazyFancyPets) { - this.crazyFancyPets = crazyFancyPets; - } - - public List>> getWeirdFancyPets() { - return weirdFancyPets; - } - - public void setWeirdFancyPets( - List>> weirdFancyPets) { - this.weirdFancyPets = weirdFancyPets; - } - - public Map>> getMadFancyPets() { - return madFancyPets; - } - - public void setMadFancyPets( - Map>> madFancyPets) { - this.madFancyPets = madFancyPets; - } -} diff --git a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/Monkey.java b/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/Monkey.java deleted file mode 100644 index 67194038f75..00000000000 --- a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/Monkey.java +++ /dev/null @@ -1,31 +0,0 @@ -/* - * - * Copyright 2016 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ -package springfox.documentation.spring.web.dummy.models; - -public class Monkey { - private Pirate pirate; - - public Pirate getPirate() { - return pirate; - } - - public void setPirate(Pirate pirate) { - this.pirate = pirate; - } -} diff --git a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/NestedType.java b/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/NestedType.java deleted file mode 100644 index 95456f665dc..00000000000 --- a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/NestedType.java +++ /dev/null @@ -1,36 +0,0 @@ -/* - * - * Copyright 2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.spring.web.dummy.models; - -public class NestedType { - private String name; - - public NestedType(String name) { - this.name = name; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } -} diff --git a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/OtherType.java b/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/OtherType.java deleted file mode 100644 index 40a27475a1f..00000000000 --- a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/OtherType.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * - * Copyright 2017 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ -package springfox.documentation.spring.web.dummy.models; - -public class OtherType { - private String string2; - private SomeType parent; - - public String getString2() { - return string2; - } - - public void setString2(String string2) { - this.string2 = string2; - } - - public SomeType getParent() { - return parent; - } - - public void setParent(final SomeType parent) { - this.parent = parent; - } -} diff --git a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/Parent.java b/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/Parent.java deleted file mode 100644 index b63d5019049..00000000000 --- a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/Parent.java +++ /dev/null @@ -1,34 +0,0 @@ -/* - * - * Copyright 2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.spring.web.dummy.models; - -public class Parent { - - private String parentBeanProperty; - - public String getParentBeanProperty() { - return parentBeanProperty; - } - - public void setParentBeanProperty(final String parentBeanProperty) { - this.parentBeanProperty = parentBeanProperty; - } - -} diff --git a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/Pet.java b/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/Pet.java deleted file mode 100644 index 45a60e60a16..00000000000 --- a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/Pet.java +++ /dev/null @@ -1,50 +0,0 @@ -/* - * - * Copyright 2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.spring.web.dummy.models; - -public class Pet { - private String id; - private String name; - private int age; - - public String getId() { - return id; - } - - public void setId(String id) { - this.id = id; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public int getAge() { - return age; - } - - public void setAge(int age) { - this.age = age; - } -} diff --git a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/PetWithJsonView.java b/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/PetWithJsonView.java deleted file mode 100644 index c75754edd35..00000000000 --- a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/PetWithJsonView.java +++ /dev/null @@ -1,71 +0,0 @@ -/* - * - * Copyright 2017 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.spring.web.dummy.models; - -import com.fasterxml.jackson.annotation.JsonView; - -import springfox.documentation.schema.Views; - -public class PetWithJsonView { - - @JsonView(Views.FirstView.class) - private String id; - - @JsonView(Views.FirstView.class) - private String name; - - private int age; - - @JsonView(Views.SecondView.class) - private String color; - - public String getId() { - return id; - } - - public void setId(String id) { - this.id = id; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public int getAge() { - return age; - } - - public void setAge(int age) { - this.age = age; - } - - public String getColor() { - return color; - } - - public void setColor(String color) { - this.color = color; - } - -} diff --git a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/PetWithSerializer.java b/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/PetWithSerializer.java deleted file mode 100644 index 69ccaaf79ee..00000000000 --- a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/PetWithSerializer.java +++ /dev/null @@ -1,25 +0,0 @@ -/* - * - * Copyright 2017-2019 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ -package springfox.documentation.spring.web.dummy.models; - -import com.fasterxml.jackson.databind.annotation.JsonSerialize; - -@JsonSerialize(as = Pet.class) -public class PetWithSerializer { -} diff --git a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/Pirate.java b/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/Pirate.java deleted file mode 100644 index 409a0e46556..00000000000 --- a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/Pirate.java +++ /dev/null @@ -1,31 +0,0 @@ -/* - * - * Copyright 2016 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ -package springfox.documentation.spring.web.dummy.models; - -public class Pirate { - private Monkey monkey; - - public Monkey getMonkey() { - return monkey; - } - - public void setMonkey(Monkey monkey) { - this.monkey = monkey; - } -} diff --git a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/RecursiveTypeWithConditions.java b/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/RecursiveTypeWithConditions.java deleted file mode 100644 index 45ca17c0bf8..00000000000 --- a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/RecursiveTypeWithConditions.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - * - * Copyright 2019 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ -package springfox.documentation.spring.web.dummy.models; - -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.JsonProperty.Access; - -public class RecursiveTypeWithConditions extends Pirate { - - @JsonProperty(access = Access.WRITE_ONLY) - private String conditionalProperty; - - public String getConditionalProperty() { - return conditionalProperty; - } - - public void setConditionalProperty(String conditionalProperty) { - this.conditionalProperty = conditionalProperty; - } - -} diff --git a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/RecursiveTypeWithNonEqualsConditionsInner.java b/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/RecursiveTypeWithNonEqualsConditionsInner.java deleted file mode 100644 index 6e0a1b74522..00000000000 --- a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/RecursiveTypeWithNonEqualsConditionsInner.java +++ /dev/null @@ -1,34 +0,0 @@ -/* - * - * Copyright 2019 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ -package springfox.documentation.spring.web.dummy.models; - -public class RecursiveTypeWithNonEqualsConditionsInner { - - private RecursiveTypeWithNonEqualsConditionsOuter recursiveTypeWithNonEqualsConditionsOuter; - - public RecursiveTypeWithNonEqualsConditionsOuter getRecursiveTypeWithNonEqualsConditionsOuter() { - return recursiveTypeWithNonEqualsConditionsOuter; - } - - public void setRecursiveTypeWithNonEqualsConditionsOuter( - RecursiveTypeWithNonEqualsConditionsOuter recursiveTypeWithNonEqualsConditionsOuter) { - this.recursiveTypeWithNonEqualsConditionsOuter = recursiveTypeWithNonEqualsConditionsOuter; - } - -} diff --git a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/RecursiveTypeWithNonEqualsConditionsInnerWithCircle.java b/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/RecursiveTypeWithNonEqualsConditionsInnerWithCircle.java deleted file mode 100644 index a9dd16086b1..00000000000 --- a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/RecursiveTypeWithNonEqualsConditionsInnerWithCircle.java +++ /dev/null @@ -1,34 +0,0 @@ -/* - * - * Copyright 2019 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ -package springfox.documentation.spring.web.dummy.models; - -public class RecursiveTypeWithNonEqualsConditionsInnerWithCircle { - - private RecursiveTypeWithNonEqualsConditionsOuterWithCircle recursiveTypeWithNonEqualsConditionsOuterWithCircle; - - public RecursiveTypeWithNonEqualsConditionsOuterWithCircle getRecursiveTypeWithNonEqualsConditionsOuterWithCircle() { - return recursiveTypeWithNonEqualsConditionsOuterWithCircle; - } - - public void setRecursiveTypeWithNonEqualsConditionsOuterWithCircle( - RecursiveTypeWithNonEqualsConditionsOuterWithCircle recursiveTypeWithNonEqualsConditionsOuterWithCircle) { - this.recursiveTypeWithNonEqualsConditionsOuterWithCircle = recursiveTypeWithNonEqualsConditionsOuterWithCircle; - } - -} diff --git a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/RecursiveTypeWithNonEqualsConditionsInnerWithModel.java b/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/RecursiveTypeWithNonEqualsConditionsInnerWithModel.java deleted file mode 100644 index dd29f1723f0..00000000000 --- a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/RecursiveTypeWithNonEqualsConditionsInnerWithModel.java +++ /dev/null @@ -1,34 +0,0 @@ -/* - * - * Copyright 2019 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ -package springfox.documentation.spring.web.dummy.models; - -public class RecursiveTypeWithNonEqualsConditionsInnerWithModel { - - private RecursiveTypeWithNonEqualsConditionsOuterWithModel recursiveTypeWithNonEqualsConditionsOuterWithModel; - - public RecursiveTypeWithNonEqualsConditionsOuterWithModel getRecursiveTypeWithNonEqualsConditionsOuterWithModel() { - return recursiveTypeWithNonEqualsConditionsOuterWithModel; - } - - public void setRecursiveTypeWithNonEqualsConditionsOuterWithModel( - RecursiveTypeWithNonEqualsConditionsOuterWithModel recursiveTypeWithNonEqualsConditionsOuterWithModel) { - this.recursiveTypeWithNonEqualsConditionsOuterWithModel = recursiveTypeWithNonEqualsConditionsOuterWithModel; - } - -} diff --git a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/RecursiveTypeWithNonEqualsConditionsMiddle.java b/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/RecursiveTypeWithNonEqualsConditionsMiddle.java deleted file mode 100644 index 659c4cbff77..00000000000 --- a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/RecursiveTypeWithNonEqualsConditionsMiddle.java +++ /dev/null @@ -1,34 +0,0 @@ -/* - * - * Copyright 2019 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ -package springfox.documentation.spring.web.dummy.models; - -public class RecursiveTypeWithNonEqualsConditionsMiddle { - - private RecursiveTypeWithNonEqualsConditionsInner recursiveTypeWithNonEqualsConditionsInner; - - public RecursiveTypeWithNonEqualsConditionsInner getRecursiveTypeWithNonEqualsConditionsInner() { - return recursiveTypeWithNonEqualsConditionsInner; - } - - public void setRecursiveTypeWithNonEqualsConditionsInner( - RecursiveTypeWithNonEqualsConditionsInner recursiveTypeWithNonEqualsConditionsInner) { - this.recursiveTypeWithNonEqualsConditionsInner = recursiveTypeWithNonEqualsConditionsInner; - } - -} diff --git a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/RecursiveTypeWithNonEqualsConditionsMiddleWithCircle.java b/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/RecursiveTypeWithNonEqualsConditionsMiddleWithCircle.java deleted file mode 100644 index e4274d5e228..00000000000 --- a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/RecursiveTypeWithNonEqualsConditionsMiddleWithCircle.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * - * Copyright 2019 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ -package springfox.documentation.spring.web.dummy.models; - -public class RecursiveTypeWithNonEqualsConditionsMiddleWithCircle { - - private RecursiveTypeWithNonEqualsConditionsInnerWithCircle recursiveTypeWithNonEqualsConditionsInnerWithCircle; - - private RecursiveTypeWithNonEqualsConditionsMiddleWithModel recursiveTypeWithNonEqualsConditionsMiddleWithModel; - - public RecursiveTypeWithNonEqualsConditionsInnerWithCircle getRecursiveTypeWithNonEqualsConditionsInnerWithCircle() { - return recursiveTypeWithNonEqualsConditionsInnerWithCircle; - } - - public void setRecursiveTypeWithNonEqualsConditionsInnerWithCircle( - RecursiveTypeWithNonEqualsConditionsInnerWithCircle recursiveTypeWithNonEqualsConditionsInnerWithCircle) { - this.recursiveTypeWithNonEqualsConditionsInnerWithCircle = recursiveTypeWithNonEqualsConditionsInnerWithCircle; - } - - public RecursiveTypeWithNonEqualsConditionsMiddleWithModel getRecursiveTypeWithNonEqualsConditionsMiddleWithModel() { - return recursiveTypeWithNonEqualsConditionsMiddleWithModel; - } - - public void setRecursiveTypeWithNonEqualsConditionsMiddleWithModel( - RecursiveTypeWithNonEqualsConditionsMiddleWithModel recursiveTypeWithNonEqualsConditionsMiddleWithModel) { - this.recursiveTypeWithNonEqualsConditionsMiddleWithModel = recursiveTypeWithNonEqualsConditionsMiddleWithModel; - } - -} diff --git a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/RecursiveTypeWithNonEqualsConditionsMiddleWithModel.java b/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/RecursiveTypeWithNonEqualsConditionsMiddleWithModel.java deleted file mode 100644 index bbf9be2f191..00000000000 --- a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/RecursiveTypeWithNonEqualsConditionsMiddleWithModel.java +++ /dev/null @@ -1,59 +0,0 @@ -/* - * - * Copyright 2019 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ -package springfox.documentation.spring.web.dummy.models; - -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.JsonProperty.Access; - -public class RecursiveTypeWithNonEqualsConditionsMiddleWithModel { - - private RecursiveTypeWithNonEqualsConditionsMiddleWithModel recursiveTypeWithNonEqualsConditionsMiddleWithModel; - - private RecursiveTypeWithNonEqualsConditionsInnerWithModel recursiveTypeWithNonEqualsConditionsInnerWithModel; - - @JsonProperty(access = Access.WRITE_ONLY) - private Pet pet; - - public RecursiveTypeWithNonEqualsConditionsMiddleWithModel getRecursiveTypeWithNonEqualsConditionsMiddleWithModel() { - return recursiveTypeWithNonEqualsConditionsMiddleWithModel; - } - - public void setRecursiveTypeWithNonEqualsConditionsMiddleWithModel( - RecursiveTypeWithNonEqualsConditionsMiddleWithModel recursiveTypeWithNonEqualsConditionsMiddleWithModel) { - this.recursiveTypeWithNonEqualsConditionsMiddleWithModel = recursiveTypeWithNonEqualsConditionsMiddleWithModel; - } - - public RecursiveTypeWithNonEqualsConditionsInnerWithModel getRecursiveTypeWithNonEqualsConditionsInnerWithModel() { - return recursiveTypeWithNonEqualsConditionsInnerWithModel; - } - - public void setRecursiveTypeWithNonEqualsConditionsInnerWithModel( - RecursiveTypeWithNonEqualsConditionsInnerWithModel recursiveTypeWithNonEqualsConditionsInnerWithModel) { - this.recursiveTypeWithNonEqualsConditionsInnerWithModel = recursiveTypeWithNonEqualsConditionsInnerWithModel; - } - - public Pet getPet() { - return pet; - } - - public void setPet(Pet pet) { - this.pet = pet; - } - -} diff --git a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/RecursiveTypeWithNonEqualsConditionsOuter.java b/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/RecursiveTypeWithNonEqualsConditionsOuter.java deleted file mode 100644 index cb23bd12f0b..00000000000 --- a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/RecursiveTypeWithNonEqualsConditionsOuter.java +++ /dev/null @@ -1,48 +0,0 @@ -/* - * - * Copyright 2019 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ -package springfox.documentation.spring.web.dummy.models; - -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.JsonProperty.Access; - -public class RecursiveTypeWithNonEqualsConditionsOuter { - - @JsonProperty(access = Access.WRITE_ONLY) - private String conditionalProperty; - - private RecursiveTypeWithNonEqualsConditionsMiddle recursiveTypeWithNonEqualsConditionsMiddle; - - public RecursiveTypeWithNonEqualsConditionsMiddle getRecursiveTypeWithNonEqualsConditionsMiddle() { - return recursiveTypeWithNonEqualsConditionsMiddle; - } - - public void setRecursiveTypeWithNonEqualsConditionsMiddle( - RecursiveTypeWithNonEqualsConditionsMiddle recursiveTypeWithNonEqualsConditionsMiddle) { - this.recursiveTypeWithNonEqualsConditionsMiddle = recursiveTypeWithNonEqualsConditionsMiddle; - } - - public String getConditionalProperty() { - return conditionalProperty; - } - - public void setConditionalProperty(String conditionalProperty) { - this.conditionalProperty = conditionalProperty; - } - -} diff --git a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/RecursiveTypeWithNonEqualsConditionsOuterWithCircle.java b/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/RecursiveTypeWithNonEqualsConditionsOuterWithCircle.java deleted file mode 100644 index 09e1e78541e..00000000000 --- a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/RecursiveTypeWithNonEqualsConditionsOuterWithCircle.java +++ /dev/null @@ -1,34 +0,0 @@ -/* - * - * Copyright 2019 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ -package springfox.documentation.spring.web.dummy.models; - -public class RecursiveTypeWithNonEqualsConditionsOuterWithCircle { - - private RecursiveTypeWithNonEqualsConditionsMiddleWithCircle recursiveTypeWithNonEqualsCondsMiddleWithCircle; - - public RecursiveTypeWithNonEqualsConditionsMiddleWithCircle getRecursiveTypeWithNonEqualsCondsMiddleWithCircle() { - return recursiveTypeWithNonEqualsCondsMiddleWithCircle; - } - - public void setRecursiveTypeWithNonEqualsCondsMiddleWithCircle( - RecursiveTypeWithNonEqualsConditionsMiddleWithCircle recursiveTypeWithNonEqualsCondsMiddleWithCircle) { - this.recursiveTypeWithNonEqualsCondsMiddleWithCircle = recursiveTypeWithNonEqualsCondsMiddleWithCircle; - } - -} diff --git a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/RecursiveTypeWithNonEqualsConditionsOuterWithModel.java b/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/RecursiveTypeWithNonEqualsConditionsOuterWithModel.java deleted file mode 100644 index f4b34b7c010..00000000000 --- a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/RecursiveTypeWithNonEqualsConditionsOuterWithModel.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * - * Copyright 2019 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ -package springfox.documentation.spring.web.dummy.models; - -public class RecursiveTypeWithNonEqualsConditionsOuterWithModel { - - private RecursiveTypeWithNonEqualsConditionsOuterWithModel recursiveTypeWithNonEqualsConditionsOuterWithModel; - - private RecursiveTypeWithNonEqualsConditionsMiddleWithModel recursiveTypeWithNonEqualsConditionsMiddleWithModel; - - public RecursiveTypeWithNonEqualsConditionsOuterWithModel getRecursiveTypeWithNonEqualsConditionsOuterWithModel() { - return recursiveTypeWithNonEqualsConditionsOuterWithModel; - } - - public void setRecursiveTypeWithNonEqualsConditionsOuterWithModel( - RecursiveTypeWithNonEqualsConditionsOuterWithModel recursiveTypeWithNonEqualsConditionsOuterWithModel) { - this.recursiveTypeWithNonEqualsConditionsOuterWithModel = recursiveTypeWithNonEqualsConditionsOuterWithModel; - } - - public RecursiveTypeWithNonEqualsConditionsMiddleWithModel getRecursiveTypeWithNonEqualsConditionsMiddleWithModel() { - return recursiveTypeWithNonEqualsConditionsMiddleWithModel; - } - - public void setRecursiveTypeWithNonEqualsConditionsMiddleWithModel( - RecursiveTypeWithNonEqualsConditionsMiddleWithModel recursiveTypeWithNonEqualsConditionsMiddleWithModel) { - this.recursiveTypeWithNonEqualsConditionsMiddleWithModel = recursiveTypeWithNonEqualsConditionsMiddleWithModel; - } - -} diff --git a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/RecursiveTypeWithNonEqualsConditionsOuterWithSubTypes.java b/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/RecursiveTypeWithNonEqualsConditionsOuterWithSubTypes.java deleted file mode 100644 index 82f6bcce874..00000000000 --- a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/RecursiveTypeWithNonEqualsConditionsOuterWithSubTypes.java +++ /dev/null @@ -1,26 +0,0 @@ -/* - * - * Copyright 2019 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ -package springfox.documentation.spring.web.dummy.models; - -import com.fasterxml.jackson.annotation.JsonSubTypes; - -@JsonSubTypes(@JsonSubTypes.Type(value = RecursiveTypeWithConditions.class, name = "RecursiveTypeWithConditions")) -public class RecursiveTypeWithNonEqualsConditionsOuterWithSubTypes extends RecursiveTypeWithNonEqualsConditionsOuter { - -} diff --git a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/Region.java b/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/Region.java deleted file mode 100644 index fd5000fe1ef..00000000000 --- a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/Region.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * - * Copyright 2020 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ -package springfox.documentation.spring.web.dummy.models; - -import java.util.List; - -public class Region { - - private List cities; - - private Country country; - - public List getCities() { - return cities; - } - - public void setCities(List cities) { - this.cities = cities; - } - - public Country getCountry() { - return country; - } - - public void setCountry(Country country) { - this.country = country; - } - -} diff --git a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/Response.java b/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/Response.java deleted file mode 100644 index bc5f80c3a16..00000000000 --- a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/Response.java +++ /dev/null @@ -1,57 +0,0 @@ -/* - * - * Copyright 2017-2019 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ -package springfox.documentation.spring.web.dummy.models; - -import com.fasterxml.jackson.annotation.JsonProperty; - -import java.util.List; - -public class Response { - - @JsonProperty("uuid") - private String uuid; - @JsonProperty("data") - private T data; - @JsonProperty("errors") - private List errors; - - public String getUuid() { - return uuid; - } - - public void setUuid(final String uuid) { - this.uuid = uuid; - } - - public T getData() { - return data; - } - - public void setData(final T data) { - this.data = data; - } - - public List getErrors() { - return errors; - } - - public void setErrors(final List errors) { - this.errors = errors; - } -} diff --git a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/SameCategory.java b/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/SameCategory.java deleted file mode 100644 index 30dd7eacf76..00000000000 --- a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/SameCategory.java +++ /dev/null @@ -1,58 +0,0 @@ -/* - * - * Copyright 2017 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.spring.web.dummy.models; - -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.JsonProperty.Access; - -import io.swagger.annotations.ApiModelProperty; - -public class SameCategory extends Category { - - @ApiModelProperty(value = "Id field", required = true) - private Integer id; - - @ApiModelProperty(value = "Type field", readOnly = true) - private String type; - - public SameCategory(String name, Integer id, String type) { - super(name); - this.id = id; - this.type = type; - } - - @JsonProperty(value = "_id", access = Access.WRITE_ONLY) - public Integer getId() { - return id; - } - - public void setId(Integer id) { - this.id = id; - } - - @JsonProperty(value = "_type", access = Access.READ_ONLY) - public String getType() { - return type; - } - - public void setType(String type) { - this.type = type; - } -} \ No newline at end of file diff --git a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/SameFancyPet.java b/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/SameFancyPet.java deleted file mode 100644 index 88e4d8f1d39..00000000000 --- a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/SameFancyPet.java +++ /dev/null @@ -1,33 +0,0 @@ -/* - * - * Copyright 2017 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.spring.web.dummy.models; - -public class SameFancyPet extends SamePet { - - private SameCategory extendedCategory; - - public SameCategory getExtendedCategory() { - return extendedCategory; - } - - public void setExtendedCategory(SameCategory extendedCategories) { - this.extendedCategory = extendedCategories; - } -} \ No newline at end of file diff --git a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/SamePet.java b/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/SamePet.java deleted file mode 100644 index c973e8da7f9..00000000000 --- a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/SamePet.java +++ /dev/null @@ -1,73 +0,0 @@ -/* - * - * Copyright 2017 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.spring.web.dummy.models; - -import com.fasterxml.jackson.annotation.JsonIgnore; -import com.fasterxml.jackson.annotation.JsonProperty; - -public class SamePet { - private String id; - private String name; - private int age; - private String color; - private Double weight; - - public String getId() { - return id; - } - - public void setId(String id) { - this.id = id; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public int getAge() { - return age; - } - - public void setAge(int age) { - this.age = age; - } - - public String getColor() { - return color; - } - - public void setColor(String color) { - this.color = color; - } - - @JsonIgnore - public Double getWeight() { - return weight; - } - - @JsonProperty("pet_weight") - public void setWeight(Double weight) { - this.weight = weight; - } -} \ No newline at end of file diff --git a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/SomeType.java b/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/SomeType.java deleted file mode 100644 index 730c0ffad22..00000000000 --- a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/SomeType.java +++ /dev/null @@ -1,51 +0,0 @@ -/* - * - * Copyright 2017 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ -package springfox.documentation.spring.web.dummy.models; - -import java.util.List; - -public class SomeType { - private String string1; - private OtherType otherType; - private List someOtherTypes; - - public List getSomeOtherTypes() { - return someOtherTypes; - } - - public void setSomeOtherTypes(List someOtherTypes) { - this.someOtherTypes = someOtherTypes; - } - - public String getString1() { - return string1; - } - - public void setString1(String string1) { - this.string1 = string1; - } - - public OtherType getOtherType() { - return otherType; - } - - public void setOtherType(final OtherType otherType) { - this.otherType = otherType; - } -} diff --git a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/Street.java b/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/Street.java deleted file mode 100644 index 530bdfc00d7..00000000000 --- a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/Street.java +++ /dev/null @@ -1,75 +0,0 @@ -/* - * - * Copyright 2020 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ -package springfox.documentation.spring.web.dummy.models; - -import java.util.List; - -public class Street { - - private List houses; - - private District district; - - private City city; - - private Region region; - - private Country country; - - public List getHouses() { - return houses; - } - - public void setHouses(List houses) { - this.houses = houses; - } - - public District getDistrict() { - return district; - } - - public void setDistrict(District district) { - this.district = district; - } - - public City getCity() { - return city; - } - - public void setCity(City city) { - this.city = city; - } - - public Region getRegion() { - return region; - } - - public void setRegion(Region region) { - this.region = region; - } - - public Country getCountry() { - return country; - } - - public void setCountry(Country country) { - this.country = country; - } - -} diff --git a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/Treeish.java b/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/Treeish.java deleted file mode 100644 index 9f744ecc2b2..00000000000 --- a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/Treeish.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * - * Copyright 2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.spring.web.dummy.models; - -public class Treeish implements java.io.Serializable { - private Treeish example; - private String treeishField; - - public Treeish getExample() { - return example; - } - - public void setExample(Treeish example) { - this.example = example; - } - - public Treeish(Treeish example) { - this.example = example; - } - - public String getTreeishField() { - return treeishField; - } - - public void setTreeishField(String treeishField) { - this.treeishField = treeishField; - } -} diff --git a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/Truck.java b/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/Truck.java deleted file mode 100644 index 1c4642563d5..00000000000 --- a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/Truck.java +++ /dev/null @@ -1,39 +0,0 @@ -/* - * - * Copyright 2017-2019 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ -package springfox.documentation.spring.web.dummy.models; - -public class Truck extends Vehicle { - private double payloadCapacity; - - public Truck() { - } - - public Truck(String make, String model, double payloadCapacity) { - super(make, model); - this.payloadCapacity = payloadCapacity; - } - - public double getPayloadCapacity() { - return payloadCapacity; - } - - public void setPayloadCapacity(double payloadCapacity) { - this.payloadCapacity = payloadCapacity; - } -} \ No newline at end of file diff --git a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/Vehicle.java b/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/Vehicle.java deleted file mode 100644 index 2f510dfa7a9..00000000000 --- a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/Vehicle.java +++ /dev/null @@ -1,59 +0,0 @@ -/* - * - * Copyright 2017-2019 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ -package springfox.documentation.spring.web.dummy.models; - -import com.fasterxml.jackson.annotation.JsonSubTypes; -import com.fasterxml.jackson.annotation.JsonTypeInfo; - -@JsonTypeInfo( - use = JsonTypeInfo.Id.NAME, - include = JsonTypeInfo.As.PROPERTY, - property = "type") -@JsonSubTypes({ - @JsonSubTypes.Type(value = Car.class, name = "car"), - @JsonSubTypes.Type(value = Truck.class, name = "truck") -}) -public abstract class Vehicle { - private String make; - private String model; - - public Vehicle() { - } - - protected Vehicle(String make, String model) { - this.make = make; - this.model = model; - } - - public String getMake() { - return make; - } - - public void setMake(String make) { - this.make = make; - } - - public String getModel() { - return model; - } - - public void setModel(String model) { - this.model = model; - } -} \ No newline at end of file diff --git a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/Wrapper.java b/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/Wrapper.java deleted file mode 100644 index 9273c3792f8..00000000000 --- a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/Wrapper.java +++ /dev/null @@ -1,15 +0,0 @@ -package springfox.documentation.spring.web.dummy.models; - -public class Wrapper { - - private T object; - - public T getObject() { - return object; - } - - public void setObject(T object) { - this.object = object; - } - -} diff --git a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/same/Pet.java b/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/same/Pet.java deleted file mode 100755 index 25d9600bb95..00000000000 --- a/springfox-spring-web/src/test/java/springfox/documentation/spring/web/dummy/models/same/Pet.java +++ /dev/null @@ -1,50 +0,0 @@ -/* - * - * Copyright 2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.spring.web.dummy.models.same; - -public class Pet { - private String id; - private String name; - private int age; - - public String getId() { - return id; - } - - public void setId(String id) { - this.id = id; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public int getAge() { - return age; - } - - public void setAge(int age) { - this.age = age; - } -} diff --git a/springfox-spring-webflux/build.gradle b/springfox-spring-webflux/build.gradle deleted file mode 100644 index 4500082233c..00000000000 --- a/springfox-spring-webflux/build.gradle +++ /dev/null @@ -1,31 +0,0 @@ -ext { - limits = [ - 'instruction': 96.5, - 'branch' : 91, - 'line' : 96.5, - 'complexity' : 92, - 'method' : 96, - 'class' : 100 - ] -} - -dependencies { - implementation project(':springfox-spi') - implementation project(':springfox-schema') - implementation project(':springfox-core') - implementation project(':springfox-spring-web') - - api libs.core - api libs.spring - - compileOnly libs.springProvidedWithFlux - compileOnly libs.clientProvided - compileOnly libs.springBootProvided - - testImplementation libs.test - testImplementation libs.swagger2Core - testImplementation project(':springfox-core').sourceSets.test.output - testImplementation project(':springfox-spring-web').sourceSets.test.output - testImplementation project(':springfox-schema').sourceSets.test.output - testImplementation "javax.validation:validation-api:$validationApiVersion" -} diff --git a/springfox-spring-webflux/src/main/java/springfox/documentation/spring/web/WebFluxNameValueExpressionWrapper.java b/springfox-spring-webflux/src/main/java/springfox/documentation/spring/web/WebFluxNameValueExpressionWrapper.java deleted file mode 100644 index 920b360077d..00000000000 --- a/springfox-spring-webflux/src/main/java/springfox/documentation/spring/web/WebFluxNameValueExpressionWrapper.java +++ /dev/null @@ -1,68 +0,0 @@ -/* - * - * Copyright 2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.spring.web; - -import springfox.documentation.spring.wrapper.NameValueExpression; - -import java.util.Objects; -import java.util.Set; -import java.util.stream.Collectors; - -public class WebFluxNameValueExpressionWrapper implements NameValueExpression { - private org.springframework.web.reactive.result.condition.NameValueExpression wrapped; - - private WebFluxNameValueExpressionWrapper( - org.springframework.web.reactive.result.condition.NameValueExpression wrapped) { - this.wrapped = wrapped; - } - - public static Set> from( - Set> springSet) { - - return springSet.stream() - .map(WebFluxNameValueExpressionWrapper::new) - .collect(Collectors.toSet()); - } - - @Override - public String getName() { - return wrapped.getName(); - } - - @Override - public T getValue() { - return wrapped.getValue(); - } - - @Override - public boolean isNegated() { - return wrapped.isNegated(); - } - - @Override - public int hashCode() { - return Objects.hash(wrapped); - } - - @Override - public boolean equals(Object obj) { - return Objects.equals(wrapped, obj); - } -} diff --git a/springfox-spring-webflux/src/main/java/springfox/documentation/spring/web/WebFluxPatternsRequestConditionWrapper.java b/springfox-spring-webflux/src/main/java/springfox/documentation/spring/web/WebFluxPatternsRequestConditionWrapper.java deleted file mode 100644 index b5ff7d96b7b..00000000000 --- a/springfox-spring-webflux/src/main/java/springfox/documentation/spring/web/WebFluxPatternsRequestConditionWrapper.java +++ /dev/null @@ -1,72 +0,0 @@ -/* - * - * Copyright 2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.spring.web; - -import org.springframework.web.reactive.result.condition.PatternsRequestCondition; -import org.springframework.web.util.pattern.PathPattern; - -import java.util.Set; -import java.util.stream.Collectors; - -public class WebFluxPatternsRequestConditionWrapper - implements springfox.documentation.spring.wrapper.PatternsRequestCondition { - - private final PatternsRequestCondition wrapped; - - public WebFluxPatternsRequestConditionWrapper(PatternsRequestCondition wrapped) { - this.wrapped = wrapped; - } - - @Override - public springfox.documentation.spring.wrapper.PatternsRequestCondition combine( - springfox.documentation.spring.wrapper.PatternsRequestCondition other) { - if (other instanceof WebFluxPatternsRequestConditionWrapper && !this.equals(other)) { - return new WebFluxPatternsRequestConditionWrapper( - wrapped.combine(((WebFluxPatternsRequestConditionWrapper) other).wrapped)); - } - return this; - } - - @Override - public Set getPatterns() { - return this.wrapped.getPatterns().stream() - .map(PathPattern::getPatternString) - .collect(Collectors.toSet()); - } - - @Override - public boolean equals(Object other) { - if (other instanceof WebFluxPatternsRequestConditionWrapper) { - return wrapped.equals(((WebFluxPatternsRequestConditionWrapper) other).wrapped); - } - return false; - } - - @Override - public int hashCode() { - return this.wrapped.hashCode(); - } - - @Override - public String toString() { - return this.wrapped.toString(); - } -} - diff --git a/springfox-spring-webflux/src/main/java/springfox/documentation/spring/web/WebFluxRequestHandler.java b/springfox-spring-webflux/src/main/java/springfox/documentation/spring/web/WebFluxRequestHandler.java deleted file mode 100644 index a5d40300b14..00000000000 --- a/springfox-spring-webflux/src/main/java/springfox/documentation/spring/web/WebFluxRequestHandler.java +++ /dev/null @@ -1,158 +0,0 @@ -/* - * - * Copyright 2016-2017 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ -package springfox.documentation.spring.web; - -import com.fasterxml.classmate.ResolvedType; -import org.springframework.core.annotation.AnnotationUtils; -import org.springframework.http.MediaType; -import org.springframework.web.bind.annotation.RequestMethod; -import org.springframework.web.method.HandlerMethod; -import org.springframework.web.reactive.result.method.RequestMappingInfo; -import org.springframework.web.util.pattern.PathPattern; -import springfox.documentation.RequestHandler; -import springfox.documentation.RequestHandlerKey; -import springfox.documentation.service.ResolvedMethodParameter; -import springfox.documentation.spring.web.readers.operation.HandlerMethodResolver; -import springfox.documentation.spring.wrapper.NameValueExpression; -import springfox.documentation.spring.wrapper.PatternsRequestCondition; - -import java.lang.annotation.Annotation; -import java.util.List; -import java.util.Optional; -import java.util.Set; -import java.util.StringJoiner; -import java.util.stream.Collectors; - -public class WebFluxRequestHandler implements RequestHandler { - private final HandlerMethodResolver methodResolver; - private final RequestMappingInfo requestMapping; - private final HandlerMethod handlerMethod; - - public WebFluxRequestHandler( - HandlerMethodResolver methodResolver, - RequestMappingInfo requestMapping, - HandlerMethod handlerMethod) { - this.methodResolver = methodResolver; - this.requestMapping = requestMapping; - this.handlerMethod = handlerMethod; - } - - @Override - public HandlerMethod getHandlerMethod() { - return handlerMethod; - } - - @Override - public RequestHandler combine(RequestHandler other) { - return this; - } - - @Override - public Class declaringClass() { - return handlerMethod.getBeanType(); - } - - @Override - public boolean isAnnotatedWith(Class annotation) { - return null != AnnotationUtils.findAnnotation(handlerMethod.getMethod(), annotation); - } - - @Override - public PatternsRequestCondition getPatternsCondition() { - return new WebFluxPatternsRequestConditionWrapper(requestMapping.getPatternsCondition()); - } - - @Override - public String groupName() { - return ControllerNamingUtils.controllerNameAsGroup(handlerMethod); - } - - @Override - public String getName() { - return handlerMethod.getMethod().getName(); - } - - @Override - public Set supportedMethods() { - return requestMapping.getMethodsCondition().getMethods(); - } - - @Override - public Set produces() { - return requestMapping.getProducesCondition().getProducibleMediaTypes(); - } - - @Override - public Set consumes() { - return requestMapping.getConsumesCondition().getConsumableMediaTypes(); - } - - @Override - public Set> headers() { - return WebFluxNameValueExpressionWrapper.from(requestMapping.getHeadersCondition().getExpressions()); - } - - @Override - public Set> params() { - return WebFluxNameValueExpressionWrapper.from(requestMapping.getParamsCondition().getExpressions()); - } - - @Override - public Optional findAnnotation(Class annotation) { - return Optional.ofNullable(AnnotationUtils.findAnnotation(handlerMethod.getMethod(), annotation)); - } - - @Override - public RequestHandlerKey key() { - return new RequestHandlerKey( - requestMapping.getPatternsCondition().getPatterns(), - requestMapping.getMethodsCondition().getMethods(), - requestMapping.getConsumesCondition().getConsumableMediaTypes(), - requestMapping.getProducesCondition().getProducibleMediaTypes()); - } - - @Override - public springfox.documentation.spring.wrapper.RequestMappingInfo getRequestMapping() { - throw new UnsupportedOperationException(); - } - - @Override - public List getParameters() { - return methodResolver.methodParameters(handlerMethod); - } - - @Override - public ResolvedType getReturnType() { - return methodResolver.methodReturnType(handlerMethod); - } - - @Override - public Optional findControllerAnnotation(Class annotation) { - return Optional.ofNullable(AnnotationUtils.findAnnotation(handlerMethod.getBeanType(), annotation)); - } - - @Override - public String toString() { - return new StringJoiner(", ", WebFluxRequestHandler.class.getSimpleName() + "{", "}") - .add("requestMapping=" + requestMapping) - .add("handlerMethod=" + handlerMethod) - .add("key=" + key()) - .toString(); - } -} diff --git a/springfox-spring-webflux/src/main/java/springfox/documentation/spring/web/plugins/WebFluxRequestHandlerProvider.java b/springfox-spring-webflux/src/main/java/springfox/documentation/spring/web/plugins/WebFluxRequestHandlerProvider.java deleted file mode 100644 index 4b40d5058f6..00000000000 --- a/springfox-spring-webflux/src/main/java/springfox/documentation/spring/web/plugins/WebFluxRequestHandlerProvider.java +++ /dev/null @@ -1,90 +0,0 @@ -/* - * - * Copyright 2015-2017 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ -package springfox.documentation.spring.web.plugins; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication; -import org.springframework.context.annotation.Conditional; -import org.springframework.core.Ordered; -import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Component; -import org.springframework.web.method.HandlerMethod; -import org.springframework.web.reactive.function.server.support.RouterFunctionMapping; -import org.springframework.web.reactive.result.method.RequestMappingInfo; -import org.springframework.web.reactive.result.method.RequestMappingInfoHandlerMapping; -import springfox.documentation.RequestHandler; -import springfox.documentation.spi.service.RequestHandlerProvider; -import springfox.documentation.spring.web.OnReactiveWebApplication; -import springfox.documentation.spring.web.WebFluxRequestHandler; -import springfox.documentation.spring.web.readers.operation.HandlerMethodResolver; - -import java.util.List; -import java.util.Map; -import java.util.function.Function; -import java.util.stream.StreamSupport; - -import static java.util.stream.Collectors.*; -import static springfox.documentation.builders.BuilderDefaults.*; -import static springfox.documentation.spi.service.contexts.Orderings.*; - -@Component -@Order(Ordered.HIGHEST_PRECEDENCE) -@ConditionalOnWebApplication(type = ConditionalOnWebApplication.Type.REACTIVE) -@Conditional(OnReactiveWebApplication.class) -public class WebFluxRequestHandlerProvider implements RequestHandlerProvider { - private final List handlerMappings; - private final HandlerMethodResolver methodResolver; - private final List routerFunctionMappings; - - @Autowired - public WebFluxRequestHandlerProvider( - HandlerMethodResolver methodResolver, - List handlerMappings, - List routerFunctionMappings) { - this.handlerMappings = handlerMappings; - this.methodResolver = methodResolver; - this.routerFunctionMappings = routerFunctionMappings; - } - - @Override - public List requestHandlers() { - return nullToEmptyList(handlerMappings).stream() - .filter(requestMappingInfoHandlerMapping -> - !("org.springframework.integration.webflux.inbound.WebFluxIntegrationRequestMappingHandlerMapping" - .equals(requestMappingInfoHandlerMapping.getClass() - .getName()))) - .map(toMappingEntries()) - .flatMap((entries -> StreamSupport.stream(entries.spliterator(), false))) - .map(toRequestHandler()) - .sorted(byPatternsCondition()) - .collect(toList()); - } - - private Function>> toMappingEntries() { - return input -> input.getHandlerMethods().entrySet(); - } - - private Function, RequestHandler> toRequestHandler() { - return input -> new WebFluxRequestHandler( - methodResolver, - input.getKey(), - input.getValue()); - } -} diff --git a/springfox-spring-webflux/src/main/resources/.gitkeep b/springfox-spring-webflux/src/main/resources/.gitkeep deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/springfox-spring-webflux/src/test/groovy/springfox/documentation/spring/web/dummy/controllers/GroovyService.groovy b/springfox-spring-webflux/src/test/groovy/springfox/documentation/spring/web/dummy/controllers/GroovyService.groovy deleted file mode 100644 index d91ebeef7a7..00000000000 --- a/springfox-spring-webflux/src/test/groovy/springfox/documentation/spring/web/dummy/controllers/GroovyService.groovy +++ /dev/null @@ -1,22 +0,0 @@ -package springfox.documentation.spring.web.dummy.controllers - -import org.springframework.stereotype.Controller -import org.springframework.web.bind.annotation.RequestBody -import org.springframework.web.bind.annotation.RequestMapping -import org.springframework.web.bind.annotation.RequestMethod -import org.springframework.web.bind.annotation.ResponseBody -import springfox.documentation.spring.web.dummy.models.GroovyModel - -@Controller -@RequestMapping("/groovy") -class GroovyService { - @RequestMapping(value = "groovyModel", method = RequestMethod.GET) - @ResponseBody - public GroovyModel groovyModel() { - return new GroovyModel("test"); - } - - @RequestMapping(value = "groovyModel", method = RequestMethod.PUT) - public void updateGroovyModel(@RequestBody GroovyModel model) { - } -} diff --git a/springfox-spring-webflux/src/test/groovy/springfox/documentation/spring/web/dummy/models/GroovyModel.groovy b/springfox-spring-webflux/src/test/groovy/springfox/documentation/spring/web/dummy/models/GroovyModel.groovy deleted file mode 100644 index 36cbab8f2eb..00000000000 --- a/springfox-spring-webflux/src/test/groovy/springfox/documentation/spring/web/dummy/models/GroovyModel.groovy +++ /dev/null @@ -1,17 +0,0 @@ -package springfox.documentation.spring.web.dummy.models - -class GroovyModel { - String stringProp - - GroovyModel(String stringProp) { - this.stringProp = stringProp - } - - String getStringProp() { - return stringProp - } - - void setStringProp(String stringProp) { - this.stringProp = stringProp - } -} diff --git a/springfox-spring-webmvc/build.gradle b/springfox-spring-webmvc/build.gradle deleted file mode 100644 index 423a5aa1299..00000000000 --- a/springfox-spring-webmvc/build.gradle +++ /dev/null @@ -1,36 +0,0 @@ -ext { - limits = [ - 'instruction': 96.5, - 'branch' : 91, - 'line' : 96.5, - 'complexity' : 92, - 'method' : 96, - 'class' : 100 - ] -} - -dependencies { - api project(':springfox-spi') - api project(':springfox-schema') - api project(':springfox-core') - api project(':springfox-spring-web') - - api libs.core - api libs.spring - - compileOnly libs.springProvidedWithMvc - compileOnly libs.clientProvided - compileOnly libs.springBootProvided - compileOnly "jakarta.servlet:jakarta.servlet-api:$servlet" - - testImplementation libs.test - testImplementation libs.swagger2Core - testImplementation project(':springfox-spring-web').sourceSets.test.output - testImplementation project(':springfox-core').sourceSets.test.output - testImplementation project(':springfox-schema').sourceSets.test.output - testImplementation "javax.validation:validation-api:$validationApiVersion" - testImplementation "jakarta.servlet:jakarta.servlet-api:$servlet" - testImplementation libs.springProvidedWithMvc - testImplementation libs.clientProvided - testImplementation libs.springBootProvided -} diff --git a/springfox-spring-webmvc/src/main/java/springfox/documentation/spring/web/OnNotServletBasedWebApplication.java b/springfox-spring-webmvc/src/main/java/springfox/documentation/spring/web/OnNotServletBasedWebApplication.java deleted file mode 100644 index a6593fcfda3..00000000000 --- a/springfox-spring-webmvc/src/main/java/springfox/documentation/spring/web/OnNotServletBasedWebApplication.java +++ /dev/null @@ -1,13 +0,0 @@ -package springfox.documentation.spring.web; - -import springfox.documentation.common.ClassNotPresentInClassPathCondition; - -public class OnNotServletBasedWebApplication extends ClassNotPresentInClassPathCondition { - private static final String SERVLET_WEB_APPLICATION_CLASS - = "org.springframework.web.context.support.GenericWebApplicationContext"; - - @Override - protected String getClassName() { - return SERVLET_WEB_APPLICATION_CLASS; - } -} diff --git a/springfox-spring-webmvc/src/main/java/springfox/documentation/spring/web/WebMvcNameValueExpressionWrapper.java b/springfox-spring-webmvc/src/main/java/springfox/documentation/spring/web/WebMvcNameValueExpressionWrapper.java deleted file mode 100644 index 6943a68a740..00000000000 --- a/springfox-spring-webmvc/src/main/java/springfox/documentation/spring/web/WebMvcNameValueExpressionWrapper.java +++ /dev/null @@ -1,68 +0,0 @@ -/* - * - * Copyright 2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.spring.web; - -import springfox.documentation.spring.wrapper.NameValueExpression; - -import java.util.Objects; -import java.util.Set; -import java.util.stream.Collectors; - -public class WebMvcNameValueExpressionWrapper implements NameValueExpression { - private org.springframework.web.servlet.mvc.condition.NameValueExpression wrapped; - - private WebMvcNameValueExpressionWrapper( - org.springframework.web.servlet.mvc.condition.NameValueExpression wrapped) { - this.wrapped = wrapped; - } - - public static Set> from( - Set> springSet) { - - return springSet.stream() - .map(WebMvcNameValueExpressionWrapper::new) - .collect(Collectors.toSet()); - } - - @Override - public String getName() { - return wrapped.getName(); - } - - @Override - public T getValue() { - return wrapped.getValue(); - } - - @Override - public boolean isNegated() { - return wrapped.isNegated(); - } - - @Override - public int hashCode() { - return Objects.hash(wrapped); - } - - @Override - public boolean equals(Object obj) { - return Objects.equals(wrapped, obj); - } -} diff --git a/springfox-spring-webmvc/src/main/java/springfox/documentation/spring/web/WebMvcPatternsRequestConditionWrapper.java b/springfox-spring-webmvc/src/main/java/springfox/documentation/spring/web/WebMvcPatternsRequestConditionWrapper.java deleted file mode 100644 index 80a6a31ffb7..00000000000 --- a/springfox-spring-webmvc/src/main/java/springfox/documentation/spring/web/WebMvcPatternsRequestConditionWrapper.java +++ /dev/null @@ -1,92 +0,0 @@ -/* - * - * Copyright 2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.spring.web; - -import org.springframework.web.servlet.mvc.condition.PathPatternsRequestCondition; -import org.springframework.web.servlet.mvc.condition.PatternsRequestCondition; - -import java.util.Collections; -import java.util.HashSet; -import java.util.Objects; -import java.util.Set; -import java.util.stream.Collectors; - -import static springfox.documentation.spring.web.paths.Paths.*; - -public class WebMvcPatternsRequestConditionWrapper - implements springfox.documentation.spring.wrapper.PatternsRequestCondition { - - private final String contextPath; - private final PathPatternsRequestCondition condition; - - public WebMvcPatternsRequestConditionWrapper( - String contextPath, - PathPatternsRequestCondition condition) { - - this.contextPath = contextPath; - this.condition = condition; - } - - @Override - public springfox.documentation.spring.wrapper.PatternsRequestCondition combine( - springfox.documentation.spring.wrapper.PatternsRequestCondition other) { - if (other instanceof WebMvcPatternsRequestConditionWrapper && !this.equals(other)) { - return new WebMvcPatternsRequestConditionWrapper( - contextPath, - condition.combine(((WebMvcPatternsRequestConditionWrapper) other).condition)); - } - return this; - } - - @Override - public Set getPatterns() { - if(null == this.condition){ - return new HashSet<>(); - } - return this.condition.getPatterns().stream() - .map(p -> String.format("%s/%s", maybeChompTrailingSlash(contextPath), maybeChompLeadingSlash(p.getPatternString()))) - .collect(Collectors.toSet()); - } - - - @Override - public boolean equals(Object o) { - if (o instanceof WebMvcPatternsRequestConditionWrapper) { - WebMvcPatternsRequestConditionWrapper oo = (WebMvcPatternsRequestConditionWrapper) o; - if(this.condition == null) { - return oo.condition == null; - } - return this.condition.equals(oo.condition); - } - return false; - } - - @Override - public int hashCode() { - return Objects.hashCode(this.condition); - } - - - @Override - public String toString() { - return String.valueOf(this.condition); - } -} - diff --git a/springfox-spring-webmvc/src/main/java/springfox/documentation/spring/web/WebMvcRequestHandler.java b/springfox-spring-webmvc/src/main/java/springfox/documentation/spring/web/WebMvcRequestHandler.java deleted file mode 100644 index 3230e85304c..00000000000 --- a/springfox-spring-webmvc/src/main/java/springfox/documentation/spring/web/WebMvcRequestHandler.java +++ /dev/null @@ -1,161 +0,0 @@ -/* - * - * Copyright 2016-2017 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ -package springfox.documentation.spring.web; - -import com.fasterxml.classmate.ResolvedType; -import org.springframework.core.annotation.AnnotationUtils; -import org.springframework.http.MediaType; -import org.springframework.web.bind.annotation.RequestMethod; -import org.springframework.web.method.HandlerMethod; -import org.springframework.web.servlet.mvc.method.RequestMappingInfo; -import springfox.documentation.RequestHandler; -import springfox.documentation.RequestHandlerKey; -import springfox.documentation.service.ResolvedMethodParameter; -import springfox.documentation.spring.web.readers.operation.HandlerMethodResolver; -import springfox.documentation.spring.wrapper.NameValueExpression; -import springfox.documentation.spring.wrapper.PatternsRequestCondition; - -import java.lang.annotation.Annotation; -import java.util.*; - -import static java.util.Optional.*; - -public class WebMvcRequestHandler implements RequestHandler { - private final String contextPath; - private final HandlerMethodResolver methodResolver; - private final RequestMappingInfo requestMapping; - private final HandlerMethod handlerMethod; - - public WebMvcRequestHandler( - String contextPath, - HandlerMethodResolver methodResolver, - RequestMappingInfo requestMapping, - HandlerMethod handlerMethod) { - this.contextPath = contextPath; - this.methodResolver = methodResolver; - this.requestMapping = requestMapping; - this.handlerMethod = handlerMethod; - } - - @Override - public HandlerMethod getHandlerMethod() { - return handlerMethod; - } - - @Override - public RequestHandler combine(RequestHandler other) { - return this; - } - - @Override - public Class declaringClass() { - return handlerMethod.getBeanType(); - } - - @Override - public boolean isAnnotatedWith(Class annotation) { - return null != AnnotationUtils.findAnnotation(handlerMethod.getMethod(), annotation); - } - - @Override - public PatternsRequestCondition getPatternsCondition() { - return new WebMvcPatternsRequestConditionWrapper( - contextPath, - requestMapping.getPathPatternsCondition()); - } - - @Override - public String groupName() { - return ControllerNamingUtils.controllerNameAsGroup(handlerMethod); - } - - @Override - public String getName() { - return handlerMethod.getMethod().getName(); - } - - @Override - public Set supportedMethods() { - return requestMapping.getMethodsCondition().getMethods(); - } - - @Override - public Set produces() { - return requestMapping.getProducesCondition().getProducibleMediaTypes(); - } - - @Override - public Set consumes() { - return requestMapping.getConsumesCondition().getConsumableMediaTypes(); - } - - @Override - public Set> headers() { - return WebMvcNameValueExpressionWrapper.from(requestMapping.getHeadersCondition().getExpressions()); - } - - @Override - public Set> params() { - return WebMvcNameValueExpressionWrapper.from(requestMapping.getParamsCondition().getExpressions()); - } - - @Override - public Optional findAnnotation(Class annotation) { - return ofNullable(AnnotationUtils.findAnnotation(handlerMethod.getMethod(), annotation)); - } - - @Override - public RequestHandlerKey key() { - org.springframework.web.servlet.mvc.condition.PathPatternsRequestCondition sets = requestMapping.getPathPatternsCondition(); - return new RequestHandlerKey( - sets!=null?sets.getPatterns():new HashSet<>(), - requestMapping.getMethodsCondition().getMethods(), - requestMapping.getConsumesCondition().getConsumableMediaTypes(), - requestMapping.getProducesCondition().getProducibleMediaTypes()); - } - - @Override - public springfox.documentation.spring.wrapper.RequestMappingInfo getRequestMapping() { - return new WebMvcRequestMappingInfoWrapper(requestMapping); - } - - @Override - public List getParameters() { - return methodResolver.methodParameters(handlerMethod); - } - - @Override - public ResolvedType getReturnType() { - return methodResolver.methodReturnType(handlerMethod); - } - - @Override - public Optional findControllerAnnotation(Class annotation) { - return ofNullable(AnnotationUtils.findAnnotation(handlerMethod.getBeanType(), annotation)); - } - - @Override - public String toString() { - return new StringJoiner(", ", WebMvcRequestHandler.class.getSimpleName() + "{", "}") - .add("requestMapping=" + requestMapping) - .add("handlerMethod=" + handlerMethod) - .add("key=" + key()) - .toString(); - } -} diff --git a/springfox-spring-webmvc/src/main/java/springfox/documentation/spring/web/WebMvcRequestMappingInfoWrapper.java b/springfox-spring-webmvc/src/main/java/springfox/documentation/spring/web/WebMvcRequestMappingInfoWrapper.java deleted file mode 100644 index e561bb3bef8..00000000000 --- a/springfox-spring-webmvc/src/main/java/springfox/documentation/spring/web/WebMvcRequestMappingInfoWrapper.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - * - * Copyright 2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.spring.web; - -import org.springframework.web.servlet.mvc.method.RequestMappingInfo; - -public class WebMvcRequestMappingInfoWrapper - implements springfox.documentation.spring.wrapper.RequestMappingInfo { - - private final RequestMappingInfo originalInfo; - - public WebMvcRequestMappingInfoWrapper(RequestMappingInfo originalInfo) { - this.originalInfo = originalInfo; - } - - @Override - public RequestMappingInfo getOriginalInfo() { - return originalInfo; - } -} diff --git a/springfox-spring-webmvc/src/main/java/springfox/documentation/spring/web/plugins/WebMvcRequestHandlerProvider.java b/springfox-spring-webmvc/src/main/java/springfox/documentation/spring/web/plugins/WebMvcRequestHandlerProvider.java deleted file mode 100644 index 148e3618e86..00000000000 --- a/springfox-spring-webmvc/src/main/java/springfox/documentation/spring/web/plugins/WebMvcRequestHandlerProvider.java +++ /dev/null @@ -1,97 +0,0 @@ -/* - * - * Copyright 2015-2017 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ -package springfox.documentation.spring.web.plugins; - - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication; -import org.springframework.context.annotation.Conditional; -import org.springframework.core.Ordered; -import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Component; -import org.springframework.web.method.HandlerMethod; -import org.springframework.web.servlet.mvc.method.RequestMappingInfo; -import org.springframework.web.servlet.mvc.method.RequestMappingInfoHandlerMapping; -import springfox.documentation.RequestHandler; -import springfox.documentation.spi.service.RequestHandlerProvider; -import springfox.documentation.spring.web.OnServletBasedWebApplication; -import springfox.documentation.spring.web.WebMvcRequestHandler; -import springfox.documentation.spring.web.readers.operation.HandlerMethodResolver; - -import jakarta.servlet.ServletContext; -import java.util.List; -import java.util.Map; -import java.util.Optional; -import java.util.function.Function; -import java.util.stream.StreamSupport; - -import static java.util.stream.Collectors.*; -import static springfox.documentation.builders.BuilderDefaults.*; -import static springfox.documentation.spi.service.contexts.Orderings.*; -import static springfox.documentation.spring.web.paths.Paths.*; - -@Component -@Order(Ordered.HIGHEST_PRECEDENCE) -@ConditionalOnWebApplication(type = ConditionalOnWebApplication.Type.SERVLET) -@Conditional(OnServletBasedWebApplication.class) -public class WebMvcRequestHandlerProvider implements RequestHandlerProvider { - private final List handlerMappings; - private final HandlerMethodResolver methodResolver; - private final String contextPath; - - @Autowired - public WebMvcRequestHandlerProvider( - Optional servletContext, - HandlerMethodResolver methodResolver, - List handlerMappings) { - this.handlerMappings = handlerMappings; - this.methodResolver = methodResolver; - this.contextPath = servletContext - .map(ServletContext::getContextPath) - .orElse(ROOT); - } - - @Override - public List requestHandlers() { - return nullToEmptyList(handlerMappings).stream() - .filter(requestMappingInfoHandlerMapping -> - !("org.springframework.integration.http.inbound.IntegrationRequestMappingHandlerMapping" - .equals(requestMappingInfoHandlerMapping.getClass() - .getName()))) - .map(toMappingEntries()) - .flatMap((entries -> StreamSupport.stream(entries.spliterator(), false))) - .map(toRequestHandler()) - .sorted(byPatternsCondition()) - .collect(toList()); - } - - private Function>> toMappingEntries() { - return input -> input.getHandlerMethods() - .entrySet(); - } - - private Function, RequestHandler> toRequestHandler() { - return input -> new WebMvcRequestHandler( - contextPath, - methodResolver, - input.getKey(), - input.getValue()); - } -} diff --git a/springfox-spring-webmvc/src/main/resources/.gitkeep b/springfox-spring-webmvc/src/main/resources/.gitkeep deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/springfox-spring-webmvc/src/test/groovy/springfox/documentation/schema/ReturnTypesSpec.groovy b/springfox-spring-webmvc/src/test/groovy/springfox/documentation/schema/ReturnTypesSpec.groovy deleted file mode 100644 index 539c82dbf07..00000000000 --- a/springfox-spring-webmvc/src/test/groovy/springfox/documentation/schema/ReturnTypesSpec.groovy +++ /dev/null @@ -1,87 +0,0 @@ -/* - * - * Copyright 2015-2019 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ -package springfox.documentation.schema - -import com.fasterxml.classmate.GenericType -import com.fasterxml.classmate.TypeResolver -import com.fasterxml.jackson.databind.type.SimpleType -import org.springframework.plugin.core.OrderAwarePluginRegistry -import org.springframework.plugin.core.PluginRegistry -import spock.lang.Specification -import springfox.documentation.spi.DocumentationType -import springfox.documentation.spi.schema.TypeNameProviderPlugin -import springfox.documentation.spring.web.dummy.DummyModels -import springfox.documentation.spring.web.mixins.RequestMappingSupport -import springfox.documentation.spring.web.mixins.ServicePluginsSupport -import springfox.documentation.spring.web.readers.operation.HandlerMethodResolver - -import static java.util.Collections.* -import static springfox.documentation.spi.DocumentationType.* -import static springfox.documentation.spi.schema.contexts.ModelContext.* - -class ReturnTypesSpec extends Specification - implements ServicePluginsSupport, - AlternateTypesSupport, - RequestMappingSupport { - - TypeNameExtractor sut - - def setup() { - PluginRegistry modelNameRegistry = - OrderAwarePluginRegistry.create([new DefaultTypeNameProvider()]) - sut = new TypeNameExtractor( - new TypeResolver(), - modelNameRegistry, - new JacksonEnumTypeDeterminer()) - } - - def "model types"() { - expect: - def type = new HandlerMethodResolver(new TypeResolver()).methodReturnType(handlerMethod) - type.getErasedType() == expectedType - - where: - handlerMethod | expectedType - dummyHandlerMethod("methodWithConcreteResponseBody") | DummyModels.BusinessModel.class - dummyHandlerMethod("methodWithConcreteCorporationModel") | DummyModels.CorporationModel.class - } - - def "Get response class name from ResolvedType"(){ - expect: - def namingStrategy = new DefaultGenericTypeNamingStrategy() - def modelResponseClass = sut.typeName( - returnValue("0_0", - "group", - new TypeResolver().resolve( - GenericType.class, - clazz), - Optional.empty(), - SWAGGER_12, - alternateTypeProvider(), - namingStrategy, - emptySet())) - modelResponseClass == expectedResponseClassName - - where: - clazz | expectedResponseClassName - SimpleType | "GenericType«SimpleType»" - Integer | "GenericType«int»" - } - -} \ No newline at end of file diff --git a/springfox-spring-webmvc/src/test/groovy/springfox/documentation/spring/web/OperationCachingEquivalenceSpec.groovy b/springfox-spring-webmvc/src/test/groovy/springfox/documentation/spring/web/OperationCachingEquivalenceSpec.groovy deleted file mode 100644 index 37148cdd21e..00000000000 --- a/springfox-spring-webmvc/src/test/groovy/springfox/documentation/spring/web/OperationCachingEquivalenceSpec.groovy +++ /dev/null @@ -1,256 +0,0 @@ -/* - * - * Copyright 2016-2019 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ -package springfox.documentation.spring.web - -import com.fasterxml.classmate.ResolvedType -import com.fasterxml.classmate.TypeResolver -import org.springframework.http.MediaType -import org.springframework.web.bind.annotation.RequestMethod -import org.springframework.web.method.HandlerMethod -import org.springframework.web.servlet.mvc.condition.ConsumesRequestCondition -import org.springframework.web.servlet.mvc.condition.HeadersRequestCondition -import org.springframework.web.servlet.mvc.condition.NameValueExpression -import org.springframework.web.servlet.mvc.condition.ParamsRequestCondition -import org.springframework.web.servlet.mvc.condition.ProducesRequestCondition -import org.springframework.web.servlet.mvc.condition.RequestCondition -import org.springframework.web.servlet.mvc.condition.RequestMethodsRequestCondition -import org.springframework.web.servlet.mvc.method.RequestMappingInfo -import spock.lang.Specification -import springfox.documentation.RequestHandler -import springfox.documentation.RequestHandlerKey -import springfox.documentation.service.ResolvedMethodParameter -import springfox.documentation.spi.schema.GenericTypeNamingStrategy -import springfox.documentation.spi.service.contexts.DocumentationContext -import springfox.documentation.spi.service.contexts.RequestMappingContext -import springfox.documentation.spring.web.mixins.HandlerMethodsSupport -import springfox.documentation.spring.web.paths.Paths -import springfox.documentation.spring.web.readers.operation.HandlerMethodResolver -import springfox.documentation.spring.wrapper.PatternsRequestCondition - -import java.lang.annotation.Annotation - -class OperationCachingEquivalenceSpec extends Specification implements HandlerMethodsSupport { - def methodResolver = new HandlerMethodResolver(new TypeResolver()) - - def "Two request handlers backed by the same method must be equal"() { - given: - OperationCachingEquivalence sut = new OperationCachingEquivalence() - def documentationContext = Mock(DocumentationContext) - def firstMapping = requestMapping( - paths("/a"), - mediaTypes(MediaType.APPLICATION_JSON_VALUE), - mediaTypes(MediaType.APPLICATION_JSON_VALUE), - methods(RequestMethod.GET)) - def secondMapping = requestMapping( - paths("/a"), - mediaTypes(MediaType.APPLICATION_JSON_VALUE), - mediaTypes(MediaType.APPLICATION_JSON_VALUE), - methods(RequestMethod.GET)) - def anyMethod = methodWithParent() - when: - documentationContext.getGenericsNamingStrategy() >> Mock(GenericTypeNamingStrategy) - and: - def first = new RequestMappingContext( - "0", - documentationContext, - new WebMvcRequestHandler(Paths.ROOT, methodResolver, firstMapping, anyMethod)) - def second = new RequestMappingContext( - "0", - documentationContext, - new WebMvcRequestHandler(Paths.ROOT, methodResolver, secondMapping, anyMethod)) - then: - sut.test(first, second) - } - - def "One or the other is null"() { - given: - OperationCachingEquivalence sut = new OperationCachingEquivalence() - def first = new RequestMappingContext( - "0", - Mock(DocumentationContext), - requestHandler(firstKey)) - def second = new RequestMappingContext( - "0", - Mock(DocumentationContext), - requestHandler(secondKey)) - expect: - sut.test(first, second) == outcome - where: - firstKey | secondKey | outcome - null | null | true - "a" | null | false - null | "b" | false - } - - def "Two request handlers backed by different methods must NOT be equal"() { - given: - OperationCachingEquivalence sut = new OperationCachingEquivalence() - def documentationContext = Mock(DocumentationContext) - def firstMapping = requestMapping( - paths("/ab"), - mediaTypes(MediaType.APPLICATION_JSON_VALUE, MediaType.APPLICATION_ATOM_XML_VALUE), - mediaTypes(MediaType.APPLICATION_JSON_VALUE), - methods(RequestMethod.PATCH)) - def secondMapping = requestMapping( - paths("/a"), - mediaTypes(MediaType.APPLICATION_JSON_VALUE), - mediaTypes(MediaType.APPLICATION_JSON_VALUE), - methods(RequestMethod.GET)) - def anyMethod = methodWithParent() - when: - documentationContext.getGenericsNamingStrategy() >> Mock(GenericTypeNamingStrategy) - and: - def first = new RequestMappingContext( - "0", - documentationContext, - new WebMvcRequestHandler( - Paths.ROOT, - methodResolver, - firstMapping, - anyMethod)) - def second = new RequestMappingContext( - "0", - documentationContext, - new WebMvcRequestHandler( - Paths.ROOT, - methodResolver, - secondMapping, - anyMethod)) - then: - !sut.test(first, second) - } - - def paths(String... paths) { - paths - } - - def mediaTypes(String... mediaTypes) { - mediaTypes - } - - def methods(RequestMethod... methods) { - methods - } - - def requestMapping(paths, consumes, produces, methods) { - RequestCondition custom = null - new RequestMappingInfo("someName", - new org.springframework.web.servlet.mvc.condition.PatternsRequestCondition(paths), - new RequestMethodsRequestCondition(methods), - new ParamsRequestCondition(), - new HeadersRequestCondition(), - new ConsumesRequestCondition(consumes), - new ProducesRequestCondition(produces), - custom - ) - } - - def requestHandler(def handlerKey) { - new RequestHandler() { - @Override - Class declaringClass() { - return null - } - - @Override - boolean isAnnotatedWith(Class annotation) { - return false - } - - @Override - PatternsRequestCondition getPatternsCondition() { - return null - } - - @Override - String groupName() { - return null - } - - @Override - String getName() { - return null - } - - @Override - Set supportedMethods() { - return null - } - - @Override - Set produces() { - return null - } - - @Override - Set consumes() { - return null - } - - @Override - Set> headers() { - return null - } - - @Override - Set> params() { - return null - } - - @Override - def Optional findAnnotation(Class annotation) { - return null - } - - RequestHandlerKey key() { - handlerKey == null ? null : new RequestHandlerKey([] as Set, [] as Set, [] as Set, [] as Set) - } - - @Override - List getParameters() { - return null - } - - @Override - ResolvedType getReturnType() { - return null - } - - @Override - def Optional findControllerAnnotation(Class annotation) { - return null - } - - @Override - springfox.documentation.spring.wrapper.RequestMappingInfo getRequestMapping() { - return null - } - - @Override - HandlerMethod getHandlerMethod() { - return null - } - - @Override - RequestHandler combine(RequestHandler other) { - return null - } - } - } -} diff --git a/springfox-spring-webmvc/src/test/groovy/springfox/documentation/spring/web/dummy/controllers/GroovyService.groovy b/springfox-spring-webmvc/src/test/groovy/springfox/documentation/spring/web/dummy/controllers/GroovyService.groovy deleted file mode 100644 index d91ebeef7a7..00000000000 --- a/springfox-spring-webmvc/src/test/groovy/springfox/documentation/spring/web/dummy/controllers/GroovyService.groovy +++ /dev/null @@ -1,22 +0,0 @@ -package springfox.documentation.spring.web.dummy.controllers - -import org.springframework.stereotype.Controller -import org.springframework.web.bind.annotation.RequestBody -import org.springframework.web.bind.annotation.RequestMapping -import org.springframework.web.bind.annotation.RequestMethod -import org.springframework.web.bind.annotation.ResponseBody -import springfox.documentation.spring.web.dummy.models.GroovyModel - -@Controller -@RequestMapping("/groovy") -class GroovyService { - @RequestMapping(value = "groovyModel", method = RequestMethod.GET) - @ResponseBody - public GroovyModel groovyModel() { - return new GroovyModel("test"); - } - - @RequestMapping(value = "groovyModel", method = RequestMethod.PUT) - public void updateGroovyModel(@RequestBody GroovyModel model) { - } -} diff --git a/springfox-spring-webmvc/src/test/groovy/springfox/documentation/spring/web/dummy/models/GroovyModel.groovy b/springfox-spring-webmvc/src/test/groovy/springfox/documentation/spring/web/dummy/models/GroovyModel.groovy deleted file mode 100644 index 8095eb693bc..00000000000 --- a/springfox-spring-webmvc/src/test/groovy/springfox/documentation/spring/web/dummy/models/GroovyModel.groovy +++ /dev/null @@ -1,17 +0,0 @@ -package springfox.documentation.spring.web.dummy.models - -class GroovyModel { - String stringProp - - GroovyModel(String stringProp) { - this.stringProp = stringProp - } - - String getStringProp() { - return stringProp - } - - void setStringProp(String stringProp) { - this.stringProp = stringProp - } -} diff --git a/springfox-spring-webmvc/src/test/groovy/springfox/documentation/spring/web/mixins/JsonSupport.groovy b/springfox-spring-webmvc/src/test/groovy/springfox/documentation/spring/web/mixins/JsonSupport.groovy deleted file mode 100644 index 1da6d9a9cc5..00000000000 --- a/springfox-spring-webmvc/src/test/groovy/springfox/documentation/spring/web/mixins/JsonSupport.groovy +++ /dev/null @@ -1,37 +0,0 @@ -/* - * - * Copyright 2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.spring.web.mixins - -import groovy.json.JsonSlurper -import org.springframework.test.web.servlet.MvcResult - -trait JsonSupport { - - def jsonBodyResponse(MvcResult jsonResponse) { - jsonBodyResponse(jsonResponse.response.getContentAsString()) - } - - def jsonBodyResponse(String content) { - if (!content) { - return content - } - new JsonSlurper().parseText(content) - } -} diff --git a/springfox-spring-webmvc/src/test/groovy/springfox/documentation/spring/web/mixins/RequestMappingSupport.groovy b/springfox-spring-webmvc/src/test/groovy/springfox/documentation/spring/web/mixins/RequestMappingSupport.groovy deleted file mode 100644 index 7d92f836829..00000000000 --- a/springfox-spring-webmvc/src/test/groovy/springfox/documentation/spring/web/mixins/RequestMappingSupport.groovy +++ /dev/null @@ -1,243 +0,0 @@ -/* - * - * Copyright 2016-2019 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.spring.web.mixins - -import com.fasterxml.classmate.TypeResolver -import org.springframework.web.bind.annotation.RequestMethod -import org.springframework.web.method.HandlerMethod -import org.springframework.web.servlet.mvc.condition.ConsumesRequestCondition -import org.springframework.web.servlet.mvc.condition.HeadersRequestCondition -import org.springframework.web.servlet.mvc.condition.ParamsRequestCondition -import org.springframework.web.servlet.mvc.condition.PatternsRequestCondition -import org.springframework.web.servlet.mvc.condition.ProducesRequestCondition -import org.springframework.web.servlet.mvc.condition.RequestMethodsRequestCondition -import org.springframework.web.servlet.mvc.method.RequestMappingInfo -import springfox.documentation.builders.OperationBuilder -import springfox.documentation.schema.Model -import springfox.documentation.spi.service.contexts.OperationContext -import springfox.documentation.spi.service.contexts.RequestMappingContext -import springfox.documentation.spring.web.WebMvcRequestHandler -import springfox.documentation.spring.web.dummy.DummyClass -import springfox.documentation.spring.web.dummy.DummyController -import springfox.documentation.spring.web.dummy.DummyControllerWithApiDescription -import springfox.documentation.spring.web.dummy.DummyControllerWithResourcePath -import springfox.documentation.spring.web.dummy.DummyControllerWithTags -import springfox.documentation.spring.web.dummy.DummyDeprecatedController -import springfox.documentation.spring.web.dummy.controllers.FancyPetService -import springfox.documentation.spring.web.dummy.controllers.PetGroomingService -import springfox.documentation.spring.web.dummy.controllers.PetService -import springfox.documentation.spring.web.dummy.models.FancyPet -import springfox.documentation.spring.web.paths.Paths -import springfox.documentation.spring.web.readers.operation.CachingOperationNameGenerator -import springfox.documentation.spring.web.readers.operation.HandlerMethodResolver - -import jakarta.servlet.ServletContext - -trait RequestMappingSupport { - - RequestMappingInfo requestMappingInfo(String path, Map overrides = [:]) { - PatternsRequestCondition singlePatternRequestCondition = patternsRequestCondition([path] as String[]) - ConsumesRequestCondition consumesRequestCondition = - overrides['consumesRequestCondition'] ?: consumesRequestCondition() - ProducesRequestCondition producesRequestCondition = - overrides['producesRequestCondition'] ?: producesRequestCondition() - PatternsRequestCondition patternsRequestCondition = - overrides['patternsRequestCondition'] ?: singlePatternRequestCondition - ParamsRequestCondition paramsRequestCondition = - overrides["paramsCondition"] ?: paramsRequestCondition() - HeadersRequestCondition headersRequestCondition = - overrides["headersCondition"] ?: headersRequestCondition() - RequestMethodsRequestCondition requestMethodsRequestCondition = - overrides['requestMethodsRequestCondition'] ?: requestMethodsRequestCondition(RequestMethod.values()) - - new RequestMappingInfo( - patternsRequestCondition, - requestMethodsRequestCondition, - paramsRequestCondition, - headersRequestCondition, - consumesRequestCondition, - producesRequestCondition, - null) - } - - HandlerMethod dummyHandlerMethod( - String methodName = "dummyMethod", - Class... parameterTypes = null) { - - def clazz = new DummyClass() - Class c = clazz.getClass() - new HandlerMethod(clazz, c.getMethod(methodName, parameterTypes)) - } - - HandlerMethod dummyHandlerMethodIn( - Class aClass, - String methodName = "dummyMethod", - Class... parameterTypes = null) { - - def clazz = aClass.newInstance() - Class c = clazz.getClass() - new HandlerMethod(clazz, c.getMethod(methodName, parameterTypes)) - } - - HandlerMethod handlerMethodIn( - Class aClass, - String methodName = "dummyMethod", - Class... parameterTypes = null) { - - new HandlerMethod(aClass, aClass.getMethod(methodName, parameterTypes)) - } - - HandlerMethod dummyControllerHandlerMethod( - String methodName = "dummyMethod", - parameterTypes = null) { - - def clazz = new DummyController() - Class c = clazz.getClass(); - new HandlerMethod(clazz, c.getMethod(methodName, parameterTypes)) - } - - HandlerMethod dummyOperationWithTags( - String methodName = "dummyMethod", - parameterTypes = null) { - - def clazz = new DummyControllerWithTags() - Class c = clazz.getClass(); - new HandlerMethod(clazz, c.getMethod(methodName, parameterTypes)) - } - - HandlerMethod dummyControllerWithApiDescriptionHandlerMethod( - String methodName = "dummyMethod", - parameterTypes = null) { - - def clazz = new DummyControllerWithApiDescription() - Class c = clazz.getClass(); - new HandlerMethod(clazz, c.getMethod(methodName, parameterTypes)) - } - - HandlerMethod dummyControllerWithResourcePath( - String methodName = "dummyMethod", - parameterTypes = null) { - - def clazz = new DummyControllerWithResourcePath() - Class c = clazz.getClass(); - new HandlerMethod(clazz, c.getMethod(methodName, parameterTypes)) - } - - HandlerMethod petServiceHandlerMethod(String methodName = "getPetById", parameterTypes = String) { - def clazz = new PetService() - Class c = clazz.getClass() - new HandlerMethod(clazz, c.getMethod(methodName, parameterTypes)) - } - - HandlerMethod fancyPetServiceHandlerMethod( - String methodName = "createObject", - parameterTypes = FancyPet) { - - def clazz = new FancyPetService() - Class c = clazz.getClass() - new HandlerMethod(clazz, c.getMethod(methodName, parameterTypes)) - } - - - HandlerMethod multipleRequestMappingsHandlerMethod( - String methodName = "canGroom", - parameterTypes = String) { - - def clazz = new PetGroomingService() - Class c = clazz.getClass() - new HandlerMethod(clazz, c.getMethod(methodName, parameterTypes)) - } - - HandlerMethod dummyDeprecatedController( - String methodName = "dummyMethod", - Class... parameterTypes = null) { - - def clazz = new DummyDeprecatedController() - Class c = clazz.getClass() - new HandlerMethod(clazz, c.getMethod(methodName, parameterTypes)) - } - - Class ignorableClass() { - DummyClass.ApiIgnorableClass - } - - def apiImplicitParamsClass() { - DummyClass.ApiImplicitParamsClass.class; - } - - def apiImplicitParamsAllowMultipleClass() { - DummyClass.ApiImplicitParamsAllowMultipleClass.class; - } - - HandlerMethod ignorableHandlerMethod() { - def clazz = new DummyClass.ApiIgnorableClass() - Class c = clazz.getClass(); - new HandlerMethod(clazz, c.getMethod("dummyMethod", null)) - } - - PatternsRequestCondition patternsRequestCondition(String... patterns) { - new PatternsRequestCondition(patterns) - } - - ParamsRequestCondition paramsRequestCondition(String... params) { - new ParamsRequestCondition(params) - } - - HeadersRequestCondition headersRequestCondition(String... params) { - new HeadersRequestCondition(params) - } - - ConsumesRequestCondition consumesRequestCondition(String... conditions) { - new ConsumesRequestCondition(conditions) - } - - ProducesRequestCondition producesRequestCondition(String... conditions) { - new ProducesRequestCondition(conditions) - } - - RequestMethodsRequestCondition requestMethodsRequestCondition(RequestMethod... requestMethods) { - new RequestMethodsRequestCondition(requestMethods) - } - - ServletContext servletContext() { - [getContextPath: { return "/context-path" }] as ServletContext - } - - def operationContext( - context, - handlerMethod, - operationIndex = 0, - requestMapping = requestMappingInfo("/somePath"), - httpMethod = RequestMethod.GET, - knownModels = new HashMap>()) { - new OperationContext( - new OperationBuilder(new CachingOperationNameGenerator()), - httpMethod, - new RequestMappingContext( - "0", - context, - new WebMvcRequestHandler( - Paths.ROOT, - new HandlerMethodResolver(new TypeResolver()), - requestMapping, - handlerMethod)).withKnownModels(knownModels), - operationIndex) - } -} diff --git a/springfox-spring-webmvc/src/test/groovy/springfox/documentation/spring/web/paths/DefaultPathProviderSpec.groovy b/springfox-spring-webmvc/src/test/groovy/springfox/documentation/spring/web/paths/DefaultPathProviderSpec.groovy deleted file mode 100644 index 750d71b93e1..00000000000 --- a/springfox-spring-webmvc/src/test/groovy/springfox/documentation/spring/web/paths/DefaultPathProviderSpec.groovy +++ /dev/null @@ -1,64 +0,0 @@ -/* - * - * Copyright 2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.spring.web.paths - -import spock.lang.Specification -import springfox.documentation.spring.web.mixins.RequestMappingSupport - -import jakarta.servlet.ServletContext - -class DefaultPathProviderSpec extends Specification implements RequestMappingSupport { - - def "relative paths"() { - given: - ServletContext servletContext = Mock(ServletContext) - servletContext.contextPath >> "/" - DefaultPathProvider provider = new DefaultPathProvider() - - expect: - provider.getResourceListingPath('default', 'api-declaration') == "/default/api-declaration" - } - - - def "should never return a path with duplicate slash"() { - setup: - DefaultPathProvider swaggerPathProvider = new DefaultPathProvider() - - when: - String path = swaggerPathProvider.getResourceListingPath('/a', '/b') - String opPath = swaggerPathProvider.getOperationPath('//a/b') - - then: - path == '/a/b' - opPath == path - } - - def "should replace slashes"() { - expect: - Paths.removeAdjacentForwardSlashes(input) == expected - - where: - input | expected - '//a/b' | '/a/b' - '//a//b//c' | '/a/b/c' - 'http://some//a' | 'http://some/a' - 'https://some//a' | 'https://some/a' - } -} diff --git a/springfox-spring-webmvc/src/test/groovy/springfox/documentation/spring/web/paths/RelativeSwaggerPathProviderSpec.groovy b/springfox-spring-webmvc/src/test/groovy/springfox/documentation/spring/web/paths/RelativeSwaggerPathProviderSpec.groovy deleted file mode 100644 index 2afdfb65e8f..00000000000 --- a/springfox-spring-webmvc/src/test/groovy/springfox/documentation/spring/web/paths/RelativeSwaggerPathProviderSpec.groovy +++ /dev/null @@ -1,39 +0,0 @@ -/* - * - * Copyright 2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.spring.web.paths - -import spock.lang.Specification -import springfox.documentation.spring.web.mixins.RequestMappingSupport - -import jakarta.servlet.ServletContext - -class RelativeSwaggerPathProviderSpec extends Specification implements RequestMappingSupport { - - def "assert urls"(){ - given: - ServletContext servletContext = Mock() - DefaultPathProvider provider = new DefaultPathProvider() - servletContext.contextPath >> "/" - - expect: - provider.getDocumentationPath() == "/" - } - -} diff --git a/springfox-spring-webmvc/src/test/groovy/springfox/documentation/spring/web/plugins/DefaultRequestHandlerCombinerSpec.groovy b/springfox-spring-webmvc/src/test/groovy/springfox/documentation/spring/web/plugins/DefaultRequestHandlerCombinerSpec.groovy deleted file mode 100644 index c34ee40a7da..00000000000 --- a/springfox-spring-webmvc/src/test/groovy/springfox/documentation/spring/web/plugins/DefaultRequestHandlerCombinerSpec.groovy +++ /dev/null @@ -1,130 +0,0 @@ -package springfox.documentation.spring.web.plugins - -import com.fasterxml.classmate.TypeResolver -import org.springframework.web.bind.annotation.RequestMethod -import org.springframework.web.servlet.mvc.condition.PatternsRequestCondition -import spock.lang.Specification -import spock.lang.Unroll -import springfox.documentation.RequestHandler -import springfox.documentation.RequestHandlerKey -import springfox.documentation.service.ResolvedMethodParameter -import springfox.documentation.spring.web.WebMvcPatternsRequestConditionWrapper - -import java.util.stream.Stream - -import static java.util.stream.Collectors.* -import static springfox.documentation.spring.web.paths.Paths.* - -class DefaultRequestHandlerCombinerSpec extends Specification { - def equality = new PathAndParametersEquivalence() - - @Unroll - def "Combines request handlers effectively"() { - given: - def sut = new DefaultRequestHandlerCombiner() - and: - def input = [ - handler("/a", "a2", ["vendor/a"], param("a", String)), - handler("/a", "a3", ["vendor/a", "vendor/b"], param("a", String)), - handler("/a", "a1", ["vendor/a", "vendor/c"], param("a", String)), - handler("/b", "b1", ["vendor/a"], param("b", String)), - handler("/b", "b1", ["vendor/b"], param("b", String)), - handler("/c", "c1a", ["vendor/c"], param("b", String)), - handler("/c", "a1c", ["vendor/c"], param("c", String)) - ] - def expected = [ - handler("/a", "a1", ["vendor/a", "vendor/b", "vendor/c"], param("a", String)), - handler("/b", "b1", ["vendor/a", "vendor/b"], param("b", String)), - handler("/c", "a1c", ["vendor/c"], param("c", String)), - handler("/c", "c1a", ["vendor/c"], param("b", String)) - ] - - when: - def combined = sut.combine(input) - - then: - combined.size() == expected.size() - expected.eachWithIndex { handler, index -> - verifyAll { - equality.test(handler, combined.get(index)) - } - } - } - - @Unroll - def "Combines request handlers when there is only one"() { - given: - def sut = new DefaultRequestHandlerCombiner() - - and: - def input = [handler("/a", "a", ["vendor/a"], param("a", String))] - def expected = [handler("/a", "a", ["vendor/a"], param("a", String))] - - when: - def combined = sut.combine(input) - - then: - combined.size() == expected.size() - expected.eachWithIndex { handler, index -> - assert equality.test(handler, combined.get(index)) - } - } - - @Unroll - def "Combines request handlers when there is none"() { - given: - def sut = new DefaultRequestHandlerCombiner() - - and: - def input = [] - def expected = [] - - when: - def combined = sut.combine(input) - - then: - combined.size() == expected.size() - } - - @Unroll - def "Combines request handlers when input is null"() { - given: - def sut = new DefaultRequestHandlerCombiner() - - and: - def input = null - def expected = [] - - when: - def combined = sut.combine(input) - - then: - combined.size() == expected.size() - } - - RequestHandler handler( - String path, - String name, - List produces, - ResolvedMethodParameter parameter) { - def handler = Mock(RequestHandler) - def key = Mock(RequestHandlerKey) - handler.patternsCondition >> new WebMvcPatternsRequestConditionWrapper( - ROOT, - new PatternsRequestCondition(path)) - handler.getName() >> name - handler.produces() >> Stream.of(produces).collect(toSet()) - handler.parameters >> [parameter] - handler.supportedMethods() >> [RequestMethod.GET] - handler.params() >> [] - handler.key() >> key - key.toString() >> "mock of: " + path - handler - } - - def param(String name, Class aClass, int index = 0) { - new ResolvedMethodParameter(index, name, [], new TypeResolver().resolve(aClass)) - } -} - - diff --git a/springfox-spring-webmvc/src/test/groovy/springfox/documentation/spring/web/plugins/DocketSpec.groovy b/springfox-spring-webmvc/src/test/groovy/springfox/documentation/spring/web/plugins/DocketSpec.groovy deleted file mode 100644 index 5a747f72503..00000000000 --- a/springfox-spring-webmvc/src/test/groovy/springfox/documentation/spring/web/plugins/DocketSpec.groovy +++ /dev/null @@ -1,278 +0,0 @@ -/* - * - * Copyright 2015-2019 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.spring.web.plugins - -import com.fasterxml.classmate.ResolvedType -import com.fasterxml.jackson.core.util.VersionUtil -import org.joda.time.LocalDate -import org.springframework.aop.framework.AbstractSingletonProxyFactoryBean -import org.springframework.aop.framework.ProxyFactoryBean -import org.springframework.boot.system.JavaVersion -import org.springframework.http.ResponseEntity -import springfox.documentation.builders.PathSelectors -import springfox.documentation.common.Version -import springfox.documentation.schema.CodeGenGenericTypeNamingStrategy -import springfox.documentation.schema.DefaultGenericTypeNamingStrategy -import springfox.documentation.service.ApiDescription -import springfox.documentation.service.ApiInfo -import springfox.documentation.service.ListVendorExtension -import springfox.documentation.service.Parameter -import springfox.documentation.service.ResponseMessage -import springfox.documentation.service.SecurityScheme -import springfox.documentation.service.Tag -import springfox.documentation.service.VendorExtension -import springfox.documentation.spi.DocumentationType -import springfox.documentation.spi.service.contexts.Defaults -import springfox.documentation.spi.service.contexts.SecurityContext -import springfox.documentation.spring.web.paths.DefaultPathProvider - -import jakarta.servlet.ServletRequest - -import static java.util.Collections.* -import static java.util.Optional.* -import static org.springframework.http.HttpStatus.* -import static org.springframework.web.bind.annotation.RequestMethod.* -import static springfox.documentation.schema.AlternateTypeRules.* - -class DocketSpec extends DocumentationContextSpec { - - def "Should have sensible defaults when built with minimal configuration"() { - when: - def pluginContext = plugin.configure(contextBuilder) - - then: - pluginContext.groupName == 'default' - pluginContext.securitySchemes.isEmpty() - pluginContext.apiInfo.getTitle() == "Api Documentation" - pluginContext.apiInfo.getDescription() == "Api Documentation" - pluginContext.apiInfo.getTermsOfServiceUrl() == 'urn:tos' - pluginContext.apiInfo.getContact() == ApiInfo.DEFAULT_CONTACT - pluginContext.apiInfo.getLicense() == 'Apache 2.0' - pluginContext.apiInfo.getLicenseUrl() == "http://www.apache.org/licenses/LICENSE-2.0" - pluginContext.apiInfo.version == "1.0" - - pluginContext.pathProvider instanceof DummyPathProvider // this one is dummy as this is what we have in test ctx - } - - def "Swagger global response messages should override the default for a particular RequestMethod"() { - when: - plugin - .globalResponseMessage(GET, [new ResponseMessage( - OK.value(), - "blah", - null, - [], - [] as Map, - [])]) - .useDefaultResponseMessages(true) - .configure(contextBuilder) - - and: - def pluginContext = contextBuilder.build() - - then: - pluginContext.getGlobalResponseMessages()[GET][0].getMessage() == "blah" - pluginContext.getGlobalResponseMessages()[GET].size() == 1 - - and: "defaults are preserved" - pluginContext.getGlobalResponseMessages().keySet().containsAll( - [POST, PUT, DELETE, PATCH, TRACE, OPTIONS, HEAD] - ) - } - - def "Verify configurer behavior"() { - when: - plugin.enable(true) - - then: - plugin.isEnabled() - !plugin.supports(DocumentationType.SPRING_WEB) - plugin.supports(DocumentationType.SWAGGER_12) - plugin.documentationType == DocumentationType.SWAGGER_12 - } - - def "Swagger global response messages should not be used for a particular RequestMethod"() { - when: - new Docket(DocumentationType.SWAGGER_12) - .globalResponseMessage(GET, [new ResponseMessage( - OK.value(), - "blah", - null, - [], - [] as Map, - [])]) - .useDefaultResponseMessages(false) - .configure(contextBuilder) - - and: - def pluginContext = contextBuilder.build() - - then: - pluginContext.getGlobalResponseMessages()[GET][0].getMessage() == "blah" - pluginContext.getGlobalResponseMessages()[GET].size() == 1 - - and: "defaults are preserved" - pluginContext.getGlobalResponseMessages().keySet().containsAll([GET]) - } - - def "Swagger ignorableParameterTypes should append to the default ignorableParameterTypes"() { - when: - new Docket(DocumentationType.SWAGGER_12) - .ignoredParameterTypes(AbstractSingletonProxyFactoryBean.class, ProxyFactoryBean.class) - .configure(contextBuilder) - and: - def pluginContext = contextBuilder.build() - - then: - pluginContext.getIgnorableParameterTypes().contains(AbstractSingletonProxyFactoryBean.class) - pluginContext.getIgnorableParameterTypes().contains(ProxyFactoryBean.class) - - and: "one of the defaults" - pluginContext.getIgnorableParameterTypes().contains(ServletRequest.class) - } - - def "Sets alternative AlternateTypeProvider with a rule"() { - given: - def rule = newMapRule(String, String) - new Docket(DocumentationType.SWAGGER_12) - .alternateTypeRules(rule) - .configure(contextBuilder) - - expect: - documentationContext().alternateTypeProvider.rules.contains(rule) - } - - def "Model substitution registers new rules"() { - when: - def isPostjdk8 = JavaVersion.getJavaVersion().isEqualOrNewerThan(JavaVersion.EIGHT) - def jdk8RuleCount = (isPostjdk8 ? 6 : 0) - new Docket(DocumentationType.SWAGGER_12) - ."${method}"(*args) - .configure(contextBuilder) - - then: - documentationContext().alternateTypeProvider.rules.size() == expectedSize + jdk8RuleCount - - where: - method | args | expectedSize - 'genericModelSubstitutes' | [ResponseEntity.class, List.class] | 15 - 'directModelSubstitute' | [LocalDate.class, Date.class] | 14 - } - - - def "Basic property checks"() { - when: - plugin."$builderMethod"(object) - - then: - documentationContext()."$property" == object || (documentationContext()."$property" == [object] as Set) - - where: - builderMethod | object | property - 'pathProvider' | new DefaultPathProvider() | 'pathProvider' - 'securitySchemes' | new ArrayList() | 'securitySchemes' - 'securityContexts' | validContexts() | 'securityContexts' - 'groupName' | 'someGroup' | 'groupName' - 'apiInfo' | new ApiInfo('', '', "", '', '', '', '') | 'apiInfo' - 'apiDescriptionOrdering' | apiDescriptionOrdering() | 'apiDescriptionOrdering' - 'operationOrdering' | operationOrdering() | 'operationOrdering' - 'produces' | ['application/json'] as Set | 'produces' - 'consumes' | ['application/json'] as Set | 'consumes' - 'host' | 'someHost' | 'host' - 'protocols' | ['application/json'] as Set | 'protocols' - 'additionalModels' | Mock(ResolvedType) | 'additionalModels' - 'enableUrlTemplating' | true | 'isUriTemplatesEnabled' - 'tags' | new Tag("test", "test") | 'tags' - 'globalOperationParameters' | [Mock(Parameter)] | 'globalOperationParameters' - 'extensions' | extensions() | 'vendorExtensions' - } - - List extensions() { - return Arrays.asList(new ListVendorExtension("test", Arrays.asList("Test"))) - } - - def "Code generation strategy property is set"() { - when: - plugin."$builderMethod"(object) - - then: - documentationContext().genericsNamingStrategy.getClass() == strategy - - where: - builderMethod | object | strategy - 'forCodeGeneration' | false | DefaultGenericTypeNamingStrategy - 'forCodeGeneration' | true | CodeGenGenericTypeNamingStrategy - } - - def "Path mapping property is set"() { - when: - plugin."$builderMethod"(object) - - then: - documentationContext().pathMapping == path - - where: - builderMethod | object | path - 'pathMapping' | "/test" | of("/test") - 'pathMapping' | null | empty() - } - - Comparator apiDescriptionOrdering() { - new Defaults().apiDescriptionOrdering() - } - - Comparator operationOrdering() { - new Defaults().operationOrdering() - } - - private List validContexts() { - singletonList(SecurityContext.builder() - .forPaths(PathSelectors.any()) - .build()) - } - - def "non nullable swaggerApiResourceListing properties"() { - - when: - new Docket(DocumentationType.SWAGGER_12) - .configure(contextBuilder) - - and: - def pluginContext = contextBuilder.build() - - then: - "default" == pluginContext.groupName - null != pluginContext.pathProvider - null != pluginContext.apiInfo - null != pluginContext.apiSelector - null != pluginContext.globalResponseMessages - null != pluginContext.ignorableParameterTypes - null != pluginContext.listingReferenceOrdering - null != pluginContext.apiDescriptionOrdering - null != pluginContext.produces - null != pluginContext.protocols - null != pluginContext.host - null != pluginContext.consumes - null != pluginContext.additionalModels - - } - - -} diff --git a/springfox-spring-webmvc/src/test/groovy/springfox/documentation/spring/web/plugins/DocumentationPluginsManagerSpec.groovy b/springfox-spring-webmvc/src/test/groovy/springfox/documentation/spring/web/plugins/DocumentationPluginsManagerSpec.groovy deleted file mode 100644 index aec563bfcd0..00000000000 --- a/springfox-spring-webmvc/src/test/groovy/springfox/documentation/spring/web/plugins/DocumentationPluginsManagerSpec.groovy +++ /dev/null @@ -1,156 +0,0 @@ -/* - * - * Copyright 2015-2019 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.spring.web.plugins - -import spock.lang.Specification -import springfox.documentation.builders.OperationBuilder -import springfox.documentation.builders.ParameterBuilder -import springfox.documentation.builders.RequestParameterBuilder -import springfox.documentation.spi.DocumentationType -import springfox.documentation.spi.service.DocumentationPlugin -import springfox.documentation.spi.service.OperationBuilderPlugin -import springfox.documentation.spi.service.ParameterBuilderPlugin - -import springfox.documentation.spi.service.contexts.DocumentationContext -import springfox.documentation.spi.service.contexts.OperationContext -import springfox.documentation.spi.service.contexts.ParameterContext -import springfox.documentation.spi.service.contexts.PathContext - -import springfox.documentation.spring.web.mixins.ServicePluginsSupport -import springfox.documentation.spring.web.paths.DefaultPathProvider -import springfox.documentation.spring.web.readers.operation.CachingOperationNameGenerator - -import static java.util.Optional.empty - -class DocumentationPluginsManagerSpec extends Specification implements ServicePluginsSupport { - def "default documentation plugin always exists"() { - given: - def sut = defaultWebPlugins() - - expect: - sut.documentationPlugins.size() == 0 - sut.documentationPlugins().size() == 1 - } - - def "When documentation plugins are explicitly defined"() { - given: - def mockPlugin = Mock(DocumentationPlugin) - - and: - mockPlugin.groupName >> "default" - def sut = customWebPlugins([mockPlugin]) - - expect: - sut.documentationPlugins.size() == 1 - sut.documentationPlugins().first() == mockPlugin - } - - def "Even when no operation plugins are applied an empty operation is returned"() { - given: - def operationContext = Mock(OperationContext) - - and: - operationContext.operationBuilder() >> new OperationBuilder(new CachingOperationNameGenerator()) - operationContext.documentationType >> DocumentationType.SWAGGER_2 - - when: - def sut = customWebPlugins() - def operation = sut.operation(operationContext) - - then: - operation != null - } - - def "Operation plugins are applied"() { - given: - def operationPlugin = Mock(OperationBuilderPlugin) - def operationContext = Mock(OperationContext) - - and: - operationContext.operationBuilder() >> new OperationBuilder(new CachingOperationNameGenerator()) - operationContext.documentationType >> DocumentationType.SPRING_WEB - operationPlugin.supports(_) >> true - - when: - def sut = customWebPlugins([], [], [operationPlugin]) - def operation = sut.operation(operationContext) - - then: - operation != null - operationPlugin.apply(operationContext) - } - - def "Even when no parameter plugins are applied an empty operation is returned"() { - given: - def paramContext = Mock(ParameterContext) - - and: - paramContext.parameterBuilder() >> new ParameterBuilder() - paramContext.requestParameterBuilder() >> new RequestParameterBuilder() - paramContext.documentationType >> DocumentationType.SWAGGER_2 - - when: - def sut = customWebPlugins() - def parameter = sut.parameter(paramContext) - - then: - parameter != null - } - - def "Parameter plugins are applied"() { - given: - def paramPlugin = Mock(ParameterBuilderPlugin) - def paramContext = Mock(ParameterContext) - - and: - paramContext.parameterBuilder() >> new ParameterBuilder() - paramContext.requestParameterBuilder() >> new RequestParameterBuilder() - paramContext.documentationType >> DocumentationType.SPRING_WEB - paramPlugin.supports(_) >> true - - when: - def sut = customWebPlugins([], [], [], [paramPlugin]) - def parameter = sut.parameter(paramContext) - - then: - parameter != null - paramPlugin.apply(paramContext) - } - - def "Path decorator plugins are applied"() { - given: - def pathContext = Mock(PathContext) - def context = Mock(DocumentationContext) - - and: - pathContext.pathProvider() >> new DefaultPathProvider() - pathContext.documentationContext() >> context - context.getPathMapping() >> empty() - pathContext.parameters >> [] - - when: - def sut = defaultWebPlugins() - def decorator = sut.decorator(pathContext) - - then: - decorator != null - decorator.apply("") == "/" - } -} diff --git a/springfox-spring-webmvc/src/test/groovy/springfox/documentation/spring/web/plugins/PathAndParametersEquivalenceSpec.groovy b/springfox-spring-webmvc/src/test/groovy/springfox/documentation/spring/web/plugins/PathAndParametersEquivalenceSpec.groovy deleted file mode 100644 index af611c18285..00000000000 --- a/springfox-spring-webmvc/src/test/groovy/springfox/documentation/spring/web/plugins/PathAndParametersEquivalenceSpec.groovy +++ /dev/null @@ -1,86 +0,0 @@ -package springfox.documentation.spring.web.plugins - -import com.fasterxml.classmate.TypeResolver -import org.springframework.web.bind.annotation.RequestMethod -import org.springframework.web.servlet.mvc.condition.NameValueExpression -import org.springframework.web.servlet.mvc.condition.ParamsRequestCondition -import org.springframework.web.servlet.mvc.condition.PatternsRequestCondition -import spock.lang.Specification -import spock.lang.Unroll -import springfox.documentation.RequestHandler -import springfox.documentation.service.ResolvedMethodParameter -import springfox.documentation.spring.web.WebMvcPatternsRequestConditionWrapper -import springfox.documentation.spring.web.paths.Paths - -import java.util.stream.Stream - -import static java.util.stream.Collectors.* -import static org.springframework.web.bind.annotation.RequestMethod.* - -class PathAndParametersEquivalenceSpec extends Specification { - @Unroll - def "two methods parameters are considered same => #areSame"() { - given: - def sut = new PathAndParametersEquivalence() - - expect: - sut.test(first, second) == areSame - (sut.doHash(first) == sut.doHash(second)) == sameHash - - where: - first | second | sameHash | areSame - handler("/a", GET, ["vendor/a"], param("a", String)) | handler("/a", GET, ["vendor/a"], param("b", String)) | false | false - handler("/b", GET, ["vendor/a"], param("a", String)) | handler("/a", GET, ["vendor/a"], param("a", String)) | false | false - handler("/a", GET, ["vendor/a"], param("a", String)) | handler("/a", GET, ["vendor/b"], param("a", String)) | true | true - handler("/a", GET, ["vendor/a"], param("a", String)) | handler("/a", POST, ["vendor/a"], param("a", String)) | false | false - handler("/a", GET, ["vendor/a"], param("a", String)) | handler("/a", [GET, POST], ["vendor/a"], param("a", String)) | false | true - handler("/a", GET, ["vendor/a"], param("a", String)) | handler("/a", GET, ["vendor/a"], param("a", String)) | true | true - handlerWithDifferentParams("state=TX") | handlerWithDifferentParams("state=CA") | false | false - } - - def handlerWithDifferentParams(String expression) { - handler( - "/a", - [GET], - ["vendor/a"], - param("a", String), - new ParamsRequestCondition(expression).expressions) - } - - RequestHandler handler( - String path, - List methods, - List produces, - ResolvedMethodParameter parameter, - Set> params) { - def handler = Mock(RequestHandler) - handler.patternsCondition >> new WebMvcPatternsRequestConditionWrapper( - Paths.ROOT, - new PatternsRequestCondition(path)) - handler.produces() >> Stream.of(produces).collect(toSet()) - handler.parameters >> [parameter] - handler.supportedMethods() >> methods - handler.params() >> params - handler - } - - RequestHandler handler( - String path, - List methods, - List produces, - ResolvedMethodParameter parameter) { - handler(path, methods, produces, parameter, [] as Set) - } - - RequestHandler handler( - String path, - RequestMethod method, - List produces, - ResolvedMethodParameter parameter) { - handler(path, [method], produces, parameter) - } - - def param(String name, Class aClass, int index = 0) { - new ResolvedMethodParameter(index, name, [], new TypeResolver().resolve(aClass)) - } -} diff --git a/springfox-spring-webmvc/src/test/groovy/springfox/documentation/spring/web/plugins/WebMvcRequestHandlerProviderSpec.groovy b/springfox-spring-webmvc/src/test/groovy/springfox/documentation/spring/web/plugins/WebMvcRequestHandlerProviderSpec.groovy deleted file mode 100644 index 823a806eaa5..00000000000 --- a/springfox-spring-webmvc/src/test/groovy/springfox/documentation/spring/web/plugins/WebMvcRequestHandlerProviderSpec.groovy +++ /dev/null @@ -1,38 +0,0 @@ -/* - * - * Copyright 2017-2019 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ -package springfox.documentation.spring.web.plugins - -import com.fasterxml.classmate.TypeResolver -import org.springframework.mock.web.MockServletContext -import spock.lang.Specification -import springfox.documentation.spring.web.readers.operation.HandlerMethodResolver - -class WebMvcRequestHandlerProviderSpec extends Specification { - def "when handler mappings is empty or null" () { - given: - WebMvcRequestHandlerProvider sut = new WebMvcRequestHandlerProvider( - Optional.of(new MockServletContext("/")), - new HandlerMethodResolver(new TypeResolver()), - handlers) - expect: - sut.requestHandlers().size() == 0 - where: - handlers << [null, []] - } -} diff --git a/springfox-spring-webmvc/src/test/groovy/springfox/documentation/spring/web/readers/ApiModelReaderSpec.groovy b/springfox-spring-webmvc/src/test/groovy/springfox/documentation/spring/web/readers/ApiModelReaderSpec.groovy deleted file mode 100755 index 1ab4ac028ca..00000000000 --- a/springfox-spring-webmvc/src/test/groovy/springfox/documentation/spring/web/readers/ApiModelReaderSpec.groovy +++ /dev/null @@ -1,1588 +0,0 @@ -/* - * - * Copyright 2015-2018 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.spring.web.readers - -import com.fasterxml.classmate.TypeResolver -import com.fasterxml.jackson.databind.MapperFeature -import com.fasterxml.jackson.databind.ObjectMapper -import org.springframework.http.HttpEntity -import org.springframework.http.ResponseEntity -import org.springframework.plugin.core.OrderAwarePluginRegistry -import org.springframework.plugin.core.PluginRegistry -import org.springframework.web.method.HandlerMethod -import spock.lang.Ignore -import springfox.documentation.schema.DefaultTypeNameProvider -import springfox.documentation.schema.JacksonEnumTypeDeterminer -import springfox.documentation.schema.Model -import springfox.documentation.schema.ModelProperty -import springfox.documentation.schema.ModelReference -import springfox.documentation.schema.TypeNameExtractor -import springfox.documentation.service.ResourceGroup -import springfox.documentation.spi.DocumentationType -import springfox.documentation.spi.schema.TypeNameProviderPlugin -import springfox.documentation.spi.service.contexts.RequestMappingContext -import springfox.documentation.spring.web.WebMvcRequestHandler -import springfox.documentation.spring.web.dummy.DummyClass -import springfox.documentation.spring.web.dummy.DummyModels -import springfox.documentation.spring.web.dummy.controllers.BusinessService -import springfox.documentation.spring.web.dummy.controllers.PetService -import springfox.documentation.spring.web.dummy.models.Foo -import springfox.documentation.spring.web.dummy.models.FoobarDto -import springfox.documentation.spring.web.dummy.models.Holder -import springfox.documentation.spring.web.dummy.models.Monkey -import springfox.documentation.spring.web.dummy.models.PetWithJsonView -import springfox.documentation.spring.web.dummy.models.Pirate -import springfox.documentation.spring.web.dummy.models.RecursiveTypeWithConditions -import springfox.documentation.spring.web.dummy.models.RecursiveTypeWithNonEqualsConditionsMiddleWithCircle -import springfox.documentation.spring.web.dummy.models.RecursiveTypeWithNonEqualsConditionsOuter -import springfox.documentation.spring.web.dummy.models.SameFancyPet -import springfox.documentation.spring.web.dummy.models.Wrapper -import springfox.documentation.spring.web.dummy.models.same.Pet -import springfox.documentation.spring.web.mixins.ModelProviderForServiceSupport -import springfox.documentation.spring.web.mixins.RequestMappingSupport -import springfox.documentation.spring.web.plugins.DocumentationContextSpec -import springfox.documentation.spring.web.plugins.DocumentationPluginsManager -import springfox.documentation.spring.web.readers.operation.HandlerMethodResolver -import springfox.documentation.spring.web.scanners.ApiModelReader - -import jakarta.servlet.http.HttpServletResponse -import java.util.function.Function -import java.util.stream.Collectors - -import static springfox.documentation.spring.web.paths.Paths.* - -@SuppressWarnings(["deprecation", "GrDeprecatedAPIUsage"]) -class ApiModelReaderSpec - extends DocumentationContextSpec - implements RequestMappingSupport, - ModelProviderForServiceSupport { - - ApiModelReader sut - ApiModelReader sutSpecial - DocumentationPluginsManager pluginsManager - ResourceGroup resourceGroup - TypeNameExtractor typeNameExtractor - def methodResolver = new HandlerMethodResolver(new TypeResolver()) - - def setup() { - TypeResolver typeResolver = new TypeResolver() - PluginRegistry modelNameRegistry = - OrderAwarePluginRegistry.of([new DefaultTypeNameProvider()]) - typeNameExtractor = new TypeNameExtractor( - typeResolver, - modelNameRegistry, - new JacksonEnumTypeDeterminer()) - pluginsManager = defaultWebPlugins() - sut = new ApiModelReader( - modelProvider(), - new TypeResolver(), - pluginsManager, - new JacksonEnumTypeDeterminer(), - typeNameExtractor) - ObjectMapper mapper = new ObjectMapper() - mapper.disable(MapperFeature.DEFAULT_VIEW_INCLUSION) - sutSpecial = new ApiModelReader( - modelProvider( - defaultSchemaPlugins(), - new TypeResolver(), - new JacksonEnumTypeDeterminer(), - mapper), - new TypeResolver(), - pluginsManager, - new JacksonEnumTypeDeterminer(), - typeNameExtractor) - resourceGroup = new ResourceGroup( - "businesses", - DummyClass) - } - - def requestMappingContext( - HandlerMethod handlerMethod, - String path, - String paramId = "0") { - return new RequestMappingContext( - paramId, - documentationContext(), - new WebMvcRequestHandler( - ROOT, - methodResolver, - requestMappingInfo(path), - handlerMethod)) - } - - Function toModelMap = new Function() { - String apply(Model model) { - return model.getName() - } - } - - def "Method return type model"() { - given: - RequestMappingContext context = requestMappingContext( - dummyHandlerMethod('methodWithConcreteResponseBody'), - '/somePath') - - when: - def modelsMap = sut.read(context) - - then: - modelsMap.containsKey("0_0") - Map models = modelsMap.get("0_0").stream() - .collect( - Collectors.toMap( - toModelMap, - Function.identity())) - - models.size() == 1 - Model model = models.get('BusinessModel') - model.id == '0_0_springfox.documentation.spring.web.dummy.DummyModels$BusinessModel' - model.getName() == 'BusinessModel' - model.getQualifiedType() == 'springfox.documentation.spring.web.dummy.DummyModels$BusinessModel' - - Map modelProperties = model.getProperties() - modelProperties.size() == 2 - - ModelProperty nameProp = modelProperties['name'] - nameProp.type.erasedType == String - nameProp.getQualifiedType() == 'java.lang.String' - nameProp.getPosition() == 0 - !nameProp.isRequired() - nameProp.getDescription() == null - def item = nameProp.getModelRef() - item.type == "string" - !item.collection - item.itemType == null - } - - def "should only generate models for request parameters that are annotated with Springs RequestBody"() { - given: - HandlerMethod handlerMethod = dummyHandlerMethod( - 'methodParameterWithRequestBodyAnnotation', - DummyModels.BusinessModel, - HttpServletResponse.class, - DummyModels.AnnotatedBusinessModel.class - ) - RequestMappingContext context = requestMappingContext( - handlerMethod, - '/somePath') - when: - def modelsMap = sut.read(context) - - then: - modelsMap.containsKey("0_1") - Map models = modelsMap.get("0_1").stream() - .collect( - Collectors.toMap( - toModelMap, - Function.identity())) - - models.size() == 1 // instead of 3 - Model model = models.get("BusinessModel") - model.getName() == "BusinessModel" - } - - def requestMappingContext(HandlerMethod handlerMethod) { - return new RequestMappingContext( - "0", - documentationContext(), - new WebMvcRequestHandler( - ROOT, - methodResolver, - requestMappingInfo('/somePath'), - handlerMethod)) - } - - def "should only generate models for request parameters that are annotated with Springs RequestPart"() { - given: - HandlerMethod handlerMethod = dummyHandlerMethod( - 'methodParameterWithRequestPartAnnotation', - DummyModels.BusinessModel, - HttpServletResponse.class, - DummyModels.AnnotatedBusinessModel.class - ) - RequestMappingContext context = requestMappingContext( - handlerMethod, - '/somePath') - - when: - def modelsMap = sut.read(context) - - then: - modelsMap.containsKey("0_1") - Map models = modelsMap.get("0_1").stream() - .collect( - Collectors.toMap( - toModelMap, - Function.identity())) - - models.size() == 1 // instead of 3 - Model model = models.get("BusinessModel") - model.getName() == "BusinessModel" - - } - - def "should not generate models for simple type request parameters that are annotated with Springs RequestPart"() { - given: - HandlerMethod handlerMethod = dummyHandlerMethod( - 'methodParameterWithRequestPartAnnotationOnSimpleType', - String.class, - HttpServletResponse.class, - DummyModels.AnnotatedBusinessModel.class - ) - RequestMappingContext context = requestMappingContext( - handlerMethod, - '/somePath') - - when: - def modelsMap = sut.read(context) - - then: - modelsMap.isEmpty() // instead of 3 - - } - - @Ignore("This needs to move to a swagger 1.2 test") - def "Generates the correct models when there is a Map object in the input parameter"() { - given: - HandlerMethod handlerMethod = handlerMethodIn( - PetService, - 'echo', - Map) - RequestMappingContext context = requestMappingContext(handlerMethod) - - when: - def modelsMap = sut.read(context) - - then: - modelsMap.containsKey("0") - Map models = modelsMap.get("0").stream() - .collect( - Collectors.toMap( - toModelMap, - Function.identity())) - - models.size() == 2 - models.containsKey("Entry«string,Pet»") - models.containsKey("Pet") - - } - - def "Generates the correct models when alternateTypeProvider returns an ignoreable or base parameter type"() { - given: - plugin - . - genericModelSubstitutes( - ResponseEntity, - HttpEntity) - . - configure(contextBuilder) - - and: - HandlerMethod handlerMethod = handlerMethodIn( - BusinessService, - 'getResponseEntity', - String) - RequestMappingContext context = requestMappingContext( - handlerMethod, - '/businesses/responseEntity/{businessId}') - - when: - def modelsMap = sut.read(context) - - then: - modelsMap.isEmpty() - - } - - def "model should include property that is only visible during serialization"() { - given: - HandlerMethod handlerMethod = dummyHandlerMethod( - 'methodWithSerializeOnlyPropInReturnAndRequestBodyParam', - DummyModels.ModelWithSerializeOnlyProperty - ) - RequestMappingContext context = requestMappingContext( - handlerMethod, - '/somePath') - - when: - def modelsMap = sut.read(context) - - then: - modelsMap.containsKey("0_0") - modelsMap.containsKey("0_1") - Map models_1 = modelsMap.get("0_0").stream() - .collect( - Collectors.toMap( - toModelMap, - Function.identity())) - Map models_2 = modelsMap.get("0_1").stream() - .collect( - Collectors.toMap( - toModelMap, - Function.identity())) - - models_1.size() == 1 - models_2.size() == 1 - - String baseModelName = DummyModels.ModelWithSerializeOnlyProperty.class.simpleName - - models_1.containsKey(baseModelName) - models_2.containsKey(baseModelName + '_1') - - Model model_1 = models_1.get(baseModelName) - - Map modelProperties_1 = model_1.getProperties() - - modelProperties_1.size() == 2 - modelProperties_1.containsKey('visibleForSerialize') - modelProperties_1.containsKey('alwaysVisible') - - Model model_2 = models_2.get(baseModelName + '_1') - - Map modelProperties_2 = model_2.getProperties() - - modelProperties_2.size() == 1 - modelProperties_2.containsKey('alwaysVisible') - } - - def "model includes snake_case property that is only visible when CAMEL_CASE_TO_LOWER_CASE_WITH_UNDERSCORES is on"() { - given: - HandlerMethod handlerMethod = dummyHandlerMethod( - 'methodWithSerializeOnlyPropInReturnAndRequestBodyParam', - DummyModels.ModelWithSerializeOnlyProperty - ) - RequestMappingContext context = requestMappingContext( - handlerMethod, - '/somePath') - - and: - def snakeCaseReader = new ApiModelReader( - modelProviderWithSnakeCaseNamingStrategy(), - new TypeResolver(), - defaultWebPlugins(), - new JacksonEnumTypeDeterminer(), - typeNameExtractor) - when: - def modelsMap = snakeCaseReader.read(context) - - then: - modelsMap.containsKey("0_0") - modelsMap.containsKey("0_1") - Map models_1 = modelsMap.get("0_0").stream() - .collect( - Collectors.toMap( - toModelMap, - Function.identity())) - Map models_2 = modelsMap.get("0_1").stream() - .collect( - Collectors.toMap( - toModelMap, - Function.identity())) - - models_1.size() == 1 - models_2.size() == 1 - - String baseModelName = DummyModels.ModelWithSerializeOnlyProperty.class.simpleName - - models_1.containsKey(baseModelName) - models_2.containsKey(baseModelName + '_1') - - Model model_1 = models_1[baseModelName] - - Map modelProperties_1 = model_1.getProperties() - - modelProperties_1.size() == 2 - modelProperties_1.containsKey('visible_for_serialize') - modelProperties_1.containsKey('always_visible') - - Model model_2 = models_2[baseModelName + '_1'] - - Map modelProperties_2 = model_2.getProperties() - - modelProperties_2.size() == 1 - modelProperties_2.containsKey('always_visible') - - } - - def "Test to verify issue #283"() { - given: - HandlerMethod handlerMethod = dummyHandlerMethod( - 'methodToTestFoobarDto', - FoobarDto) - RequestMappingContext context = requestMappingContext( - handlerMethod, - '/somePath') - - when: - def modelsMap = sut.read(context) - - then: - modelsMap.containsKey("0_0") - modelsMap.containsKey("0_1") - Map models_1 = modelsMap.get("0_0").stream() - .collect( - Collectors.toMap( - toModelMap, - Function.identity())) - Map models_2 = modelsMap.get("0_1").stream() - .collect( - Collectors.toMap( - toModelMap, - Function.identity())) - - models_1.size() == 1 - models_2.size() == 1 - - String baseModelName = FoobarDto.simpleName - - models_1.containsKey(baseModelName) - models_2.containsKey(baseModelName + '_1') - - Model model_1 = models_1[baseModelName] - - Map modelProperties_1 = model_1.getProperties() - - modelProperties_1.size() == 2 - modelProperties_1.containsKey('visibleForSerialize') - modelProperties_1.containsKey('foobar') - - Model model_2 = models_2[baseModelName + '_1'] - - Map modelProperties_2 = model_2.getProperties() - - modelProperties_2.size() == 1 - modelProperties_2.containsKey('foobar') - - } - - def "Test to verify issue #1196"() { - given: - HandlerMethod handlerMethod = dummyHandlerMethod( - 'methodToTestBidirectionalRecursiveTypes', - Pirate) - RequestMappingContext context = requestMappingContext( - handlerMethod, - '/somePath') - - when: - def modelsMap = sut.read(context) - - then: - modelsMap.containsKey("0_1") - modelsMap.containsKey("0_0") - Map models_1 = modelsMap.get("0_0").stream() - .collect( - Collectors.toMap( - toModelMap, - Function.identity())) - Map models_2 = modelsMap.get("0_1").stream() - .collect( - Collectors.toMap( - toModelMap, - Function.identity())) - - and: - Model pirate_1 = models_1[Pirate.simpleName] - Model monkey_1 = models_1[Monkey.simpleName] - - and: - models_1.size() == 2 - - and: - pirate_1 != null - monkey_1 != null - - and: - pirate_1.getProperties().containsKey('monkey') - ModelReference modelRef_1 = pirate_1.getProperties().get('monkey').getModelRef() - modelRef_1.getModelId().get() == "springfox.documentation.spring.web.dummy.models.Monkey" - - monkey_1.getProperties().containsKey('pirate') - ModelReference modelRef_2 = monkey_1.getProperties().get('pirate').getModelRef() - modelRef_2.getModelId().get() == "springfox.documentation.spring.web.dummy.models.Pirate" - - and: - Model pirate_2 = models_2[Pirate.simpleName] - Model monkey_2 = models_2[Monkey.simpleName] - - and: - models_2.size() == 2 - - and: - pirate_2 != null - monkey_2 != null - - and: - pirate_2.getProperties().containsKey('monkey') - ModelReference modelRef_3 = pirate_2.getProperties().get('monkey').getModelRef() - modelRef_3.getModelId().get() == "springfox.documentation.spring.web.dummy.models.Monkey" - - monkey_2.getProperties().containsKey('pirate') - ModelReference modelRef_4 = monkey_2.getProperties().get('pirate').getModelRef() - modelRef_4.getModelId().get() == "springfox.documentation.spring.web.dummy.models.Pirate" - - } - - def "Test to verify that recursive type same for serialization and deserialization"() { - given: - HandlerMethod handlerMethod = dummyHandlerMethod( - 'methodToTestBidirectionalRecursiveTypesWithConditions', - RecursiveTypeWithConditions) - RequestMappingContext context = requestMappingContext( - handlerMethod, - '/somePath') - - when: - def modelsMap = sut.read(context) - - then: - modelsMap.containsKey("0_1") - modelsMap.containsKey("0_0") - Map models_1 = modelsMap.get("0_0").stream() - .collect( - Collectors.toMap( - toModelMap, - Function.identity())) - Map models_2 = modelsMap.get("0_1").stream() - .collect( - Collectors.toMap( - toModelMap, - Function.identity())) - - and: - Model recursiveTypeWithConditions_1 = models_1[RecursiveTypeWithConditions.simpleName] - Model monkey_1 = models_1[Monkey.simpleName] - Model pirate_1 = models_1[Pirate.simpleName] - - and: - models_1.size() == 3 - - and: - recursiveTypeWithConditions_1 != null - pirate_1 != null - monkey_1 != null - - and: - recursiveTypeWithConditions_1.getProperties().containsKey('monkey') - ModelReference modelRef_1 = recursiveTypeWithConditions_1.getProperties().get('monkey').getModelRef() - modelRef_1.getModelId().get() == "springfox.documentation.spring.web.dummy.models.Monkey" - modelRef_1.getType() == 'Monkey' - - monkey_1.getProperties().containsKey('pirate') - ModelReference modelRef_2 = monkey_1.getProperties().get('pirate').getModelRef() - modelRef_2.getModelId().get() == "springfox.documentation.spring.web.dummy.models.Pirate" - modelRef_2.getType() == 'Pirate' - - pirate_1.getProperties().containsKey('monkey') - ModelReference modelRef_3 = pirate_1.getProperties().get('monkey').getModelRef() - modelRef_3.getModelId().get() == "springfox.documentation.spring.web.dummy.models.Monkey" - modelRef_3.getType() == 'Monkey' - - and: - Model recursiveTypeWithConditions_2 = models_2[RecursiveTypeWithConditions.simpleName + '_1'] - Model monkey_2 = models_2[Monkey.simpleName] - Model pirate_2 = models_2[Pirate.simpleName] - - and: - models_2.size() == 3 - - and: - recursiveTypeWithConditions_2 != null - pirate_2 != null - monkey_2 != null - - and: - recursiveTypeWithConditions_2.getProperties().containsKey('monkey') - ModelReference modelRef_4 = recursiveTypeWithConditions_2.getProperties().get('monkey').getModelRef() - modelRef_4.getModelId().get() == "springfox.documentation.spring.web.dummy.models.Monkey" - modelRef_4.getType() == 'Monkey' - - recursiveTypeWithConditions_2.getProperties().containsKey('conditionalProperty') - - monkey_2.getProperties().containsKey('pirate') - ModelReference modelRef_5 = monkey_2.getProperties().get('pirate').getModelRef() - modelRef_5.getModelId().get() == "springfox.documentation.spring.web.dummy.models.Pirate" - modelRef_5.getType() == 'Pirate' - - pirate_2.getProperties().containsKey('monkey') - ModelReference modelRef_6 = pirate_2.getProperties().get('monkey').getModelRef() - modelRef_6.getModelId().get() == "springfox.documentation.spring.web.dummy.models.Monkey" - modelRef_6.getType() == 'Monkey' - - } - - def "Test to verify that type holder doesn't generate spare models"() { - given: - HandlerMethod handlerMethod = - dummyHandlerMethod( - 'methodToTestSpareModelsWithKnownTypes', - Foo, - Holder) - RequestMappingContext contextFirst = requestMappingContext( - handlerMethod, - '/somePath') - - when: - def modelsMap = new HashMap<>(sut.read(contextFirst)) - - then: - modelsMap.containsKey("0_2") - modelsMap.containsKey("0_1") - modelsMap.containsKey("0_0") - Map models_1 = modelsMap.get("0_0").stream() - .collect( - Collectors.toMap( - toModelMap, - Function.identity())) - Map models_2 = modelsMap.get("0_1").stream() - .collect( - Collectors.toMap( - toModelMap, - Function.identity())) - Map models_3 = modelsMap.get("0_2").stream() - .collect( - Collectors.toMap( - toModelMap, - Function.identity())) - - and: - modelsMap.keySet().size() == 3 - - and: - models_1.size() == 4 - Model foo1 = models_1['Foo'] - Model bar1 = models_1['Bar'] - Model barHolder1 = models_1['Holder«Bar»'] - Model barWrapper1 = models_1['Wrapper«Bar»'] - - models_2.size() == 1 - Model foo2 = models_2['Foo'] - - models_3.size() == 4 - Model foo3 = models_3['Foo'] - Model bar2 = models_3['Bar'] - Model barHolder2 = models_3['Holder«Bar»'] - Model barWrapper2 = models_3['Wrapper«Bar»'] - - and: - foo1.equalsIgnoringName(foo2) - foo1.equalsIgnoringName(foo3) - - bar1.equalsIgnoringName(bar2) - - barHolder1.equalsIgnoringName(barHolder2) - - barWrapper1.equalsIgnoringName(barWrapper2) - - and: - foo1.getName().equals("Foo") - foo1.getName().equals(foo2.getName()) - foo1.getName().equals(foo3.getName()) - - bar1.getName().equals("Bar") - bar1.getName().equals(bar2.getName()) - - barHolder1.getName().equals("Holder«Bar»") - barHolder1.getName().equals(barHolder2.getName()) - - barWrapper1.getName().equals("Wrapper«Bar»") - barWrapper1.getName().equals(barWrapper2.getName()) - - } - - def "Test to verify that recursive type different for serialization and deserialization"() { - given: - HandlerMethod handlerMethod = dummyHandlerMethod( - 'methodToTestBidirectionalRecursiveTypesWithNonEqualsConditions', - RecursiveTypeWithNonEqualsConditionsOuter) - RequestMappingContext context = requestMappingContext( - handlerMethod, - '/somePath') - - when: - def modelsMap = sut.read(context) - - then: - modelsMap.containsKey("0_1") - modelsMap.containsKey("0_0") - Map models_1 = modelsMap.get("0_0").stream() - .collect( - Collectors.toMap( - toModelMap, - Function.identity())) - Map models_2 = modelsMap.get("0_1").stream() - .collect( - Collectors.toMap( - toModelMap, - Function.identity())) - - and: - Model recursiveTypeWithConditionsOuter_1 = models_1['RecursiveTypeWithNonEqualsConditionsOuter'] - Model recursiveTypeWithConditionsMiddle_1 = models_1['RecursiveTypeWithNonEqualsConditionsMiddle'] - Model recursiveTypeWithConditionsInner_1 = models_1['RecursiveTypeWithNonEqualsConditionsInner'] - - and: - models_1.size() == 3 - - and: - recursiveTypeWithConditionsOuter_1 != null - recursiveTypeWithConditionsMiddle_1 != null - recursiveTypeWithConditionsInner_1 != null - - and: - recursiveTypeWithConditionsOuter_1.getProperties().size() == 1 - - recursiveTypeWithConditionsOuter_1.getProperties().containsKey('recursiveTypeWithNonEqualsConditionsMiddle') - ModelReference modelRef_1 = recursiveTypeWithConditionsOuter_1. - getProperties() - . - get('recursiveTypeWithNonEqualsConditionsMiddle'). - getModelRef() - modelRef_1. - getModelId(). - get() == "springfox.documentation.spring.web.dummy.models.RecursiveTypeWithNonEqualsConditionsMiddle" - modelRef_1.getType() == 'RecursiveTypeWithNonEqualsConditionsMiddle' - - recursiveTypeWithConditionsMiddle_1.getProperties().containsKey('recursiveTypeWithNonEqualsConditionsInner') - ModelReference modelRef_2 = recursiveTypeWithConditionsMiddle_1. - getProperties() - . - get('recursiveTypeWithNonEqualsConditionsInner'). - getModelRef() - modelRef_2. - getModelId(). - get() == "springfox.documentation.spring.web.dummy.models.RecursiveTypeWithNonEqualsConditionsInner" - modelRef_2.getType() == 'RecursiveTypeWithNonEqualsConditionsInner' - - recursiveTypeWithConditionsInner_1.getProperties().containsKey('recursiveTypeWithNonEqualsConditionsOuter') - ModelReference modelRef_3 = recursiveTypeWithConditionsInner_1. - getProperties() - . - get('recursiveTypeWithNonEqualsConditionsOuter'). - getModelRef() - modelRef_3. - getModelId(). - get() == "springfox.documentation.spring.web.dummy.models.RecursiveTypeWithNonEqualsConditionsOuter" - modelRef_3.getType() == 'RecursiveTypeWithNonEqualsConditionsOuter' - - and: - Model recursiveTypeWithConditionsOuter_2 = models_2['RecursiveTypeWithNonEqualsConditionsOuter_1'] - Model recursiveTypeWithConditionsMiddle_2 = models_2['RecursiveTypeWithNonEqualsConditionsMiddle_1'] - Model recursiveTypeWithConditionsInner_2 = models_2['RecursiveTypeWithNonEqualsConditionsInner_1'] - - and: - models_2.size() == 3 - - and: - recursiveTypeWithConditionsOuter_2 != null - recursiveTypeWithConditionsMiddle_2 != null - recursiveTypeWithConditionsInner_2 != null - - and: - recursiveTypeWithConditionsOuter_2.getProperties().size() == 2 - - recursiveTypeWithConditionsOuter_2.getProperties().containsKey('recursiveTypeWithNonEqualsConditionsMiddle') - ModelReference modelRef_4 = recursiveTypeWithConditionsOuter_2. - getProperties() - . - get('recursiveTypeWithNonEqualsConditionsMiddle'). - getModelRef() - modelRef_4. - getModelId(). - get() == "springfox.documentation.spring.web.dummy.models.RecursiveTypeWithNonEqualsConditionsMiddle" - modelRef_4.getType() == 'RecursiveTypeWithNonEqualsConditionsMiddle_1' - - recursiveTypeWithConditionsMiddle_2.getProperties().containsKey('recursiveTypeWithNonEqualsConditionsInner') - ModelReference modelRef_5 = recursiveTypeWithConditionsMiddle_2. - getProperties() - . - get('recursiveTypeWithNonEqualsConditionsInner'). - getModelRef() - modelRef_5. - getModelId(). - get() == "springfox.documentation.spring.web.dummy.models.RecursiveTypeWithNonEqualsConditionsInner" - modelRef_5.getType() == 'RecursiveTypeWithNonEqualsConditionsInner_1' - - recursiveTypeWithConditionsInner_2.getProperties().containsKey('recursiveTypeWithNonEqualsConditionsOuter') - ModelReference modelRef_6 = recursiveTypeWithConditionsInner_2. - getProperties() - . - get('recursiveTypeWithNonEqualsConditionsOuter'). - getModelRef() - modelRef_6. - getModelId(). - get() == "springfox.documentation.spring.web.dummy.models.RecursiveTypeWithNonEqualsConditionsOuter" - modelRef_6.getType() == 'RecursiveTypeWithNonEqualsConditionsOuter_1' - - } - - def "Test to verify that recursive type same with known types from other branch"() { - given: - HandlerMethod handlerMethodFirst = dummyHandlerMethod( - 'methodToTestBidirectionalRecursiveTypesWithConditions', - RecursiveTypeWithConditions) - RequestMappingContext contextFirst = requestMappingContext( - handlerMethodFirst, - '/somePath', - '0') - - HandlerMethod handlerMethodSecond = dummyHandlerMethod( - 'methodToTestBidirectionalRecursiveTypesWithNonEqualsConditions', - RecursiveTypeWithNonEqualsConditionsOuter) - RequestMappingContext contextSecond = requestMappingContext( - handlerMethodSecond, - '/somePath', - '1') - - when: - def modelsMap = new HashMap<>(sut.read(contextFirst)) - modelsMap.putAll(sut.read(contextSecond.withKnownModels(modelsMap))) - - then: - modelsMap.containsKey("0_0") - Map models_1 = modelsMap.get("0_0").stream() - .collect( - Collectors.toMap( - toModelMap, - Function.identity())) - - modelsMap.containsKey("0_1") - Map models_2 = modelsMap.get("0_1").stream() - .collect( - Collectors.toMap( - toModelMap, - Function.identity())) - - modelsMap.containsKey("1_0") - Map models_3 = modelsMap.get("1_0").stream() - .collect( - Collectors.toMap( - toModelMap, - Function.identity())) - - modelsMap.containsKey("1_1") - Map models_4 = modelsMap.get("1_1").stream() - .collect( - Collectors.toMap( - toModelMap, - Function.identity())) - - and: - Model recursiveTypeWithConditions_1 = models_1[RecursiveTypeWithConditions.simpleName] - Model monkey_1 = models_1[Monkey.simpleName] - Model pirate_1 = models_1[Pirate.simpleName] - - and: - Model recursiveTypeWithConditions_2 = models_2[RecursiveTypeWithConditions.simpleName + '_1'] - Model monkey_2 = models_2[Monkey.simpleName] - Model pirate_2 = models_2[Pirate.simpleName] - - and: - models_1.size() == 3 - - and: - recursiveTypeWithConditions_1 != null - pirate_1 != null - monkey_1 != null - - and: - models_2.size() == 3 - - and: - recursiveTypeWithConditions_2 != null - pirate_2 != null - monkey_2 != null - - and: - Model recursiveTypeWithConditionsOuter_1 = models_3['RecursiveTypeWithNonEqualsConditionsOuter'] - Model recursiveTypeWithConditionsMiddle_1 = models_3['RecursiveTypeWithNonEqualsConditionsMiddle'] - Model recursiveTypeWithConditionsInner_1 = models_3['RecursiveTypeWithNonEqualsConditionsInner'] - - and: - Model recursiveTypeWithConditionsOuter_2 = models_4['RecursiveTypeWithNonEqualsConditionsOuter_1'] - Model recursiveTypeWithConditionsMiddle_2 = models_4['RecursiveTypeWithNonEqualsConditionsMiddle_1'] - Model recursiveTypeWithConditionsInner_2 = models_4['RecursiveTypeWithNonEqualsConditionsInner_1'] - - and: - models_1.size() == 3 - - and: - recursiveTypeWithConditionsOuter_1 != null - recursiveTypeWithConditionsMiddle_1 != null - recursiveTypeWithConditionsInner_1 != null - - and: - models_2.size() == 3 - - and: - recursiveTypeWithConditionsOuter_2 != null - recursiveTypeWithConditionsMiddle_2 != null - recursiveTypeWithConditionsInner_2 != null - - } - - def "Test to verify that recursive type with dependent non equals circle produce two models"() { - given: - HandlerMethod handlerMethodFirst = dummyHandlerMethod( - 'methodToTestBidirectionalRecursiveTypesWithCircle', - RecursiveTypeWithNonEqualsConditionsMiddleWithCircle) - RequestMappingContext contextFirst = requestMappingContext( - handlerMethodFirst, - '/somePath', - '0') - - HandlerMethod handlerMethodSecond = dummyHandlerMethod('methodToTestBidirectionalRecursiveTypesWithCircle') - RequestMappingContext contextSecond = requestMappingContext( - handlerMethodSecond, - '/somePath', - '1') - - when: - def modelsMap = new HashMap<>(sut.read(contextFirst)) - modelsMap.putAll(sut.read(contextSecond.withKnownModels(modelsMap))) - - then: - - modelsMap.containsKey("0_0") - Map models_1 = modelsMap.get("0_0").stream() - .collect( - Collectors.toMap( - toModelMap, - Function.identity())) - - modelsMap.containsKey("0_1") - Map models_2 = modelsMap.get("0_1").stream() - .collect( - Collectors.toMap( - toModelMap, - Function.identity())) - - modelsMap.containsKey("1_0") - Map models_3 = modelsMap.get("1_0").stream() - .collect( - Collectors.toMap( - toModelMap, - Function.identity())) - - and: - Model recursiveTypeWithNonEqualsConditionsMiddleWithModel = - models_1['RecursiveTypeWithNonEqualsConditionsMiddleWithModel'] - Model recursiveTypeWithNonEqualsConditionsInnerWithModel = - models_1['RecursiveTypeWithNonEqualsConditionsInnerWithModel'] - Model recursiveTypeWithNonEqualsConditionsOuterWithModel = - models_1['RecursiveTypeWithNonEqualsConditionsOuterWithModel'] - - Model recursiveTypeWithNonEqualsConditionsMiddleWithCircle = - models_2['RecursiveTypeWithNonEqualsConditionsMiddleWithCircle'] - Model recursiveTypeWithNonEqualsConditionsInnerWithCircle = - models_2['RecursiveTypeWithNonEqualsConditionsInnerWithCircle'] - Model recursiveTypeWithNonEqualsConditionsOuterWithCircle = - models_2['RecursiveTypeWithNonEqualsConditionsOuterWithCircle'] - Model recursiveTypeWithNonEqualsConditionsMiddleWithModel_1 = - models_2['RecursiveTypeWithNonEqualsConditionsMiddleWithModel_1'] - Model recursiveTypeWithNonEqualsConditionsInnerWithModel_1 = - models_2['RecursiveTypeWithNonEqualsConditionsInnerWithModel_1'] - Model recursiveTypeWithNonEqualsConditionsOuterWithModel_1 = - models_2['RecursiveTypeWithNonEqualsConditionsOuterWithModel_1'] - Model pet = models_2['Pet'] - - Model recursiveTypeWithNonEqualsConditionsMiddleWithCircle_1 = - models_3['RecursiveTypeWithNonEqualsConditionsMiddleWithCircle_1'] - Model recursiveTypeWithNonEqualsConditionsInnerWithCircle_1 = - models_3['RecursiveTypeWithNonEqualsConditionsInnerWithCircle_1'] - Model recursiveTypeWithNonEqualsConditionsOuterWithCircle_1 = - models_3['RecursiveTypeWithNonEqualsConditionsOuterWithCircle_1'] - Model recursiveTypeWithNonEqualsConditionsMiddleWithModel_2 = - models_3['RecursiveTypeWithNonEqualsConditionsMiddleWithModel'] - Model recursiveTypeWithNonEqualsConditionsInnerWithModel_2 = - models_3['RecursiveTypeWithNonEqualsConditionsInnerWithModel'] - Model recursiveTypeWithNonEqualsConditionsOuterWithModel_2 = - models_3['RecursiveTypeWithNonEqualsConditionsOuterWithModel'] - - and: - models_1.size() == 3 - models_2.size() == 7 - - models_3.size() == 6 - - and: - recursiveTypeWithNonEqualsConditionsMiddleWithModel != null - recursiveTypeWithNonEqualsConditionsInnerWithModel != null - recursiveTypeWithNonEqualsConditionsOuterWithModel != null - - recursiveTypeWithNonEqualsConditionsMiddleWithCircle != null - recursiveTypeWithNonEqualsConditionsInnerWithCircle != null - recursiveTypeWithNonEqualsConditionsOuterWithCircle != null - recursiveTypeWithNonEqualsConditionsMiddleWithModel_1 != null - recursiveTypeWithNonEqualsConditionsInnerWithModel_1 != null - recursiveTypeWithNonEqualsConditionsOuterWithModel_1 != null - pet != null - - recursiveTypeWithNonEqualsConditionsMiddleWithCircle_1 != null - recursiveTypeWithNonEqualsConditionsInnerWithCircle_1 != null - recursiveTypeWithNonEqualsConditionsOuterWithCircle_1 != null - recursiveTypeWithNonEqualsConditionsMiddleWithModel_2 != null - recursiveTypeWithNonEqualsConditionsInnerWithModel_2 != null - recursiveTypeWithNonEqualsConditionsOuterWithModel_2 != null - - and: - recursiveTypeWithNonEqualsConditionsMiddleWithModel - .equalsIgnoringName(recursiveTypeWithNonEqualsConditionsMiddleWithModel_2) - recursiveTypeWithNonEqualsConditionsInnerWithModel - .equalsIgnoringName(recursiveTypeWithNonEqualsConditionsInnerWithModel_2) - recursiveTypeWithNonEqualsConditionsOuterWithModel - .equalsIgnoringName(recursiveTypeWithNonEqualsConditionsOuterWithModel) - - and: - !recursiveTypeWithNonEqualsConditionsMiddleWithCircle - .equalsIgnoringName(recursiveTypeWithNonEqualsConditionsMiddleWithCircle_1) - - } - - def "Test to verify that recursive type with dependent registered model produce one model"() { - given: - HandlerMethod handlerMethodFirst = dummyHandlerMethod( - 'methodToTestBidirectionalRecursiveTypesWithModel', - springfox.documentation.spring.web.dummy.models.Pet) - RequestMappingContext contextFirst = requestMappingContext( - handlerMethodFirst, - '/somePath', - '0') - - HandlerMethod handlerMethodSecond = dummyHandlerMethod( - 'methodToTestBidirectionalRecursiveTypesWithModel', - Wrapper) - RequestMappingContext contextSecond = requestMappingContext( - handlerMethodSecond, - '/somePath', - '1') - - when: - def modelsMap = new HashMap<>(sut.read(contextFirst)) - modelsMap.putAll(sut.read(contextSecond.withKnownModels(modelsMap))) - - then: - - modelsMap.containsKey("0_0") - Map models_1 = modelsMap.get("0_0").stream() - .collect( - Collectors.toMap( - toModelMap, - Function.identity())) - - modelsMap.containsKey("0_1") - Map models_2 = modelsMap.get("0_1").stream() - .collect( - Collectors.toMap( - toModelMap, - Function.identity())) - - modelsMap.containsKey("1_1") - Map models_3 = modelsMap.get("1_1").stream() - .collect( - Collectors.toMap( - toModelMap, - Function.identity())) - - and: - Model wrapper = models_1['Wrapper«RecursiveTypeWithNonEqualsConditionsOuterWithModel»'] - Model recursiveTypeWithNonEqualsConditionsMiddleWithModel = - models_1['RecursiveTypeWithNonEqualsConditionsMiddleWithModel'] - Model recursiveTypeWithNonEqualsConditionsInnerWithModel = - models_1['RecursiveTypeWithNonEqualsConditionsInnerWithModel'] - Model recursiveTypeWithNonEqualsConditionsOuterWithModel = - models_1['RecursiveTypeWithNonEqualsConditionsOuterWithModel'] - Model pet = models_2['Pet'] - - Model wrapper_1 = models_3['Wrapper«RecursiveTypeWithNonEqualsConditionsOuterWithModel»_1'] - Model recursiveTypeWithNonEqualsConditionsMiddleWithModel_1 = - models_3['RecursiveTypeWithNonEqualsConditionsMiddleWithModel_1'] - Model recursiveTypeWithNonEqualsConditionsInnerWithModel_1 = - models_3['RecursiveTypeWithNonEqualsConditionsInnerWithModel_1'] - Model recursiveTypeWithNonEqualsConditionsOuterWithModel_1 = - models_3['RecursiveTypeWithNonEqualsConditionsOuterWithModel_1'] - Model pet_1 = models_3['Pet'] - - and: - models_1.size() == 4 - models_2.size() == 1 - - models_3.size() == 5 - - and: - wrapper != null - recursiveTypeWithNonEqualsConditionsMiddleWithModel != null - recursiveTypeWithNonEqualsConditionsInnerWithModel != null - recursiveTypeWithNonEqualsConditionsOuterWithModel != null - pet != null - - wrapper_1 != null - recursiveTypeWithNonEqualsConditionsMiddleWithModel_1 != null - recursiveTypeWithNonEqualsConditionsInnerWithModel_1 != null - recursiveTypeWithNonEqualsConditionsOuterWithModel_1 != null - pet_1 != null - - pet.equalsIgnoringName(pet_1) - - } - - def "Test to verify that recursive type same with known types"() { - given: - HandlerMethod handlerMethodFirst = dummyHandlerMethod( - 'methodToTestBidirectionalRecursiveTypesWithConditions', - RecursiveTypeWithConditions) - RequestMappingContext contextFirst = requestMappingContext( - handlerMethodFirst, - '/somePath', - '0') - - HandlerMethod handlerMethodSecond = dummyHandlerMethod( - 'methodToTestBidirectionalRecursiveTypesWithNonEqualsConditions', - RecursiveTypeWithNonEqualsConditionsOuter) - RequestMappingContext contextSecond = requestMappingContext( - handlerMethodSecond, - '/somePath', - '1') - - HandlerMethod handlerMethodThird = dummyHandlerMethod( - 'methodToTestBidirectionalRecursiveTypesWithKnownTypes', - RecursiveTypeWithConditions) - RequestMappingContext contextThird = requestMappingContext( - handlerMethodThird, - '/somePath', - "2") - - when: - def modelsMap = new HashMap<>(sut.read(contextFirst)) - modelsMap.putAll(sut.read(contextSecond.withKnownModels(modelsMap))) - modelsMap.putAll(sut.read(contextThird.withKnownModels(modelsMap))) - - then: - modelsMap.containsKey("0_1") - modelsMap.containsKey("0_0") - Map models_1 = modelsMap.get("0_0").stream() - .collect( - Collectors.toMap( - toModelMap, - Function.identity())) - Map models_2 = modelsMap.get("0_1").stream() - .collect( - Collectors.toMap( - toModelMap, - Function.identity())) - - modelsMap.containsKey("1_1") - modelsMap.containsKey("1_0") - Map models_3 = modelsMap.get("1_0").stream() - .collect( - Collectors.toMap( - toModelMap, - Function.identity())) - Map models_4 = modelsMap.get("1_1").stream() - .collect( - Collectors.toMap( - toModelMap, - Function.identity())) - - modelsMap.containsKey("2_1") - modelsMap.containsKey("2_0") - Map models_5 = modelsMap.get("2_0").stream() - .collect( - Collectors.toMap( - toModelMap, - Function.identity())) - Map models_6 = modelsMap.get("2_1").stream() - .collect( - Collectors.toMap( - toModelMap, - Function.identity())) - - and: - Model recursiveTypeWithConditions_1 = models_1[RecursiveTypeWithConditions.simpleName] - Model monkey_1 = models_1[Monkey.simpleName] - Model pirate_1 = models_1[Pirate.simpleName] - Model recursiveTypeWithConditions_2 = models_2[RecursiveTypeWithConditions.simpleName + '_1'] - Model monkey_2 = models_2[Monkey.simpleName] - Model pirate_2 = models_2[Pirate.simpleName] - - Model recursiveTypeWithConditionsOuter_1 = models_3['RecursiveTypeWithNonEqualsConditionsOuter'] - Model recursiveTypeWithConditionsMiddle_1 = models_3['RecursiveTypeWithNonEqualsConditionsMiddle'] - Model recursiveTypeWithConditionsInner_1 = models_3['RecursiveTypeWithNonEqualsConditionsInner'] - Model recursiveTypeWithConditionsOuter_2 = models_4['RecursiveTypeWithNonEqualsConditionsOuter_1'] - Model recursiveTypeWithConditionsMiddle_2 = models_4['RecursiveTypeWithNonEqualsConditionsMiddle_1'] - Model recursiveTypeWithConditionsInner_2 = models_4['RecursiveTypeWithNonEqualsConditionsInner_1'] - - Model recursiveTypeWithConditionsOuter_3 = models_5['RecursiveTypeWithNonEqualsConditionsOuter'] - Model recursiveTypeWithConditionsMiddle_3 = models_5['RecursiveTypeWithNonEqualsConditionsMiddle'] - Model recursiveTypeWithConditionsInner_3 = models_5['RecursiveTypeWithNonEqualsConditionsInner'] - Model recursiveTypeWithNonEqualsConditionsOuterWithSubTypes = - models_5["RecursiveTypeWithNonEqualsConditionsOuterWithSubTypes"] - Model recursiveTypeWithConditions_3 = models_5[RecursiveTypeWithConditions.simpleName] - Model monkey_3 = models_5[Monkey.simpleName] - Model pirate_3 = models_5[Pirate.simpleName] - - Model recursiveTypeWithConditions_4 = models_6[RecursiveTypeWithConditions.simpleName + '_1'] - Model monkey_4 = models_6[Monkey.simpleName] - Model pirate_4 = models_6[Pirate.simpleName] - and: - models_1.size() == 3 - models_2.size() == 3 - - models_3.size() == 3 - models_4.size() == 3 - - models_5.size() == 7 - models_6.size() == 3 - and: - recursiveTypeWithConditions_1 != null - pirate_1 != null - monkey_1 != null - recursiveTypeWithConditions_2 != null - pirate_2 != null - monkey_2 != null - - recursiveTypeWithConditionsOuter_1 != null - recursiveTypeWithConditionsMiddle_1 != null - recursiveTypeWithConditionsInner_1 != null - recursiveTypeWithConditionsOuter_2 != null - recursiveTypeWithConditionsMiddle_2 != null - recursiveTypeWithConditionsInner_2 != null - - recursiveTypeWithConditionsOuter_3 != null - recursiveTypeWithConditionsMiddle_3 != null - recursiveTypeWithConditionsInner_3 != null - recursiveTypeWithNonEqualsConditionsOuterWithSubTypes != null - recursiveTypeWithConditions_3 != null - pirate_3 != null - monkey_3 != null - - recursiveTypeWithConditions_4 != null - pirate_4 != null - monkey_4 != null - - and: - recursiveTypeWithConditionsOuter_3.equalsIgnoringName(recursiveTypeWithConditionsOuter_1) - recursiveTypeWithConditionsMiddle_3.equalsIgnoringName(recursiveTypeWithConditionsMiddle_1) - recursiveTypeWithConditionsInner_3.equalsIgnoringName(recursiveTypeWithConditionsInner_1) - recursiveTypeWithNonEqualsConditionsOuterWithSubTypes.getProperties().size() == 1 - recursiveTypeWithNonEqualsConditionsOuterWithSubTypes.getSubTypes().size() == 1 - ModelReference modelRef = recursiveTypeWithNonEqualsConditionsOuterWithSubTypes.getSubTypes().get(0) - modelRef.getModelId().get() == "springfox.documentation.spring.web.dummy.models.RecursiveTypeWithConditions" - modelRef.getType() == 'RecursiveTypeWithConditions' - recursiveTypeWithConditions_3.equalsIgnoringName(recursiveTypeWithConditions_1) - - recursiveTypeWithConditions_4.equalsIgnoringName(recursiveTypeWithConditions_2) - pirate_3.equalsIgnoringName(pirate_1) && pirate_3.equalsIgnoringName(pirate_2) - pirate_4.equalsIgnoringName(pirate_1) && pirate_4.equalsIgnoringName(pirate_2) - monkey_3.equalsIgnoringName(monkey_1) && monkey_3.equalsIgnoringName(monkey_2) - monkey_4.equalsIgnoringName(monkey_1) && monkey_4.equalsIgnoringName(monkey_2) - - } - - def "Test to verify that duplicate class names in different packages will be produced as different models (#182)"() { - given: - HandlerMethod handlerMethod = dummyHandlerMethod( - 'methodToTestIssue182', - Pet) - RequestMappingContext context = requestMappingContext( - handlerMethod, - '/somePath') - - when: - def modelsMap = sut.read(context) - - then: - modelsMap.containsKey("0_0") - modelsMap.containsKey("0_1") - Map models_1 = modelsMap.get("0_0").stream() - .collect( - Collectors.toMap( - toModelMap, - Function.identity())) - Map models_2 = modelsMap.get("0_1").stream() - .collect( - Collectors.toMap( - toModelMap, - Function.identity())) - - Model pet_1 = models_1["Pet"] - Model pet_2 = models_2["Pet_1"] - - models_1.size() == 1 - models_2.size() == 1 - and: - pet_1 != null - pet_1.qualifiedType == "springfox.documentation.spring.web.dummy.models.Pet" - - pet_2 != null - pet_2.qualifiedType == "springfox.documentation.spring.web.dummy.models.same.Pet" - and: - pet_1.getProperties().size() == 3 - pet_1.getProperties().containsKey('id') - pet_1.getProperties().containsKey('name') - pet_1.getProperties().containsKey('age') - and: - pet_2.getProperties().size() == 3 - pet_2.getProperties().containsKey('id') - pet_2.getProperties().containsKey('name') - pet_2.getProperties().containsKey('age') - - } - - def "Test to verify that same class for serialization and deserialization will be produced as one model"() { - given: - HandlerMethod handlerMethod = dummyHandlerMethod( - 'methodToTestSerializationAndDeserialization', - Map) - RequestMappingContext context = requestMappingContext( - handlerMethod, - '/somePath') - - when: - def modelsMap = sut.read(context) - - then: - modelsMap.containsKey("0_0") - modelsMap.containsKey("0_1") - Map models_1 = modelsMap.get("0_0").stream() - .collect( - Collectors.toMap( - toModelMap, - Function.identity())) - Map models_2 = modelsMap.get("0_1").stream() - .collect( - Collectors.toMap( - toModelMap, - Function.identity())) - - Model fancyPet_1 = models_1["FancyPet"] - Model category_1 = models_1["Category"] - - Model fancyPet_2 = models_2["FancyPet"] - Model category_2 = models_2["Category"] - - models_1.size() == 2 - models_2.size() == 2 - and: - fancyPet_1 != null - fancyPet_1.qualifiedType == "springfox.documentation.spring.web.dummy.models.FancyPet" - - category_1 != null - category_1.qualifiedType == "springfox.documentation.spring.web.dummy.models.Category" - and: - fancyPet_1.getProperties().size() == 4 - fancyPet_1.getProperties().containsKey('id') - fancyPet_1.getProperties().containsKey('name') - fancyPet_1.getProperties().containsKey('age') - fancyPet_1.getProperties().containsKey('categories') - and: - ModelReference modelRef_1 = fancyPet_1.getProperties().get('categories').getModelRef() - modelRef_1.isCollection() - modelRef_1.itemModel().get() - .getModelId().get() == "springfox.documentation.spring.web.dummy.models.Category" - and: - category_1.getProperties().size() == 1 - category_1.getProperties().containsKey('name') - - and: - fancyPet_2 != null - fancyPet_1.qualifiedType == "springfox.documentation.spring.web.dummy.models.FancyPet" - - category_2 != null - category_1.qualifiedType == "springfox.documentation.spring.web.dummy.models.Category" - and: - fancyPet_2.getProperties().size() == 4 - fancyPet_2.getProperties().containsKey('id') - fancyPet_2.getProperties().containsKey('name') - fancyPet_2.getProperties().containsKey('age') - fancyPet_2.getProperties().containsKey('categories') - and: - ModelReference modelRef_2 = fancyPet_2.getProperties().get('categories').getModelRef() - modelRef_2.isCollection() - modelRef_2.itemModel().get() - .getModelId().get() == "springfox.documentation.spring.web.dummy.models.Category" - and: - category_2.getProperties().size() == 1 - category_2.getProperties().containsKey('name') - - } - - def "Test to verify that different class for serialization and deserialization will be produced as two models"() { - given: - HandlerMethod handlerMethod = dummyHandlerMethod( - 'methodToTestSameClassesWithDifferentProperties', - SameFancyPet) - RequestMappingContext context = requestMappingContext( - handlerMethod, - '/somePath') - - when: - def modelsMap = sut.read(context) - - then: - modelsMap.containsKey("0_0") - modelsMap.containsKey("0_1") - Map models_1 = modelsMap.get("0_0").stream() - .collect( - Collectors.toMap( - toModelMap, - Function.identity())) - Map models_2 = modelsMap.get("0_1").stream() - .collect( - Collectors.toMap( - toModelMap, - Function.identity())) - - Model category_1 = models_1["SameCategory"] - Model category_2 = models_2["SameCategory_1"] - - Model mapFancyPet = models_1["MapFancyPet"] - - Model fancyPet_1 = models_1["SameFancyPet"] - Model fancyPet_2 = models_2["SameFancyPet_1"] - - models_1.size() == 3 - models_2.size() == 2 - and: - category_1 != null - category_2 != null - - fancyPet_1 != null - fancyPet_2 != null - - mapFancyPet != null - - and: - category_1.getProperties().size() == 2 - category_1.getProperties().containsKey('name') - category_1.getProperties().containsKey('_type') - and: - category_2.getProperties().size() == 2 - category_2.getProperties().containsKey('id') - category_2.getProperties().containsKey('name') - and: - fancyPet_1.getProperties().size() == 5 - fancyPet_1.getProperties().containsKey('id') - fancyPet_1.getProperties().containsKey('age') - fancyPet_1.getProperties().containsKey('name') - fancyPet_1.getProperties().containsKey('color') - fancyPet_1.getProperties().containsKey('extendedCategory') - and: - fancyPet_2.getProperties().size() == 6 - fancyPet_2.getProperties().containsKey('id') - fancyPet_2.getProperties().containsKey('age') - fancyPet_2.getProperties().containsKey('name') - fancyPet_2.getProperties().containsKey('color') - fancyPet_2.getProperties().containsKey('pet_weight') - fancyPet_2.getProperties().containsKey('extendedCategory') - - } - - def "Test to verify that @JsonView works correctly with DEFAULT_VIEW_INCLUSION (issues #563, #807, #895"() { - given: - HandlerMethod handlerMethod = dummyHandlerMethod( - 'methodToTestJsonView', - PetWithJsonView) - RequestMappingContext context = requestMappingContext( - handlerMethod, - '/somePath') - - when: - def modelsMap = sut.read(context) - - then: - modelsMap.containsKey("0_0") - modelsMap.containsKey("0_1") - Map models_1 = modelsMap.get("0_0").stream() - .collect( - Collectors.toMap( - toModelMap, - Function.identity())) - Map models_2 = modelsMap.get("0_1").stream() - .collect( - Collectors.toMap( - toModelMap, - Function.identity())) - - Model pet_1 = models_1["PetWithJsonView"] - Model pet_2 = models_2["PetWithJsonView_1"] - - models_1.size() == 1 - models_2.size() == 1 - and: - pet_1 != null - pet_2 != null - and: - pet_1.getProperties().size() == 2 - pet_1.getProperties().containsKey('age') - pet_1.getProperties().containsKey('color') - and: - pet_2.getProperties().size() == 3 - pet_2.getProperties().containsKey('id') - pet_2.getProperties().containsKey('name') - pet_2.getProperties().containsKey('age') - - } - - def "Test to verify that @JsonView works correctly without DEFAULT_VIEW_INCLUSION (issues #563, #807, #895"() { - given: - HandlerMethod handlerMethod = dummyHandlerMethod( - 'methodToTestJsonView', - PetWithJsonView) - RequestMappingContext context = requestMappingContext( - handlerMethod, - '/somePath') - - when: - def modelsMap = sutSpecial.read(context) - - then: - modelsMap.containsKey("0_0") - modelsMap.containsKey("0_1") - Map models_1 = modelsMap.get("0_0").stream() - .collect( - Collectors.toMap( - toModelMap, - Function.identity())) - Map models_2 = modelsMap.get("0_1").stream() - .collect( - Collectors.toMap( - toModelMap, - Function.identity())) - - Model pet_1 = models_1["PetWithJsonView"] - Model pet_2 = models_2["PetWithJsonView_1"] - - models_1.size() == 1 - models_2.size() == 1 - and: - pet_1 != null - pet_2 != null - and: - pet_1.getProperties().size() == 1 - pet_1.getProperties().containsKey('color') - - and: - pet_2.getProperties().size() == 2 - pet_2.getProperties().containsKey('id') - pet_2.getProperties().containsKey('name') - - } -} diff --git a/springfox-spring-webmvc/src/test/groovy/springfox/documentation/spring/web/readers/ApiOperationReaderSpec.groovy b/springfox-spring-webmvc/src/test/groovy/springfox/documentation/spring/web/readers/ApiOperationReaderSpec.groovy deleted file mode 100644 index 4987dcecd45..00000000000 --- a/springfox-spring-webmvc/src/test/groovy/springfox/documentation/spring/web/readers/ApiOperationReaderSpec.groovy +++ /dev/null @@ -1,95 +0,0 @@ -/* - * - * Copyright 2015-2019 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.spring.web.readers - -import com.fasterxml.classmate.TypeResolver -import org.springframework.http.HttpMethod -import org.springframework.web.method.HandlerMethod -import org.springframework.web.servlet.mvc.method.RequestMappingInfo -import springfox.documentation.builders.PathSelectors -import springfox.documentation.service.Operation -import springfox.documentation.spi.service.contexts.RequestMappingContext -import springfox.documentation.spi.service.contexts.SecurityContext -import springfox.documentation.spring.web.WebMvcRequestHandler -import springfox.documentation.spring.web.mixins.AuthSupport -import springfox.documentation.spring.web.mixins.RequestMappingSupport -import springfox.documentation.spring.web.paths.Paths -import springfox.documentation.spring.web.plugins.DocumentationContextSpec -import springfox.documentation.spring.web.readers.operation.ApiOperationReader -import springfox.documentation.spring.web.readers.operation.CachingOperationNameGenerator -import springfox.documentation.spring.web.readers.operation.DefaultOperationReader -import springfox.documentation.spring.web.readers.operation.HandlerMethodResolver - -import static java.util.Collections.* -import static org.springframework.web.bind.annotation.RequestMethod.* - -class ApiOperationReaderSpec - extends DocumentationContextSpec - implements AuthSupport, - RequestMappingSupport { - - ApiOperationReader sut - def methodResolver = new HandlerMethodResolver(new TypeResolver()) - - def setup() { - SecurityContext securityContext = SecurityContext.builder() - .securityReferences(defaultAuth()) - .forPaths(PathSelectors.regex(".*")) - .build() - plugin.securityContexts(singletonList(securityContext)) - sut = new ApiOperationReader(customWebPlugins([], [new DefaultOperationReader()]), new CachingOperationNameGenerator()) - } - - def "Should generate default operation on handler method without swagger annotations"() { - - given: - RequestMappingInfo requestMappingInfo = requestMappingInfo("/doesNotMatterForThisTest", - [ - patternsRequestCondition : patternsRequestCondition('/doesNotMatterForThisTest', '/somePath/{businessId:\\d+}'), - requestMethodsRequestCondition: requestMethodsRequestCondition(PATCH, POST) - ] - ) - - HandlerMethod handlerMethod = dummyHandlerMethod() - - RequestMappingContext context = new RequestMappingContext("0", - documentationContext(), - new WebMvcRequestHandler( - Paths.ROOT, - methodResolver, - requestMappingInfo, - handlerMethod)) - - when: - def operations = sut.read(context) - - then: - Operation apiOperation = operations[0] - apiOperation.getMethod() == HttpMethod.PATCH - apiOperation.getSummary() == handlerMethod.method.name - apiOperation.getNotes() == null - apiOperation.getUniqueId() == handlerMethod.method.name + "Using" + PATCH.toString() - apiOperation.getPosition() == 0 - apiOperation.getSecurityReferences().size() == 0 - - def secondApiOperation = operations[1] - secondApiOperation.position == 1 - } -} diff --git a/springfox-spring-webmvc/src/test/groovy/springfox/documentation/spring/web/readers/MixedMultipartRequestParameterBuilderSpec.groovy b/springfox-spring-webmvc/src/test/groovy/springfox/documentation/spring/web/readers/MixedMultipartRequestParameterBuilderSpec.groovy deleted file mode 100644 index f8818760a13..00000000000 --- a/springfox-spring-webmvc/src/test/groovy/springfox/documentation/spring/web/readers/MixedMultipartRequestParameterBuilderSpec.groovy +++ /dev/null @@ -1,346 +0,0 @@ -package springfox.documentation.spring.web.readers - -import org.springframework.http.MediaType -import spock.lang.Specification -import springfox.documentation.builders.CompoundModelSpecificationBuilder -import springfox.documentation.builders.ModelSpecificationBuilder -import springfox.documentation.builders.RequestParameterBuilder -import springfox.documentation.schema.QualifiedModelName -import springfox.documentation.schema.ScalarType -import springfox.documentation.schema.Xml -import springfox.documentation.service.Header -import springfox.documentation.service.ParameterType -import springfox.documentation.service.RequestParameter -import springfox.documentation.spring.web.readers.operation.ContentParameterAggregator - -import java.util.function.Consumer - -class MixedMultipartRequestParameterBuilderSpec extends Specification { - - /** - * requestBody: - * content: - * multipart/mixed: - * schema: - * type: object - * properties: - * id: - * # default is text/plain - * type: string - * format: uuid - * address: - * # default is application/json - * type: object - * properties: - * historyMetadata: - * description: metadata in XML format - * type: object - * properties: - * profileImage: - * # default is application/octet-stream, need to declare an image type only! - * type: string - * format: binary - * encoding: - * id: - * contentType: text/plain - * address - * contentType: application/json - * historyMetadata: - * # require XML Content-Type in utf-8 encoding - * contentType: application/xml; charset=utf-8 - * profileImage: - * # only accept png/jpeg - * contentType: image/png, image/jpeg - * headers: - * X-Rate-Limit-Limit: - * description: The number of allowed requests in the current period - * schema: - * type: integer - */ - def "RequestParameterBuilder is able to handle multipart mixed message"() { - given: - def parameters = [ - idParameter(), - addressParameter(), - historyMetadataParameter(), - profileImageParameter()] - - when: - def aggregated = new ContentParameterAggregator().aggregate(parameters) - - then: - aggregated.size() == 1 - - and: - aggregated.first().parameterSpecification.content.isPresent() - def content = aggregated.first().parameterSpecification.content.get() - content.representations.size() == 1 - - and: - content.representations.first().model.compound.isPresent() - def model = content.representations.first().model.compound.get() - model.properties.size() == 4 - - and: - aggregated.first() == expectedModel() - - } - - RequestParameter idParameter() { - new RequestParameterBuilder() - .accepts([MediaType.MULTIPART_FORM_DATA]) - .in(ParameterType.FORMDATA) - .name("id") - .query { q - -> - q.model { - it.scalarModel(ScalarType.UUID) - } - } - .build() - } - - RequestParameter addressParameter() { - new RequestParameterBuilder() - .accepts([MediaType.MULTIPART_FORM_DATA]) - .in(ParameterType.FORMDATA) - .name("address") - .content { c - -> - c.representation(MediaType.MULTIPART_FORM_DATA) - .apply({ - r - -> - r.model { m - -> - m.referenceModel { - ref -> - ref.key { - key -> - key.qualifiedModelName { - q -> - q.name("Address") - .namespace("io.springfox") - } - .isResponse(false) - } - } - } - .encoding("address") - .apply({ enc -> - enc.contentType("application/json") - } as Consumer) - } as Consumer) - } - .build() - } - - RequestParameter historyMetadataParameter() { - new RequestParameterBuilder() - .accepts([MediaType.MULTIPART_FORM_DATA]) - .in(ParameterType.FORMDATA) - .name("historyMetadata") - .content { c - -> - c.representation(MediaType.MULTIPART_FORM_DATA) - .apply( - { r - -> - r.model { m - -> - m.compoundModel { cm - -> - historyMetadataBuilder(cm) - } - } - .encoding("historyMetadata") - .apply({ - it.contentType("application/xml") - } as Consumer) - } as Consumer) - } - .build() - } - - CompoundModelSpecificationBuilder historyMetadataBuilder(CompoundModelSpecificationBuilder cm, hidden = null) { - cm - .modelKey { - mk -> - mk.qualifiedModelName { - qn -> - qn.name("HistoryMetadata") - .namespace("some:namespace") - } - } - .property("id") - .apply( - { p - -> - p.isHidden(hidden) - .type( - new ModelSpecificationBuilder() - .name("String") - .scalarModel(ScalarType.STRING) - .build()) - .xml(new Xml().name("id").namespace("urn:io:springfox").prefix("sf")) - } as Consumer) - .property("version") - .apply( - { p - -> - p.isHidden(hidden) - .type( - new ModelSpecificationBuilder() - .name("String") - .scalarModel(ScalarType.BIGDECIMAL) - .build()) - .xml(new Xml().name("version").namespace("urn:io:springfox").prefix("sf")) - } as Consumer) - .maxProperties(2) - .minProperties(2) - } - - private RequestParameter profileImageParameter() { - new RequestParameterBuilder() - .accepts([MediaType.MULTIPART_FORM_DATA]) - .in(ParameterType.FORMDATA) - .name("profileImage") - .content { c - -> - c.representation(MediaType.MULTIPART_FORM_DATA) - .apply( - { r - -> - r.model { - m - -> - m.scalarModel(ScalarType.BINARY) - } - .encoding("profileImage") - .apply({ - it.contentType("image/png, image/jpeg") - .headers( - [new Header( - " X-Rate-Limit-Limit", - "The number of allowed requests in the current period", - null, - new ModelSpecificationBuilder() - .name("Integer") - .scalarModel(ScalarType.INTEGER) - .build() - )]) - } as Consumer) - } as Consumer) - } - .build() - } - - def expectedModel() { - new RequestParameterBuilder() - .accepts([MediaType.MULTIPART_FORM_DATA]) - .in(ParameterType.FORMDATA) - .name("body") - .content { - c - -> - c.representation(MediaType.MULTIPART_FORM_DATA) - .apply({ - r - -> - r.model { - - m - -> - m.compoundModel { cm - -> - cm.modelKey { mk -> - mk.qualifiedModelName(new QualifiedModelName( - "io.springfox", - "profileImageAggregate")) - } - .property("id") - .apply({ - p - -> - p.type( - new ModelSpecificationBuilder() - .scalarModel(ScalarType.UUID) - .build()) - .required(false) - } as Consumer) - .property("address") - .apply({ - p - -> - p.required(false) - .type( - new ModelSpecificationBuilder() - .referenceModel { - ref -> - ref.key { - key -> - key.qualifiedModelName { - q -> - q.name("Address") - .namespace("io.springfox") - } - .isResponse(false) - } - } - .build()) - } as Consumer) - .property("historyMetadata") - .apply({ - cmp -> - cmp.required(false) - .type(new ModelSpecificationBuilder() - .compoundModel { - cmpc - -> - historyMetadataBuilder(cmpc, false) - } - .build()) - } as Consumer) - .property("profileImage") - .apply({ - p -> - p.type( - new ModelSpecificationBuilder() - .scalarModel(ScalarType.BINARY) - .build()) - .required(false) - } as Consumer) - } - } - .encoding("profileImage") - .apply({ - it.contentType("image/png, image/jpeg") - .headers( - [new Header( - " X-Rate-Limit-Limit", - "The number of allowed requests in the current period", - null, - new ModelSpecificationBuilder() - .name("Integer") - .scalarModel(ScalarType.INTEGER) - .build() - )]) - } as Consumer) - .encoding("id") - .apply({ - it.contentType("text/plain") - } as Consumer) - .encoding("historyMetadata") - .apply({ - it.contentType("application/xml") - } as Consumer) - .encoding("address") - .apply({ - it.contentType("application/json") - } as Consumer) - - } as Consumer) - } - .build() - } -} diff --git a/springfox-spring-webmvc/src/test/groovy/springfox/documentation/spring/web/readers/RepresentationReaderSpec.groovy b/springfox-spring-webmvc/src/test/groovy/springfox/documentation/spring/web/readers/RepresentationReaderSpec.groovy deleted file mode 100644 index 0417af66bc4..00000000000 --- a/springfox-spring-webmvc/src/test/groovy/springfox/documentation/spring/web/readers/RepresentationReaderSpec.groovy +++ /dev/null @@ -1,142 +0,0 @@ -/* - * - * Copyright 2015-2019 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.spring.web.readers - -import org.springframework.http.HttpMethod -import org.springframework.web.bind.annotation.RequestMethod -import org.springframework.web.multipart.MultipartFile -import org.springframework.web.servlet.mvc.method.RequestMappingInfo -import spock.lang.Unroll -import springfox.documentation.spi.service.contexts.OperationContext -import springfox.documentation.spring.web.mixins.RequestMappingSupport -import springfox.documentation.spring.web.plugins.DocumentationContextSpec -import springfox.documentation.spring.web.scanners.MediaTypeReader - -import java.util.stream.Stream - -import static java.util.stream.Collectors.* - -class RepresentationReaderSpec extends DocumentationContextSpec implements RequestMappingSupport { - MediaTypeReader sut - - def setup() { - sut = new MediaTypeReader() - } - - @Unroll - def "should read media types"() { - - given: - RequestMappingInfo requestMappingInfo = - requestMappingInfo('/somePath', - [ - 'consumesRequestCondition': consumesRequestCondition(consumes), - 'producesRequestCondition': producesRequestCondition(produces) - ] - ) - OperationContext operationContext = - operationContext(documentationContext(), handlerMethod, 0, requestMappingInfo, httpMethod) - operationContext.operationBuilder().method(HttpMethod.valueOf(httpMethod.toString())) - - when: - sut.apply(operationContext) - def operation = operationContext.operationBuilder().build() - - then: - operation.consumes == Stream.of(consumes).collect(toSet()) - operation.produces == Stream.of(produces).collect(toSet()) - - where: - consumes | produces | httpMethod | handlerMethod - [] as String[] | ['application/json'] as String[] | RequestMethod.GET | dummyHandlerMethod() - [] as String[] | ['application/json'] as String[] | RequestMethod.DELETE | dummyHandlerMethod() - ['application/json'] as String[] | ['application/xml'] as String[] | RequestMethod.POST | dummyHandlerMethod() - ['application/json'] as String[] | ['application/xml'] as String[] | RequestMethod.PUT | dummyHandlerMethod() - ['application/json'] as String[] | ['application/xml'] as String[] | RequestMethod.PATCH | dummyHandlerMethod() - ['application/json'] as String[] | ['application/xml'] as String[] | RequestMethod.OPTIONS | dummyHandlerMethod() - ['application/json'] as String[] | ['application/xml'] as String[] | RequestMethod.HEAD | dummyHandlerMethod() - ['multipart/form-data'] as String[] | ['application/json'] as String[] | RequestMethod.GET | dummyHandlerMethod('methodWithMediaTypeAndFile', MultipartFile) - ['application/json', 'application/xml'] as String[] | ['application/xml'] as String[] | RequestMethod.POST | dummyHandlerMethod() - } - - @Unroll - def "should only set default 'application/json' consumes if no consumes is set and operation is not GET/DELETE"() { - given: - contextBuilder.consumes(Stream.of(documentConsumes).collect(toSet())) - RequestMappingInfo requestMappingInfo = - requestMappingInfo('/somePath', - [ - 'consumesRequestCondition': consumesRequestCondition(operationConsumes) - ] - ) - OperationContext operationContext = - operationContext( - documentationContext(), - dummyHandlerMethod(), - 0, - requestMappingInfo, - RequestMethod.valueOf(httpMethod.toString())) - operationContext.operationBuilder().method(httpMethod) - - when: - sut.apply(operationContext) - def operation = operationContext.operationBuilder().build() - - then: - operation.consumes == Stream.of(expectedOperationConsumes).collect(toSet()) - - where: - documentConsumes | operationConsumes | httpMethod | expectedOperationConsumes - [] as String[] | [] as String[] | HttpMethod.POST | ['application/json'] as String[] - ['application/xml'] as String[] | [] as String[] | HttpMethod.POST | [] as String[] - [] as String[] | ['application/xml'] as String[] | HttpMethod.POST | ['application/xml'] as String[] - [] as String[] | [] as String[] | HttpMethod.GET | [] as String[] - ['application/xml'] as String[] | [] as String[] | HttpMethod.GET | [] as String[] - [] as String[] | ['application/xml'] as String[] | HttpMethod.GET | [] as String[] - } - - @Unroll - def "should only set default '*/*' produces if no produces is set for the operation and document context"() { - given: - contextBuilder.produces(Stream.of(documentProduces).collect(toSet())) - RequestMappingInfo requestMappingInfo = - requestMappingInfo('/somePath', - [ - 'producesRequestCondition': producesRequestCondition(operationProduces) - ] - ) - OperationContext operationContext = - operationContext(documentationContext(), dummyHandlerMethod(), 0, requestMappingInfo) - - when: - sut.apply(operationContext) - def operation = operationContext.operationBuilder().build() - - then: - operation.produces == Stream.of(expectedOperationProduces).collect(toSet()) - - where: - documentProduces | operationProduces | expectedOperationProduces - [] as String[] | [] as String[] | ['*/*'] as String[] - ['application/xml'] as String[] | [] as String[] | [] as String[] - [] as String[] | ['application/xml'] as String[] | ['application/xml'] as String[] - } - -} diff --git a/springfox-spring-webmvc/src/test/groovy/springfox/documentation/spring/web/readers/operation/DefaultResponseMessageReaderSpec.groovy b/springfox-spring-webmvc/src/test/groovy/springfox/documentation/spring/web/readers/operation/DefaultResponseMessageReaderSpec.groovy deleted file mode 100644 index 4ecf2305453..00000000000 --- a/springfox-spring-webmvc/src/test/groovy/springfox/documentation/spring/web/readers/operation/DefaultResponseMessageReaderSpec.groovy +++ /dev/null @@ -1,173 +0,0 @@ -/* - * - * Copyright 2015-2017 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.spring.web.readers.operation - -import com.fasterxml.classmate.TypeResolver -import org.springframework.http.HttpStatus -import org.springframework.plugin.core.OrderAwarePluginRegistry -import org.springframework.plugin.core.PluginRegistry -import org.springframework.web.bind.annotation.RequestMethod -import springfox.documentation.schema.DefaultTypeNameProvider -import springfox.documentation.schema.JacksonEnumTypeDeterminer -import springfox.documentation.schema.Model -import springfox.documentation.schema.TypeNameExtractor -import springfox.documentation.schema.property.ModelSpecificationFactory -import springfox.documentation.service.ResponseMessage -import springfox.documentation.spi.DocumentationType -import springfox.documentation.spi.schema.TypeNameProviderPlugin -import springfox.documentation.spi.service.contexts.OperationContext -import springfox.documentation.spring.web.mixins.RequestMappingSupport -import springfox.documentation.spring.web.plugins.DocumentationContextSpec - -class DefaultResponseMessageReaderSpec extends DocumentationContextSpec implements RequestMappingSupport { - ResponseMessagesReader sut - - def setup() { - PluginRegistry modelNameRegistry = - OrderAwarePluginRegistry.of([new DefaultTypeNameProvider()]) - def enumTypeDeterminer = new JacksonEnumTypeDeterminer() - def typeNameExtractor = new TypeNameExtractor( - new TypeResolver(), - modelNameRegistry, - enumTypeDeterminer) - sut = new ResponseMessagesReader( - enumTypeDeterminer, - typeNameExtractor, - defaultSchemaPlugins(), - new ModelSpecificationFactory(typeNameExtractor, enumTypeDeterminer), - defaultWebPlugins()) - } - - def "Should add default response messages"() { - given: - OperationContext operationContext = - operationContext(documentationContext(), - handlerMethod, - 0, - requestMappingInfo("/somePath"), - currentHttpMethod) - when: - sut.apply(operationContext) - and: - def operation = operationContext.operationBuilder().build() - def responseMessages = operation.responseMessages - - then: - def allResponses = responseMessages.collect { it.code } - assert ecpectedCodes.size() == allResponses.intersect(ecpectedCodes).size() - and: - sut.supports(DocumentationType.SPRING_WEB) - sut.supports(DocumentationType.SWAGGER_12) - where: - currentHttpMethod | handlerMethod | ecpectedCodes - RequestMethod.GET | dummyHandlerMethod() | [200, 404, 403, 401] - } - - def "swagger annotation should override when using default reader"() { - given: - OperationContext operationContext = - operationContext( - documentationContext(), - dummyHandlerMethod('methodWithApiResponses')) - - when: - sut.apply(operationContext) - and: - def operation = operationContext.operationBuilder().build() - def responseMessages = operation.responseMessages - - then: - responseMessages.size() == 4 - def annotatedResponse = responseMessages.find { it.code == 413 } - annotatedResponse == null - } - - - def "Methods with return type containing a model should override the success response code"() { - given: - def knownModels = new HashMap>() - knownModels.put("0_0", new HashSet()) - OperationContext operationContext = - operationContext(documentationContext(), - dummyHandlerMethod('methodWithConcreteResponseBody'), - 0, - requestMappingInfo("/somePath"), - RequestMethod.GET, - knownModels) - - when: - sut.apply(operationContext) - def operation = operationContext.operationBuilder().build() - def responseMessages = operation.responseMessages - then: - ResponseMessage responseMessage = responseMessages.find { it.code == 200 } - responseMessage.getCode() == 200 - responseMessage.getResponseModel().type == 'BusinessModel' - responseMessage.getMessage() == "OK" - } - - def "Methods with return type containing a container model should override the success response code"() { - given: - OperationContext operationContext = - operationContext(documentationContext(), dummyHandlerMethod('methodWithListOfBusinesses')) - - when: - sut.apply(operationContext) - def operation = operationContext.operationBuilder().build() - def responseMessages = operation.responseMessages - then: - ResponseMessage responseMessage = responseMessages.find { it.code == 200 } - responseMessage.getCode() == 200 - responseMessage.getResponseModel().type == 'List' - responseMessage.getResponseModel().itemType == 'BusinessModel' - responseMessage.getMessage() == "OK" - } - - def "Methods with return type containing ResponseStatus annotation"() { - given: - OperationContext operationContext = - operationContext(documentationContext(), dummyHandlerMethod('methodWithResponseStatusAnnotation')) - - when: - sut.apply(operationContext) - def operation = operationContext.operationBuilder().build() - def responseMessages = operation.responseMessages - then: - ResponseMessage responseMessage = responseMessages.find { it.code == 202 } - responseMessage.getCode() == HttpStatus.ACCEPTED.value() - responseMessage.getResponseModel().type == 'BusinessModel' - responseMessage.getMessage() == "Accepted request" - } - - def "Methods with return type containing ResponseStatus annotation and empty reason message"() { - given: - OperationContext operationContext = - operationContext(documentationContext(), dummyHandlerMethod('methodWithResponseStatusAnnotationAndEmptyReason')) - - when: - sut.apply(operationContext) - def operation = operationContext.operationBuilder().build() - def responseMessages = operation.responseMessages - then: - ResponseMessage responseMessage = responseMessages.find { it.code == 204 } - responseMessage.getCode() == HttpStatus.NO_CONTENT.value() - responseMessage.getMessage() == HttpStatus.NO_CONTENT.reasonPhrase - } -} diff --git a/springfox-spring-webmvc/src/test/groovy/springfox/documentation/spring/web/readers/operation/OperationCommandReaderSpec.groovy b/springfox-spring-webmvc/src/test/groovy/springfox/documentation/spring/web/readers/operation/OperationCommandReaderSpec.groovy deleted file mode 100644 index 545cb14e3d5..00000000000 --- a/springfox-spring-webmvc/src/test/groovy/springfox/documentation/spring/web/readers/operation/OperationCommandReaderSpec.groovy +++ /dev/null @@ -1,66 +0,0 @@ -/* - * - * Copyright 2015-2016 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.spring.web.readers.operation - -import spock.lang.Unroll -import springfox.documentation.spi.DocumentationType -import springfox.documentation.spi.service.contexts.OperationContext -import springfox.documentation.spring.web.mixins.RequestMappingSupport -import springfox.documentation.spring.web.plugins.DocumentationContextSpec - -class OperationCommandReaderSpec extends DocumentationContextSpec implements RequestMappingSupport { - private static final int CURRENT_COUNT = 3 - - @Unroll("property #property expected: #expected") - def "should set various properties based on method name or swagger annotation"() { - given: - OperationContext operationContext = - operationContext( - documentationContext(), - handlerMethod, - CURRENT_COUNT) - - when: - command.apply(operationContext) - def operation = operationContext.operationBuilder().build() - - then: - operation."$property" == expected - - where: - command | property | handlerMethod | expected - new DefaultOperationReader() | 'notes' | dummyHandlerMethod() | null - new DefaultOperationReader() | 'uniqueId' | dummyHandlerMethod() | 'dummyMethodUsingGET' - new DefaultOperationReader() | 'position' | dummyHandlerMethod() | CURRENT_COUNT - new OperationDeprecatedReader() | 'deprecated' | dummyHandlerMethod('methodWithDeprecated') | 'true' - new OperationDeprecatedReader() | 'deprecated' | dummyDeprecatedController() | 'true' - new OperationDeprecatedReader() | 'deprecated' | dummyHandlerMethod() | null - } - - def "Should support all documentation types"() { - expect: - sut.supports(DocumentationType.SPRING_WEB) - sut.supports(DocumentationType.SWAGGER_12) - sut.supports(DocumentationType.SWAGGER_2) - - where: - sut << [new OperationDeprecatedReader(), new DefaultOperationReader()] - } -} \ No newline at end of file diff --git a/springfox-spring-webmvc/src/test/groovy/springfox/documentation/spring/web/readers/operation/OperationMethodReaderSpec.groovy b/springfox-spring-webmvc/src/test/groovy/springfox/documentation/spring/web/readers/operation/OperationMethodReaderSpec.groovy deleted file mode 100644 index 0170e5d3d85..00000000000 --- a/springfox-spring-webmvc/src/test/groovy/springfox/documentation/spring/web/readers/operation/OperationMethodReaderSpec.groovy +++ /dev/null @@ -1,57 +0,0 @@ -/* - * - * Copyright 2015-2016 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.spring.web.readers.operation - -import org.springframework.http.HttpMethod -import org.springframework.web.bind.annotation.RequestMethod -import springfox.documentation.spi.service.contexts.OperationContext -import springfox.documentation.spring.web.mixins.RequestMappingSupport -import springfox.documentation.spring.web.plugins.DocumentationContextSpec - -class OperationMethodReaderSpec extends DocumentationContextSpec implements RequestMappingSupport { - - - def "should return api method when using default reader"() { - given: - OperationContext operationContext = - operationContext( - documentationContext(), - dummyHandlerMethod('methodWithListOfBusinesses'), - 0, - requestMappingInfo("/somePath"), - currentHttpMethod) - - def operationMethodReader = new DefaultOperationReader(); - when: - operationMethodReader.apply(operationContext) - and: - def operation = operationContext.operationBuilder().build() - - then: - operation.method == expected - where: - currentHttpMethod | handlerMethod | expected - RequestMethod.GET | dummyHandlerMethod() | HttpMethod.GET - RequestMethod.PUT | dummyHandlerMethod() | HttpMethod.PUT - RequestMethod.POST | dummyHandlerMethod('methodWithHttpGETMethod') | HttpMethod.POST - RequestMethod.POST | dummyHandlerMethod('methodWithInvalidHttpMethod') | HttpMethod.POST - } - -} diff --git a/springfox-spring-webmvc/src/test/groovy/springfox/documentation/spring/web/readers/operation/OperationParameterHeadersConditionReaderSpec.groovy b/springfox-spring-webmvc/src/test/groovy/springfox/documentation/spring/web/readers/operation/OperationParameterHeadersConditionReaderSpec.groovy deleted file mode 100644 index 32fb3c522f1..00000000000 --- a/springfox-spring-webmvc/src/test/groovy/springfox/documentation/spring/web/readers/operation/OperationParameterHeadersConditionReaderSpec.groovy +++ /dev/null @@ -1,167 +0,0 @@ -/* - * - * Copyright 2016 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.spring.web.readers.operation - -import com.fasterxml.classmate.TypeResolver -import org.springframework.web.method.HandlerMethod -import org.springframework.web.servlet.mvc.condition.HeadersRequestCondition -import org.springframework.web.servlet.mvc.method.RequestMappingInfo -import spock.lang.Unroll -import springfox.documentation.builders.SimpleParameterSpecificationBuilder -import springfox.documentation.schema.ScalarType -import springfox.documentation.service.Parameter -import springfox.documentation.service.ParameterSpecification -import springfox.documentation.service.RequestParameter -import springfox.documentation.spi.DocumentationType -import springfox.documentation.spi.service.contexts.OperationContext -import springfox.documentation.spring.web.mixins.RequestMappingSupport -import springfox.documentation.spring.web.plugins.DocumentationContextSpec - -class OperationParameterHeadersConditionReaderSpec extends DocumentationContextSpec implements RequestMappingSupport { - - OperationParameterHeadersConditionReader sut = new OperationParameterHeadersConditionReader(new TypeResolver()) - - def "(Deprecated) Should read a parameter given a parameter request condition"() { - given: - HandlerMethod handlerMethod = dummyHandlerMethod('methodWithParameterRequestCondition') - HeadersRequestCondition headersCondition = new HeadersRequestCondition("test=testValue") - RequestMappingInfo requestMappingInfo = requestMappingInfo('/parameter-conditions', - ["headersCondition": headersCondition]) - OperationContext operationContext = operationContext( - documentationContext(), - handlerMethod, - 0, - requestMappingInfo) - - when: - sut.apply(operationContext) - def operation = operationContext.operationBuilder().build() - - then: - sut.supports(DocumentationType.SPRING_WEB) - sut.supports(DocumentationType.SWAGGER_12) - sut.supports(DocumentationType.SWAGGER_2) - sut.supports(DocumentationType.OAS_30) - - and: - Parameter parameter = operation.parameters[0] - parameter."$property" == expectedValue - - where: - property | expectedValue - 'name' | 'test' - 'defaultValue' | 'testValue' - 'description' | null - 'required' | true - 'allowMultiple' | false - 'paramType' | "header" - } - - @Unroll - def "Should read a parameter given a parameter request condition for #property"() { - given: - HandlerMethod handlerMethod = dummyHandlerMethod('methodWithParameterRequestCondition') - HeadersRequestCondition headersCondition = new HeadersRequestCondition("test=testValue") - RequestMappingInfo requestMappingInfo = requestMappingInfo('/parameter-conditions', - ["headersCondition": headersCondition]) - OperationContext operationContext = operationContext( - documentationContext(), - handlerMethod, - 0, - requestMappingInfo) - - when: - sut.apply(operationContext) - def operation = operationContext.operationBuilder().build() - - then: - sut.supports(DocumentationType.SPRING_WEB) - sut.supports(DocumentationType.SWAGGER_12) - sut.supports(DocumentationType.SWAGGER_2) - sut.supports(DocumentationType.OAS_30) - - - and: - RequestParameter requestParameter = operation.requestParameters[0] - requestParameter."$property" == expectedValue - - where: - property | expectedValue - 'name' | 'test' - 'paramType' | "header" - 'required' | true - 'description' | null - 'parameterSpecification' | simpleParameter() - } - - private ParameterSpecification simpleParameter() { - new ParameterSpecification( - new SimpleParameterSpecificationBuilder() - .style(null) - .allowReserved(false) - .defaultValue('testValue') - .explode(false) - .enumerationFacet { e -> - e.allowedValues(['testValue']) - } - .model { - it.scalarModel(ScalarType.STRING) - .name("test") - } - .build(), - null) - } - - def "Should ignore a negated parameter in a parameter request condition"() { - given: - HandlerMethod handlerMethod = dummyHandlerMethod('methodWithParameterRequestCondition') - HeadersRequestCondition headersCondition = new HeadersRequestCondition("!test") - RequestMappingInfo requestMappingInfo = requestMappingInfo('/parameter-conditions', - ["headersCondition": headersCondition]) - OperationContext operationContext = operationContext(documentationContext(), handlerMethod, 0, requestMappingInfo) - - when: - sut.apply(operationContext) - def operation = operationContext.operationBuilder().build() - - then: - 0 == operation.parameters.size() - 0 == operation.requestParameters.size() - } - - def "Should ignore a parameter request condition expression that is already present in the parameters"() { - given: - HandlerMethod handlerMethod = dummyHandlerMethod('methodWithParameterRequestCondition') - HeadersRequestCondition paramCondition = new HeadersRequestCondition("test=testValue", "test=3") - OperationContext operationContext = operationContext(documentationContext(), - handlerMethod, - 0, - requestMappingInfo('/parameter-conditions', ["headersCondition": paramCondition])) - - when: - sut.apply(operationContext) - - - then: - def built = operationContext.operationBuilder().build() - 1 == built.parameters.size() - 1 == built.requestParameters.size() - } -} diff --git a/springfox-spring-webmvc/src/test/groovy/springfox/documentation/spring/web/readers/operation/OperationParameterRequestConditionReaderSpec.groovy b/springfox-spring-webmvc/src/test/groovy/springfox/documentation/spring/web/readers/operation/OperationParameterRequestConditionReaderSpec.groovy deleted file mode 100644 index ad189fb1bae..00000000000 --- a/springfox-spring-webmvc/src/test/groovy/springfox/documentation/spring/web/readers/operation/OperationParameterRequestConditionReaderSpec.groovy +++ /dev/null @@ -1,105 +0,0 @@ -/* - * - * Copyright 2016 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.spring.web.readers.operation - -import com.fasterxml.classmate.TypeResolver -import org.springframework.web.method.HandlerMethod -import org.springframework.web.servlet.mvc.condition.ParamsRequestCondition -import org.springframework.web.servlet.mvc.method.RequestMappingInfo -import springfox.documentation.service.Parameter -import springfox.documentation.spi.DocumentationType -import springfox.documentation.spi.service.contexts.OperationContext -import springfox.documentation.spring.web.mixins.RequestMappingSupport -import springfox.documentation.spring.web.plugins.DocumentationContextSpec - -class OperationParameterRequestConditionReaderSpec extends DocumentationContextSpec implements RequestMappingSupport { - - OperationParameterRequestConditionReader sut = new OperationParameterRequestConditionReader(new TypeResolver()) - - def "Should read a parameter given a parameter request condition"() { - given: - HandlerMethod handlerMethod = dummyHandlerMethod('methodWithParameterRequestCondition') - ParamsRequestCondition paramCondition = new ParamsRequestCondition("test=testValue") - RequestMappingInfo requestMappingInfo = requestMappingInfo('/parameter-conditions', - ["paramsCondition": paramCondition]) - OperationContext operationContext = - operationContext(documentationContext(), handlerMethod, 0, requestMappingInfo) - - when: - sut.apply(operationContext) - def operation = operationContext.operationBuilder().build() - - then: - sut.supports(DocumentationType.SPRING_WEB) - sut.supports(DocumentationType.SWAGGER_12) - sut.supports(DocumentationType.SWAGGER_2) - - and: - Parameter parameter = operation.parameters[0] - assert parameter."$property" == expectedValue - - where: - property | expectedValue - 'name' | 'test' - 'defaultValue' | 'testValue' - 'description' | null - 'required' | true - 'allowMultiple' | false - 'paramType' | "query" - - } - - def "Should ignore a negated parameter in a parameter request condition"() { - given: - HandlerMethod handlerMethod = dummyHandlerMethod('methodWithParameterRequestCondition') - ParamsRequestCondition paramCondition = new ParamsRequestCondition("!test") - RequestMappingInfo requestMappingInfo = requestMappingInfo('/parameter-conditions', - ["paramsCondition": paramCondition]) - OperationContext operationContext = - operationContext(documentationContext(), handlerMethod, 0, requestMappingInfo) - - when: - sut.apply(operationContext) - def operation = operationContext.operationBuilder().build() - - then: - 0 == operation.parameters.size() - 0 == operation.requestParameters.size() - - } - - def "Should ignore a parameter request condition expression that is already present in the parameters"() { - given: - HandlerMethod handlerMethod = dummyHandlerMethod('methodWithParameterRequestCondition') - ParamsRequestCondition paramCondition = new ParamsRequestCondition("test=testValue", "test=3") - def requestMappingInfo = requestMappingInfo('/parameter-conditions', ["paramsCondition": paramCondition]) - OperationContext operationContext = - operationContext(documentationContext(), handlerMethod, 0, requestMappingInfo) - - when: - sut.apply(operationContext) - - then: - def built = operationContext.operationBuilder().build() - 1 == built.parameters.size() - 1 == built.requestParameters.size() - - } -} diff --git a/springfox-spring-webmvc/src/test/groovy/springfox/documentation/spring/web/readers/operation/OperationPositionReaderSpec.groovy b/springfox-spring-webmvc/src/test/groovy/springfox/documentation/spring/web/readers/operation/OperationPositionReaderSpec.groovy deleted file mode 100644 index c7a06ab85f9..00000000000 --- a/springfox-spring-webmvc/src/test/groovy/springfox/documentation/spring/web/readers/operation/OperationPositionReaderSpec.groovy +++ /dev/null @@ -1,45 +0,0 @@ -/* - * - * Copyright 2015-2016 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.spring.web.readers.operation - -import springfox.documentation.spi.service.contexts.OperationContext -import springfox.documentation.spring.web.mixins.RequestMappingSupport -import springfox.documentation.spring.web.plugins.DocumentationContextSpec - -class OperationPositionReaderSpec extends DocumentationContextSpec implements RequestMappingSupport { - - def "should have correct api position using default reader"() { - given: - OperationContext operationContext = - operationContext(documentationContext(), handlerMethod, contextCount) - - def operationPositionReader = new DefaultOperationReader(); - when: - operationPositionReader.apply(operationContext) - def operation = operationContext.operationBuilder().build() - then: - operation.position == expectedCount - where: - handlerMethod | contextCount | expectedCount - dummyHandlerMethod() | 2 | 2 - dummyHandlerMethod('methodWithPosition') | 3 | 3 - } - -} \ No newline at end of file diff --git a/springfox-spring-webmvc/src/test/groovy/springfox/documentation/spring/web/readers/operation/OperationResponseClassReaderSpec.groovy b/springfox-spring-webmvc/src/test/groovy/springfox/documentation/spring/web/readers/operation/OperationResponseClassReaderSpec.groovy deleted file mode 100644 index db49d4a42d0..00000000000 --- a/springfox-spring-webmvc/src/test/groovy/springfox/documentation/spring/web/readers/operation/OperationResponseClassReaderSpec.groovy +++ /dev/null @@ -1,84 +0,0 @@ -/* - * - * Copyright 2015-2017 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.spring.web.readers.operation - -import com.fasterxml.classmate.TypeResolver -import org.springframework.plugin.core.OrderAwarePluginRegistry -import org.springframework.plugin.core.PluginRegistry -import springfox.documentation.schema.DefaultTypeNameProvider -import springfox.documentation.schema.JacksonEnumTypeDeterminer -import springfox.documentation.schema.TypeNameExtractor -import springfox.documentation.spi.DocumentationType -import springfox.documentation.spi.schema.TypeNameProviderPlugin -import springfox.documentation.spi.service.contexts.OperationContext -import springfox.documentation.spring.web.mixins.RequestMappingSupport -import springfox.documentation.spring.web.plugins.DocumentationContextSpec - -class OperationResponseClassReaderSpec extends DocumentationContextSpec implements RequestMappingSupport { - OperationResponseClassReader sut - - def setup() { - PluginRegistry modelNameRegistry = - OrderAwarePluginRegistry.create([new DefaultTypeNameProvider()]) - def typeNameExtractor = new TypeNameExtractor( - new TypeResolver(), - modelNameRegistry, - new JacksonEnumTypeDeterminer()) - - sut = new OperationResponseClassReader(defaultSchemaPlugins(), new JacksonEnumTypeDeterminer(), typeNameExtractor) - } - - def "Should support all documentation types"() { - expect: - sut.supports(DocumentationType.SPRING_WEB) - sut.supports(DocumentationType.SWAGGER_12) - sut.supports(DocumentationType.SWAGGER_2) - } - - def "should have correct response class"() { - given: - OperationContext operationContext = operationContext(documentationContext(), handlerMethod) - when: - sut.apply(operationContext) - def operation = operationContext.operationBuilder().build() - then: - if (operation.responseModel.collection) { - assert expectedClass == String.format("%s[%s]", operation.responseModel.type, operation.responseModel.itemType) - } else { - assert expectedClass == operation.responseModel.type - if (allowableValues == null) { - assert operation.responseModel.getAllowableValues() == null - } else { - assert allowableValues == operation.responseModel.getAllowableValues().values - } - } - - where: - handlerMethod | expectedClass | allowableValues - dummyHandlerMethod('methodWithConcreteResponseBody') | 'BusinessModel' | null - dummyHandlerMethod('methodWithAPiAnnotationButWithoutResponseClass') | 'FunkyBusiness' | null - dummyHandlerMethod('methodWithGenericType') | 'Paginated«string»' | null - dummyHandlerMethod('methodWithListOfBusinesses') | 'List[BusinessModel]' | null - dummyHandlerMethod('methodWithMapReturn') | 'Map«string,BusinessModel»'| null - dummyHandlerMethod('methodWithEnumResponse') | 'string' | ['ONE', 'TWO'] - dummyHandlerMethod('methodWithByteArray') | 'Array[byte]' | ['ONE', 'TWO'] - } - -} diff --git a/springfox-spring-webmvc/src/test/groovy/springfox/documentation/spring/web/readers/operation/OperationTagsReaderSpec.groovy b/springfox-spring-webmvc/src/test/groovy/springfox/documentation/spring/web/readers/operation/OperationTagsReaderSpec.groovy deleted file mode 100644 index b7bb824011d..00000000000 --- a/springfox-spring-webmvc/src/test/groovy/springfox/documentation/spring/web/readers/operation/OperationTagsReaderSpec.groovy +++ /dev/null @@ -1,46 +0,0 @@ -/* - * - * Copyright 2015-2016 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.spring.web.readers.operation - -import springfox.documentation.spi.service.contexts.OperationContext -import springfox.documentation.spring.web.mixins.RequestMappingSupport -import springfox.documentation.spring.web.plugins.DocumentationContextSpec - -class OperationTagsReaderSpec extends DocumentationContextSpec implements RequestMappingSupport { - def "should have correct tags"() { - given: - OperationContext operationContext = - operationContext(documentationContext(), handlerMethod) - - and: - OperationTagsReader sut = new OperationTagsReader() - - when: - sut.apply(operationContext) - def operation = operationContext.operationBuilder().build() - then: - operation.tags.containsAll([group]) - - where: - handlerMethod | group - dummyHandlerMethod('methodWithConcreteResponseBody') | "dummy-class" - dummyControllerHandlerMethod() | "dummy-controller" - } -} diff --git a/springfox-spring-webmvc/src/test/groovy/springfox/documentation/spring/web/readers/parameter/OperationParameterReaderSpec.groovy b/springfox-spring-webmvc/src/test/groovy/springfox/documentation/spring/web/readers/parameter/OperationParameterReaderSpec.groovy deleted file mode 100644 index 4b757254394..00000000000 --- a/springfox-spring-webmvc/src/test/groovy/springfox/documentation/spring/web/readers/parameter/OperationParameterReaderSpec.groovy +++ /dev/null @@ -1,290 +0,0 @@ -/* - * - * Copyright 2015-2018 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.spring.web.readers.parameter - -import com.fasterxml.classmate.TypeResolver -import org.joda.time.LocalDateTime -import org.springframework.validation.BindingResult -import org.springframework.web.bind.annotation.RequestMethod -import org.springframework.web.servlet.mvc.condition.ConsumesRequestCondition -import spock.lang.Unroll -import springfox.documentation.schema.JacksonEnumTypeDeterminer -import springfox.documentation.schema.property.bean.AccessorsProvider -import springfox.documentation.schema.property.field.FieldProvider -import springfox.documentation.service.Parameter -import springfox.documentation.spi.DocumentationType -import springfox.documentation.spi.service.contexts.OperationContext -import springfox.documentation.spring.web.dummy.AlternateTypeContainer -import springfox.documentation.spring.web.dummy.DummyModels -import springfox.documentation.spring.web.dummy.ToReplaceWithString -import springfox.documentation.spring.web.dummy.models.Example -import springfox.documentation.spring.web.dummy.models.Treeish -import springfox.documentation.spring.web.mixins.ModelProviderForServiceSupport -import springfox.documentation.spring.web.mixins.RequestMappingSupport -import springfox.documentation.spring.web.plugins.DocumentationContextSpec -import springfox.documentation.spring.web.readers.operation.ContentParameterAggregator -import springfox.documentation.spring.web.readers.operation.OperationParameterReader - -import jakarta.servlet.ServletContext -import jakarta.servlet.ServletRequest -import jakarta.servlet.ServletResponse -import jakarta.servlet.http.HttpServletRequest -import jakarta.servlet.http.HttpServletResponse - -import static springfox.documentation.schema.AlternateTypeRules.* - -class OperationParameterReaderSpec - extends DocumentationContextSpec - implements RequestMappingSupport, - ModelProviderForServiceSupport { - OperationParameterReader sut - def pluginsManager = defaultWebPlugins() - - def setup() { - def typeResolver = new TypeResolver() - def enumTypeDeterminer = new JacksonEnumTypeDeterminer() - plugin - .ignoredParameterTypes(ServletRequest, ServletResponse, HttpServletRequest, - HttpServletResponse, BindingResult, ServletContext, - DummyModels.Ignorable.class - ) - .alternateTypeRules(newRule(typeResolver.resolve(LocalDateTime), typeResolver.resolve(String))) - .configure(contextBuilder) - - def expander = new ModelAttributeParameterExpander( - new FieldProvider(typeResolver), - new AccessorsProvider(typeResolver), - enumTypeDeterminer) - expander.pluginsManager = pluginsManager - sut = new OperationParameterReader(expander, enumTypeDeterminer, new ContentParameterAggregator()) - sut.pluginsManager = pluginsManager - } - - @Unroll - def "Should ignore ignorables"() { - given: - OperationContext operationContext = operationContext( - documentationContext(), - handlerMethod, - 0, - requestMappingInfo("/somePath")) - - when: - sut.apply(operationContext) - def operation = operationContext.operationBuilder().build() - - then: - operation.parameters.size() == expectedSize - - where: - handlerMethod | expectedSize - dummyHandlerMethod('methodWithServletRequest', ServletRequest.class) | 0 - dummyHandlerMethod('methodWithBindingResult', BindingResult.class) | 0 - dummyHandlerMethod('methodWithInteger', Integer.class) | 1 - dummyHandlerMethod('methodWithAnnotatedInteger', Integer.class) | 0 - } - - def "Should consider alternate types"() { - given: - contextBuilder.rules([newRule(ToReplaceWithString, String)]) - OperationContext operationContext = operationContext( - documentationContext(), - handlerMethod, - 0, - requestMappingInfo("/somePath")) - - when: - sut.apply(operationContext) - def operation = operationContext.operationBuilder().build() - - then: - operation.parameters.size() == expectedSize - operation.parameters[0].name == "stringValue" - operation.parameters[0].modelRef.type == "string" - - where: - handlerMethod | expectedSize - dummyHandlerMethod('methodWithAlternateType', AlternateTypeContainer.class) | 1 - } - - def matchesEmptyExample(List parameters) { - assert parameters.size() == 10 - - Parameter annotatedFooParam = parameters.find { it.name == "foo" } - assert annotatedFooParam != null - assert annotatedFooParam.getDescription() == null - assert !annotatedFooParam.required - assert annotatedFooParam.allowableValues == null - - Parameter annotatedBarParam = parameters.find { it.name == "bar" } - assert annotatedBarParam.getDescription() == null - assert !annotatedBarParam.required - assert annotatedBarParam.allowableValues == null - - Parameter unannotatedEnumTypeParam = parameters.find { it.name == "enumType" } - assert unannotatedEnumTypeParam.getDescription() == null - assert unannotatedEnumTypeParam.allowableValues != null - - Parameter annotatedEnumTypeParam = parameters.find { it.name == "annotatedEnumType" } - assert annotatedEnumTypeParam.getDescription() == null - assert annotatedEnumTypeParam.allowableValues != null - - Parameter unannotatedNestedTypeNameParam = parameters.find { it.name == "nestedType.name" } - assert unannotatedNestedTypeNameParam != null - assert unannotatedNestedTypeNameParam.getDescription() == null - - Parameter annotatedAllCapsSetParam = parameters.find { it.name == "allCapsSet" } - assert annotatedAllCapsSetParam.getDescription() == null - assert !annotatedAllCapsSetParam.required - assert annotatedAllCapsSetParam.allowableValues == null - - Parameter unannotatedParentBeanParam = parameters.find { it.name == "parentBeanProperty" } - assert unannotatedParentBeanParam.getDescription() == null - - Parameter localDateTime = parameters.find { it.name == "localDateTime" } - assert !localDateTime.required - assert localDateTime.getDescription() == null - true - } - - def "Should expand ModelAttribute request params as type query"() { - given: - plugin.directModelSubstitute(LocalDateTime, String) - OperationContext operationContext = - operationContext( - documentationContext(), - dummyHandlerMethod('methodWithModelAttribute', Example.class), - 0, - requestMappingInfo("/somePath")) - - when: - sut.apply(operationContext) - def operation = operationContext.operationBuilder().build() - - then: - matchesEmptyExample(operation.parameters) - - operation.parameters.every { - it.paramType == "query" - } - } - - def "Should expand multipart ModelAttribute request params as formData"() { - given: - plugin.directModelSubstitute(LocalDateTime, String) - OperationContext operationContext = - operationContext( - documentationContext(), - dummyHandlerMethod('methodWithModelAttribute', Example.class), - 0, - requestMappingInfo( - "/somePath", - ["consumesRequestCondition": new ConsumesRequestCondition("multipart/form-data")]), - RequestMethod.POST) - - when: - sut.apply(operationContext) - def operation = operationContext.operationBuilder().build() - - then: - matchesEmptyExample(operation.parameters) - - operation.parameters.every { - it.paramType == "formData" - } - } - - def "Should expand ModelAttribute request param if param has treeish field"() { - given: - OperationContext operationContext = - operationContext( - documentationContext(), - dummyHandlerMethod('methodWithTreeishModelAttribute', Treeish.class), - 0, - requestMappingInfo("/somePath")) - - when: - sut.apply(operationContext) - def operation = operationContext.operationBuilder().build() - - then: - operation.parameters.size() == 1 - - Parameter annotatedBarParam = operation.parameters[0] - annotatedBarParam != null - annotatedBarParam.name == 'treeishField' - } - - def "Should not expand unannotated request params"() { - given: - OperationContext operationContext = - operationContext( - documentationContext(), - handlerMethod, - 0, - requestMappingInfo("/somePath")) - - when: - sut.apply(operationContext) - def operation = operationContext.operationBuilder().build() - - then: - operation.parameters.size() == expectedSize - - where: - handlerMethod | expectedSize - dummyHandlerMethod('methodWithoutModelAttribute', Example.class) | 10 - } - - def "Should not expand @RequestParam or @PathVariable annotated params"() { - given: - OperationContext operationContext = - operationContext( - documentationContext(), - handlerMethod, - 0, - requestMappingInfo("/somePath")) - - when: - sut.apply(operationContext) - def operation = operationContext.operationBuilder().build() - - then: - operation.parameters.size() == expectedSize - - where: - handlerMethod | expectedSize - dummyHandlerMethod('methodWithURIAsRequestParam', URI.class) | 1 - dummyHandlerMethod('methodWithURIAsPathVariable', URI.class) | 1 - } - - def "OperationParameterReader supports all documentationTypes"() { - given: - def sut = new OperationParameterReader( - Mock(ModelAttributeParameterExpander), - new JacksonEnumTypeDeterminer(), - new ContentParameterAggregator()) - sut.pluginsManager = defaultWebPlugins() - - expect: - sut.supports(DocumentationType.SPRING_WEB) - sut.supports(DocumentationType.SWAGGER_12) - } -} diff --git a/springfox-spring-webmvc/src/test/groovy/springfox/documentation/spring/web/readers/parameter/ParameterAnnotationSupport.groovy b/springfox-spring-webmvc/src/test/groovy/springfox/documentation/spring/web/readers/parameter/ParameterAnnotationSupport.groovy deleted file mode 100644 index 07e8734fd3b..00000000000 --- a/springfox-spring-webmvc/src/test/groovy/springfox/documentation/spring/web/readers/parameter/ParameterAnnotationSupport.groovy +++ /dev/null @@ -1,54 +0,0 @@ -package springfox.documentation.spring.web.readers.parameter - -import io.swagger.annotations.ApiParam -import org.springframework.web.bind.annotation.PathVariable -import org.springframework.web.bind.annotation.RequestBody -import org.springframework.web.bind.annotation.RequestHeader -import org.springframework.web.bind.annotation.RequestParam -import org.springframework.web.bind.annotation.RequestPart - -trait ParameterAnnotationSupport { - RequestParam requestParam(required, value, defaultValue) { - [ - value : { -> value }, - defaultValue: { -> defaultValue }, - required : { -> required } - ] as RequestParam - } - - PathVariable pathVariable(value, required = false) { - [ - value : { -> value }, - name : { -> value }, - required: { -> required }, - annotationType: { PathVariable.class } - ] as PathVariable - } - - RequestHeader requestHeader(required, value, defaultValue) { - [ - value : { -> value }, - defaultValue: { -> defaultValue }, - required : { -> required } - ] as RequestHeader - } - - RequestBody requestBody(required) { - [ - required: { -> required } - ] as RequestBody - } - - RequestPart requestPart(required, value) { - [ - value : { -> value }, - required: { -> required } - ] as RequestPart - } - - ApiParam apiParam(required) { - [ - required: { -> required } - ] as ApiParam - } -} diff --git a/springfox-spring-webmvc/src/test/groovy/springfox/documentation/spring/web/readers/parameter/ParameterDataTypeReaderSpec.groovy b/springfox-spring-webmvc/src/test/groovy/springfox/documentation/spring/web/readers/parameter/ParameterDataTypeReaderSpec.groovy deleted file mode 100644 index 53b0df1cdfa..00000000000 --- a/springfox-spring-webmvc/src/test/groovy/springfox/documentation/spring/web/readers/parameter/ParameterDataTypeReaderSpec.groovy +++ /dev/null @@ -1,203 +0,0 @@ -/* - * - * Copyright 2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.spring.web.readers.parameter - -import com.fasterxml.classmate.TypeResolver -import org.springframework.plugin.core.OrderAwarePluginRegistry -import org.springframework.plugin.core.PluginRegistry -import org.springframework.web.bind.annotation.PathVariable -import org.springframework.web.bind.annotation.RequestParam -import org.springframework.web.multipart.MultipartFile -import spock.lang.Unroll -import springfox.documentation.schema.* -import springfox.documentation.schema.property.ModelSpecificationFactory -import springfox.documentation.service.AllowableListValues -import springfox.documentation.service.ResolvedMethodParameter -import springfox.documentation.spi.DocumentationType -import springfox.documentation.spi.schema.AlternateTypeProvider -import springfox.documentation.spi.schema.GenericTypeNamingStrategy -import springfox.documentation.spi.schema.TypeNameProviderPlugin -import springfox.documentation.spi.service.contexts.OperationContext -import springfox.documentation.spi.service.contexts.OperationModelContextsBuilder -import springfox.documentation.spi.service.contexts.ParameterContext -import springfox.documentation.spring.web.dummy.DummyModels -import springfox.documentation.spring.web.dummy.models.Business -import springfox.documentation.spring.web.mixins.RequestMappingSupport -import springfox.documentation.spring.web.plugins.DocumentationContextSpec - -import static java.util.Collections.emptySet - -class ParameterDataTypeReaderSpec extends DocumentationContextSpec implements RequestMappingSupport { - PluginRegistry modelNameRegistry = - OrderAwarePluginRegistry.of([new DefaultTypeNameProvider()]) - def enumTypeDeterminer = new JacksonEnumTypeDeterminer() - def typeNameExtractor = new TypeNameExtractor( - new TypeResolver(), - modelNameRegistry, - enumTypeDeterminer) - def operationModelContextsBuilder = new OperationModelContextsBuilder( - "group", - DocumentationType.SWAGGER_12, - "0", - Mock(AlternateTypeProvider), - Mock(GenericTypeNamingStrategy), - emptySet()) - - def knownModels = new HashMap>() - - ParameterDataTypeReader sut = new ParameterDataTypeReader( - defaultSchemaPlugins(), - typeNameExtractor, - enumTypeDeterminer, - new ModelSpecificationFactory( - typeNameExtractor, - enumTypeDeterminer)) - - def "Should support all documentation types"() { - expect: - sut.supports(DocumentationType.SPRING_WEB) - sut.supports(DocumentationType.SWAGGER_12) - sut.supports(DocumentationType.SWAGGER_2) - } - - @Unroll - def "Parameter types #paramType"() { - given: - ResolvedMethodParameter resolvedMethodParameter = - new ResolvedMethodParameter(0, "", annotations, new TypeResolver().resolve(paramType)) - def namingStrategy = new DefaultGenericTypeNamingStrategy() - knownModels.put("0_0", new HashSet()) - - ParameterContext parameterContext = - new ParameterContext(resolvedMethodParameter, documentationContext(), namingStrategy, - Stub(OperationContext) { - operationModelsBuilder() >> operationModelContextsBuilder - getKnownModels() >> knownModels - }, 0) - - when: - sut.apply(parameterContext) - - then: - def modelRef = parameterContext.parameterBuilder().build().modelRef - modelRef.type == expected - if ("object" == expected) { - assert modelRef.itemType == "string" - def allowable = modelRef.allowableValues as AllowableListValues - assert allowable.values.size() == 2 - } - - where: - paramType | annotations | expected - char | [] | "string" - String | [] | "string" - Integer | [] | "int" - int | [] | "int" - Long | [] | "long" - Long | [Mock(PathVariable)] | "long" - Long | [Mock(RequestParam)] | "long" - Long[] | [Mock(PathVariable)] | "string" - Long[] | [Mock(RequestParam)] | "Array" - BigInteger | [] | "biginteger" - long | [] | "long" - Float | [] | "float" - float | [] | "float" - Double | [] | "double" - double | [] | "double" - Byte | [] | "byte" - BigDecimal | [] | "bigdecimal" - byte | [] | "byte" - Boolean | [] | "boolean" - boolean | [] | "boolean" - Date | [] | "date-time" - DummyModels.FunkyBusiness | [] | "FunkyBusiness" - DummyModels.FunkyBusiness | [Mock(PathVariable)] | "string" - DummyModels.FunkyBusiness | [Mock(RequestParam)] | "string" - DummyModels.FunkyBusiness[] | [Mock(PathVariable)] | "string" - DummyModels.FunkyBusiness[] | [Mock(RequestParam)] | "string" - Void | [] | "void" - MultipartFile | [] | "__file" - Business.BusinessType | [] | "string" - Business.BusinessType | [Mock(PathVariable)] | "string" - Business.BusinessType | [Mock(RequestParam)] | "string" - Business.BusinessType[] | [Mock(PathVariable)] | "string" - Business.BusinessType[] | [Mock(RequestParam)] | "Array" - } - - def "RequestParam Map types"() { - given: - ResolvedMethodParameter resolvedMethodParameter = - new ResolvedMethodParameter(0, "", [Mock(RequestParam)], new TypeResolver().resolve(Map, String, String)) - def namingStrategy = new DefaultGenericTypeNamingStrategy() - knownModels.put("0_0", new HashSet()) - - ParameterContext parameterContext = - new ParameterContext(resolvedMethodParameter, documentationContext(), namingStrategy, - Stub(OperationContext) { - operationModelsBuilder() >> operationModelContextsBuilder - getKnownModels() >> knownModels - }, 0) - - when: - sut.apply(parameterContext) - - then: - def modelRef = parameterContext.parameterBuilder().build().modelRef - modelRef.type == "" - modelRef.isMap() - modelRef.itemType == "string" - } - - def "Container Parameter types"() { - given: - ResolvedMethodParameter resolvedMethodParameter = - new ResolvedMethodParameter(0, "", [], new TypeResolver().resolve(List, String)) - def namingStrategy = new DefaultGenericTypeNamingStrategy() - knownModels.put("0_0", new HashSet()) - - ParameterContext parameterContext = - new ParameterContext(resolvedMethodParameter, documentationContext(), namingStrategy, - Stub(OperationContext) { - operationModelsBuilder() >> operationModelContextsBuilder - getKnownModels() >> knownModels - }, 0) - - - when: - PluginRegistry modelNameRegistry = - OrderAwarePluginRegistry.create([new DefaultTypeNameProvider()]) - def typeNameExtractor = new TypeNameExtractor( - new TypeResolver(), - modelNameRegistry, - enumTypeDeterminer) - def sut = new ParameterDataTypeReader( - defaultSchemaPlugins(), - typeNameExtractor, - enumTypeDeterminer, - new ModelSpecificationFactory( - typeNameExtractor, - enumTypeDeterminer)) - sut.apply(parameterContext) - then: - parameterContext.parameterBuilder().build().modelRef.type == "List" - parameterContext.parameterBuilder().build().modelRef.itemType == "string" - } - -} diff --git a/springfox-spring-webmvc/src/test/groovy/springfox/documentation/spring/web/readers/parameter/ParameterMultiplesReaderSpec.groovy b/springfox-spring-webmvc/src/test/groovy/springfox/documentation/spring/web/readers/parameter/ParameterMultiplesReaderSpec.groovy deleted file mode 100644 index a6944552917..00000000000 --- a/springfox-spring-webmvc/src/test/groovy/springfox/documentation/spring/web/readers/parameter/ParameterMultiplesReaderSpec.groovy +++ /dev/null @@ -1,90 +0,0 @@ -/* - * - * Copyright 2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.spring.web.readers.parameter - -import com.fasterxml.classmate.ResolvedType -import com.fasterxml.classmate.TypeResolver -import io.swagger.annotations.ApiParam -import spock.lang.Unroll -import springfox.documentation.service.CollectionFormat -import springfox.documentation.service.ResolvedMethodParameter -import springfox.documentation.spi.DocumentationType -import springfox.documentation.spi.schema.GenericTypeNamingStrategy -import springfox.documentation.spi.service.contexts.OperationContext -import springfox.documentation.spi.service.contexts.ParameterContext -import springfox.documentation.spring.web.dummy.DummyClass -import springfox.documentation.spring.web.mixins.ModelProviderForServiceSupport -import springfox.documentation.spring.web.mixins.RequestMappingSupport -import springfox.documentation.spring.web.plugins.DocumentationContextSpec - -class ParameterMultiplesReaderSpec - extends DocumentationContextSpec - implements RequestMappingSupport, - ModelProviderForServiceSupport { - - def sut = new ParameterMultiplesReader() - - def "Should support all documentation types"() { - expect: - sut.supports(DocumentationType.SPRING_WEB) - sut.supports(DocumentationType.SWAGGER_12) - sut.supports(DocumentationType.SWAGGER_2) - } - - @Unroll - def "param multiples #apiParamAnnotation && #paramType for default reader"() { - given: - ResolvedType resolvedType = paramType != null ? new TypeResolver().resolve(paramType) : null - ResolvedMethodParameter resolvedMethodParameter = - new ResolvedMethodParameter(0, "", [apiParamAnnotation], resolvedType) - ParameterContext parameterContext = new ParameterContext( - resolvedMethodParameter, - documentationContext(), - Mock(GenericTypeNamingStrategy), - Mock(OperationContext), 0) - - when: - sut.apply(parameterContext) - - then: - parameterContext.parameterBuilder().build().isAllowMultiple() == (expected != null) - parameterContext.requestParameterBuilder() - .query { q -> - assert q.collectionFormat == expected - } - - where: - apiParamAnnotation | paramType | expected - [allowMultiple: { -> true }] as ApiParam | String.class | null - [allowMultiple: { -> true }] as ApiParam | String[].class | CollectionFormat.CSV - [allowMultiple: { -> false }] as ApiParam | String[].class | CollectionFormat.CSV - [allowMultiple: { -> false }] as ApiParam | DummyClass.BusinessType[].class | CollectionFormat.CSV - null | String[].class | CollectionFormat.CSV - null | List.class | CollectionFormat.CSV - null | Collection.class | CollectionFormat.CSV - null | Set.class | CollectionFormat.CSV - null | Vector.class | CollectionFormat.CSV - null | Object[].class | CollectionFormat.CSV - null | Integer.class | null - null | Iterable.class | CollectionFormat.CSV - } - - -} diff --git a/springfox-spring-webmvc/src/test/groovy/springfox/documentation/spring/web/readers/parameter/ParameterReaderSpec.groovy b/springfox-spring-webmvc/src/test/groovy/springfox/documentation/spring/web/readers/parameter/ParameterReaderSpec.groovy deleted file mode 100644 index 8a789c76b27..00000000000 --- a/springfox-spring-webmvc/src/test/groovy/springfox/documentation/spring/web/readers/parameter/ParameterReaderSpec.groovy +++ /dev/null @@ -1,191 +0,0 @@ -/* - * - * Copyright 2015-2017 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.spring.web.readers.parameter - -import com.fasterxml.classmate.ResolvedType -import com.fasterxml.classmate.TypeResolver -import io.swagger.annotations.ApiParam -import org.springframework.mock.env.MockEnvironment -import org.springframework.web.bind.annotation.ModelAttribute -import org.springframework.web.bind.annotation.PathVariable -import org.springframework.web.bind.annotation.RequestHeader -import org.springframework.web.bind.annotation.RequestParam -import org.springframework.web.bind.annotation.RequestPart -import org.springframework.web.method.HandlerMethod -import spock.lang.Shared -import spock.lang.Unroll -import springfox.documentation.schema.ScalarType -import springfox.documentation.service.ParameterType -import springfox.documentation.service.ResolvedMethodParameter -import springfox.documentation.spi.DocumentationType -import springfox.documentation.spi.schema.GenericTypeNamingStrategy -import springfox.documentation.spi.service.contexts.OperationContext -import springfox.documentation.spi.service.contexts.ParameterContext -import springfox.documentation.spring.web.DescriptionResolver -import springfox.documentation.spring.web.mixins.ModelProviderForServiceSupport -import springfox.documentation.spring.web.mixins.RequestMappingSupport -import springfox.documentation.spring.web.plugins.DocumentationContextSpec - -class ParameterReaderSpec - extends DocumentationContextSpec - implements RequestMappingSupport, - ModelProviderForServiceSupport { - @Shared - def description = new DescriptionResolver(new MockEnvironment()) - - def "should set basic properties based on ApiParam annotation or a sensible default"() { - given: - def resolvedMethodParameter = - new ResolvedMethodParameter(0, "", [apiParamAnnotation, reqParamAnnot], Mock(ResolvedType)) - ParameterContext parameterContext = new ParameterContext( - resolvedMethodParameter, - documentationContext(), - Mock(GenericTypeNamingStrategy), - Mock(OperationContext), 0) - - when: - parameterPlugin.apply(parameterContext) - - then: - parameterContext.parameterBuilder().build()."$resultProperty" == expected - parameterContext.requestParameterBuilder() - .name("test") - .in(ParameterType.QUERY) - .query { q -> q.model { it.scalarModel(ScalarType.STRING) } } - .build() - .parameterSpecification - ?.query - ?.orElse(null) - ?."$resultProperty" == expected - - where: - parameterPlugin | resultProperty | springParameterMethod | methodReturnValue | apiParamAnnotation | reqParamAnnot | expected - new ParameterDefaultReader(description) | 'defaultValue' | 'none' | 'any' | null | null | null - new ParameterDefaultReader(description) | 'defaultValue' | 'none' | 'any' | apiParam([defaultValue: { -> 'defl' }])| null | null - new ParameterDefaultReader(description) | 'defaultValue' | 'none' | 'any' | null | reqParam([defaultValue: { -> 'defr' }]) | 'defr' - } - - @Unroll - def "should set parameter name and description correctly for #methodName"() { - given: - def bean = new ParamNameClazzSpecimen() - def resolvedBeanType = new TypeResolver().resolve(ParamNameClazzSpecimen) - HandlerMethod method = new HandlerMethod( - bean, - ParamNameClazzSpecimen.methods.find { it.name.equals(methodName) }) - def resolvedMethodParameter = new ResolvedMethodParameter( - "someName", - method.getMethodParameters().first(), - resolvedBeanType) - ParameterContext parameterContext = new ParameterContext( - resolvedMethodParameter, - documentationContext(), - Mock(GenericTypeNamingStrategy), - Mock(OperationContext), 0) - - when: - parameterPlugin.apply(parameterContext) - - - then: - def builtParameter = parameterContext.parameterBuilder().build() - builtParameter."$resultProperty" == expected - builtParameter.description == expected - - - and: - def builtRequestParameter = parameterContext.requestParameterBuilder() - .in(ParameterType.QUERY) - .build() - builtRequestParameter."$resultProperty" == expected - builtRequestParameter.description == expected - - where: - parameterPlugin | resultProperty | methodName | expected - new ParameterNameReader() | 'name' | "method1" | 'someName' - new ParameterNameReader() | 'name' | "method2" | 'someName' - new ParameterNameReader() | 'name' | "method3" | 'ArName' - new ParameterNameReader() | 'name' | "method4" | 'header' - new ParameterNameReader() | 'name' | "method5" | 'modelAttr' - new ParameterNameReader() | 'name' | "method6" | 'pathVar' - new ParameterNameReader() | 'name' | "method7" | 'partName' - } - - class ParamNameClazzSpecimen { - void method1(String someName) { - } - - void method2(@ApiParam(name = "AnName") String someName) { - } - - void method3(@RequestParam(value = "ArName") String someName) { - } - - void method4(@RequestHeader(value = "header") String someName) { - } - - void method5(@ModelAttribute(value = "modelAttr") String someName) { - } - - void method6(@PathVariable(value = "pathVar") String someName) { - } - - void method7(@RequestPart(value = "partName") String someName) { - } - } - - def "ParameterNameReader supports all documentationTypes"() { - given: - def sut = new ParameterNameReader() - - expect: - sut.supports(DocumentationType.SPRING_WEB) - sut.supports(DocumentationType.SWAGGER_12) - sut.supports(DocumentationType.SWAGGER_2) - } - - def "ParameterDefaultReader should work with any documentationType"() { - given: - def sut = new ParameterDefaultReader(description) - - expect: - sut.supports(DocumentationType.SPRING_WEB) - sut.supports(DocumentationType.SWAGGER_12) - sut.supports(DocumentationType.SWAGGER_2) - } - - def "ParameterTypeReader should work with any documentationType"() { - given: - def sut = new ParameterTypeReader() - - expect: - sut.supports(DocumentationType.SPRING_WEB) - sut.supports(DocumentationType.SWAGGER_12) - sut.supports(DocumentationType.SWAGGER_2) - } - - private ApiParam apiParam(Map closureMap) { - closureMap as ApiParam - } - - private RequestParam reqParam(Map closureMap) { - closureMap as RequestParam - } -} diff --git a/springfox-spring-webmvc/src/test/groovy/springfox/documentation/spring/web/readers/parameter/ParameterRequiredReaderSpec.groovy b/springfox-spring-webmvc/src/test/groovy/springfox/documentation/spring/web/readers/parameter/ParameterRequiredReaderSpec.groovy deleted file mode 100644 index 624b6ac9aad..00000000000 --- a/springfox-spring-webmvc/src/test/groovy/springfox/documentation/spring/web/readers/parameter/ParameterRequiredReaderSpec.groovy +++ /dev/null @@ -1,178 +0,0 @@ -/* - * - * Copyright 2015-2019 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.spring.web.readers.parameter - -import com.fasterxml.classmate.TypeResolver -import org.springframework.core.MethodParameter -import org.springframework.mock.env.MockEnvironment -import org.springframework.web.bind.annotation.PathVariable -import spock.lang.Shared -import spock.lang.Unroll -import springfox.documentation.common.SpringVersion -import springfox.documentation.common.Version -import springfox.documentation.service.ParameterType -import springfox.documentation.service.ResolvedMethodParameter -import springfox.documentation.spi.DocumentationType -import springfox.documentation.spi.schema.GenericTypeNamingStrategy -import springfox.documentation.spi.service.contexts.OperationContext -import springfox.documentation.spi.service.contexts.ParameterContext -import springfox.documentation.spring.web.DescriptionResolver -import springfox.documentation.spring.web.mixins.RequestMappingSupport -import springfox.documentation.spring.web.plugins.DocumentationContextSpec - -import java.lang.annotation.Annotation - -import static org.springframework.web.bind.annotation.ValueConstants.DEFAULT_NONE - -class ParameterRequiredReaderSpec - extends DocumentationContextSpec - implements ParameterAnnotationSupport, RequestMappingSupport { - @Shared - def description = new DescriptionResolver(new MockEnvironment()) - - @Unroll - def "parameters required paramAnnotations using default reader"() { - given: - MethodParameter methodParameter = Mock(MethodParameter) - methodParameter.getParameterAnnotations() >> (paramAnnotations as Annotation[]) - methodParameter.getParameterType() >> Object.class - methodParameter.getMethodAnnotation(PathVariable.class) >> paramAnnotations.find { it instanceof PathVariable } - - and: - def operation = Mock(OperationContext) - operation.requestMappingPattern() >> requestPattern - - and: - def resolvedMethodParameter = - new ResolvedMethodParameter( - 0, - "", - paramAnnotations, - new TypeResolver().resolve(Object.class)) - ParameterContext parameterContext = - new ParameterContext( - resolvedMethodParameter - , - documentationContext(), - Mock(GenericTypeNamingStrategy), - operation, 0) - and: - def springVersion = Mock(SpringVersion.class); - springVersion.getVersion() >> Version.parse(version) - - when: - def operationCommand = new ParameterRequiredReader(description, springVersion) - operationCommand.apply(parameterContext) - - then: - parameterContext.parameterBuilder().build().isRequired() == expected - parameterContext.requestParameterBuilder() - .name("test") - .in(ParameterType.QUERY) - .build().required == expected - - where: - paramAnnotations | version | requestPattern | expected - [apiParam(false), pathVariableRequired()] | "4.3.3.RELEASE" | "/path/{required-param}" | true - [apiParam(false), pathVariableRequired()] | "4.2.0.RELEASE" | "/path/{required-param}" | true - [apiParam(true), pathVariableRequired()] | "4.3.3.RELEASE" | "/path/{required-param}" | true - [apiParam(true), pathVariableRequired()] | "4.2.0.RELEASE" | "/path/{required-param}" | true - [apiParam(false), pathVariableOptional()] | "4.3.3.RELEASE" | "/path/{optional-param}" | true - [apiParam(false), pathVariableOptional()] | "4.3.3.RELEASE" | "/path" | false - [apiParam(true), pathVariableOptional()] | "4.3.3.RELEASE" | "/path/{optional-param}" | true - [apiParam(true), pathVariableOptional()] | "4.3.3.RELEASE" | "/path" | false - [apiParam(false), requestHeader(false, "", "")] | "4.3.3.RELEASE" | "/path" | false - [requestHeader(true, "", "")] | "4.3.3.RELEASE" | "/path" | true - [requestHeader(false, "", "")] | "4.3.3.RELEASE" | "/path" | false - [apiParam(true)] | "4.3.3.RELEASE" | "/path" | false - [apiParam(false)] | "4.3.3.RELEASE" | "/path" | false - [requestParam(true, "", DEFAULT_NONE)] | "4.3.3.RELEASE" | "/path" | true - [requestParam(true, "", "")] | "4.3.3.RELEASE" | "/path" | false - [requestParam(true, "", null)] | "4.3.3.RELEASE" | "/path" | false - [requestParam(true, "", "default value")] | "4.3.3.RELEASE" | "/path" | false - [requestParam(false, "", DEFAULT_NONE)] | "4.3.3.RELEASE" | "/path" | false - [requestParam(false, "", "")] | "4.3.3.RELEASE" | "/path" | false - [requestBody(false)] | "4.3.3.RELEASE" | "/path" | false - [requestBody(true)] | "4.3.3.RELEASE" | "/path" | true - [requestPart(false, "")] | "4.3.3.RELEASE" | "/path" | false - [requestPart(true, "")] | "4.3.3.RELEASE" | "/path" | true - [] | "4.3.3.RELEASE" | "/path" | false - [null] | "4.3.3.RELEASE" | "/path" | false - [apiParam(true), requestParam(false, "", DEFAULT_NONE)] | "4.3.3.RELEASE" | "/path" | false - [apiParam(false), requestParam(true, "", DEFAULT_NONE)] | "4.3.3.RELEASE" | "/path" | true - [apiParam(false), requestParam(true, "", DEFAULT_NONE)] | "4.3.3.RELEASE" | "/path" | true - } - - def pathVariableRequired() { - pathVariable("required-param", true) - } - - def pathVariableOptional() { - pathVariable("optional-param", false) - } - - def "should detect java_util_Optional parameters"() { - given: - def resolvedMethodParameter = new ResolvedMethodParameter( - 0, - "", - paramAnnotations, - new TypeResolver().resolve(Object.class)) - ParameterContext parameterContext = new ParameterContext( - resolvedMethodParameter, - documentationContext(), - Mock(GenericTypeNamingStrategy), - Mock(OperationContext), 0) - - when: - def operationCommand = new ParameterRequiredReader(description) { - @Override - boolean isOptional(ResolvedMethodParameter input) { - true - } - } - operationCommand.apply(parameterContext) - - then: - !parameterContext.parameterBuilder().build().isRequired() - !parameterContext.requestParameterBuilder() - .name("test") - .in(ParameterType.QUERY) - .build().required - - where: - paramAnnotations << [ - [requestHeader(true, "", "")], - [requestHeader(false, "", "")], - [requestParam(true, "", "")], - [requestParam(false, "", "")] - ] - } - - def "Supports all documentation types"() { - given: - def sut = new ParameterRequiredReader(description) - - expect: - sut.supports(DocumentationType.SPRING_WEB) - sut.supports(DocumentationType.SWAGGER_12) - sut.supports(DocumentationType.SWAGGER_2) - } -} diff --git a/springfox-spring-webmvc/src/test/groovy/springfox/documentation/spring/web/readers/parameter/ParameterTypeReaderSpec.groovy b/springfox-spring-webmvc/src/test/groovy/springfox/documentation/spring/web/readers/parameter/ParameterTypeReaderSpec.groovy deleted file mode 100644 index 249f9bb90f2..00000000000 --- a/springfox-spring-webmvc/src/test/groovy/springfox/documentation/spring/web/readers/parameter/ParameterTypeReaderSpec.groovy +++ /dev/null @@ -1,116 +0,0 @@ -/* - * - * Copyright 2018 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.spring.web.readers.parameter - -import com.fasterxml.classmate.ResolvedType -import com.fasterxml.classmate.TypeResolver -import org.springframework.http.HttpMethod -import org.springframework.web.bind.annotation.ModelAttribute -import org.springframework.web.bind.annotation.PathVariable -import org.springframework.web.bind.annotation.RequestBody -import org.springframework.web.bind.annotation.RequestHeader -import org.springframework.web.bind.annotation.RequestParam -import org.springframework.web.bind.annotation.RequestPart -import org.springframework.web.multipart.MultipartFile -import spock.lang.Unroll -import springfox.documentation.service.ResolvedMethodParameter -import springfox.documentation.spi.DocumentationType -import springfox.documentation.spi.schema.GenericTypeNamingStrategy -import springfox.documentation.spi.service.contexts.OperationContext -import springfox.documentation.spi.service.contexts.ParameterContext -import springfox.documentation.spring.web.dummy.models.Example -import springfox.documentation.spring.web.mixins.RequestMappingSupport -import springfox.documentation.spring.web.plugins.DocumentationContextSpec - -import javax.validation.constraints.NotNull - -import static org.springframework.http.MediaType.* - -class ParameterTypeReaderSpec extends DocumentationContextSpec implements RequestMappingSupport { - - @Unroll - def "param #type"() { - given: - def paramAnnotations = annotations == null ? [] : annotations - def resolvedMethodParameter = new ResolvedMethodParameter( - 0, - "", - paramAnnotations, - resolve(type)) - def operationContext = Mock(OperationContext) - - and: - operationContext.consumes() >> consumes - operationContext.httpMethod() >> httpMethod - ParameterContext parameterContext = - new ParameterContext( - resolvedMethodParameter, - documentationContext(), - Mock(GenericTypeNamingStrategy), - operationContext, 0) - - when: - def operationCommand = new ParameterTypeReader() - operationCommand.apply(parameterContext) - - then: - parameterContext.parameterBuilder().build().paramType == expected - parameterContext.requestParameterBuilder() - .name("test") - .build().in.in == expected - - where: - annotations | type | consumes | httpMethod | expected - [[:] as PathVariable] | Integer | [] | HttpMethod.GET | "path" - [[:] as ModelAttribute] | Integer | [] | HttpMethod.GET | "query" - [[:] as ModelAttribute] | Example | [] | HttpMethod.GET | "query" - [[:] as RequestHeader] | Integer | [] | HttpMethod.GET | "header" - [[:] as RequestParam] | Integer | [] | HttpMethod.GET | "query" - [[:] as RequestParam] | Integer | [] | HttpMethod.POST | "query" - [[:] as RequestParam] | Integer | [APPLICATION_JSON] | HttpMethod.GET | "query" - [[:] as RequestParam] | Integer | [APPLICATION_JSON] | HttpMethod.POST | "query" - [[:] as RequestParam] | Integer | [APPLICATION_FORM_URLENCODED] | HttpMethod.POST | "form" - [[:] as RequestPart, [:] as RequestParam] | Integer | [MULTIPART_FORM_DATA] | HttpMethod.POST | "formData" - [[:] as RequestPart] | Example | [MULTIPART_FORM_DATA] | HttpMethod.POST | "formData" - [[:] as RequestBody] | Integer | [APPLICATION_JSON] | HttpMethod.POST | "body" - null | Integer | [] | HttpMethod.GET | "query" - [[:] as RequestPart] | MultipartFile | [] | HttpMethod.GET | "formData" - null | MultipartFile | [] | HttpMethod.GET | "body" - null | MultipartFile[] | [] | HttpMethod.GET | "body" - null | Integer | [] | HttpMethod.GET | "query" - [[:] as NotNull] | String | [] | HttpMethod.GET | "query" - [[:] as NotNull] | String | [] | HttpMethod.HEAD | "query" - [[:] as NotNull] | String | [] | HttpMethod.OPTIONS | "query" - [[:] as NotNull] | String | [] | HttpMethod.POST | "body" - } - - def "Should work with any documentationType"() { - given: - ParameterTypeReader sut = new ParameterTypeReader() - expect: - sut.supports(DocumentationType.SPRING_WEB) - sut.supports(DocumentationType.SWAGGER_12) - sut.supports(DocumentationType.SWAGGER_2) - } - - ResolvedType resolve(Class clazz) { - new TypeResolver().resolve(clazz) - } -} diff --git a/springfox-spring-webmvc/src/test/groovy/springfox/documentation/spring/web/scanners/ApiDescriptionLookupSpec.groovy b/springfox-spring-webmvc/src/test/groovy/springfox/documentation/spring/web/scanners/ApiDescriptionLookupSpec.groovy deleted file mode 100644 index 163d94d6abe..00000000000 --- a/springfox-spring-webmvc/src/test/groovy/springfox/documentation/spring/web/scanners/ApiDescriptionLookupSpec.groovy +++ /dev/null @@ -1,48 +0,0 @@ -/* - * - * Copyright 2015-2016 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ -package springfox.documentation.spring.web.scanners - -import spock.lang.Specification -import springfox.documentation.RequestHandler -import springfox.documentation.RequestHandlerKey -import springfox.documentation.service.ApiDescription -import springfox.documentation.spring.web.mixins.RequestMappingSupport - -class ApiDescriptionLookupSpec extends Specification implements RequestMappingSupport { - def "Given a controller method be able to lookup the api description" () { - given: - ApiDescriptionLookup sut = new ApiDescriptionLookup() - and: - def apiDescription = Mock(ApiDescription) - def requestHandler = Mock(RequestHandler) - def requestHandlerKey = new RequestHandlerKey( - [] as Set, - [] as Set, - [] as Set, - [] as Set) - and: - requestHandler.key() >> requestHandlerKey - when: - sut.add(requestHandlerKey, apiDescription) - then: - sut.description(requestHandler) == apiDescription - and: - sut.description(Mock(RequestHandler)) == null - } -} diff --git a/springfox-spring-webmvc/src/test/groovy/springfox/documentation/spring/web/scanners/ApiDescriptionReaderSpec.groovy b/springfox-spring-webmvc/src/test/groovy/springfox/documentation/spring/web/scanners/ApiDescriptionReaderSpec.groovy deleted file mode 100644 index 68ad0a24745..00000000000 --- a/springfox-spring-webmvc/src/test/groovy/springfox/documentation/spring/web/scanners/ApiDescriptionReaderSpec.groovy +++ /dev/null @@ -1,133 +0,0 @@ -/* - * - * Copyright 2015-2019 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.spring.web.scanners - -import com.fasterxml.classmate.TypeResolver - -import org.springframework.web.servlet.mvc.method.RequestMappingInfo -import spock.lang.Unroll -import springfox.documentation.service.ApiDescription -import springfox.documentation.service.Operation -import springfox.documentation.spi.service.contexts.RequestMappingContext -import springfox.documentation.spring.web.WebMvcRequestHandler -import springfox.documentation.spring.web.mixins.RequestMappingSupport -import springfox.documentation.spring.web.paths.DefaultPathProvider -import springfox.documentation.spring.web.paths.Paths -import springfox.documentation.spring.web.plugins.DocumentationContextSpec -import springfox.documentation.spring.web.readers.operation.ApiOperationReader -import springfox.documentation.spring.web.readers.operation.HandlerMethodResolver - -class ApiDescriptionReaderSpec extends DocumentationContextSpec implements RequestMappingSupport { - - def "should generate an api description for each request mapping pattern"() { - given: - def operationReader = Mock(ApiOperationReader) - ApiDescriptionReader sut = - new ApiDescriptionReader(operationReader, defaultWebPlugins(), new ApiDescriptionLookup()) - - and: - plugin.pathProvider(pathProvider) - RequestMappingInfo requestMappingInfo = requestMappingInfo("/doesNotMatterForThisTest", - [patternsRequestCondition: patternsRequestCondition('/somePath/{businessId}', '/somePath/{businessId:\\d+}')] - ) - RequestMappingContext mappingContext = new RequestMappingContext( - "0", - documentationContext(), - new WebMvcRequestHandler( - Paths.ROOT, - new HandlerMethodResolver(new TypeResolver()), - requestMappingInfo, - dummyHandlerMethod())) - operationReader.read(_) >> [Mock(Operation), Mock(Operation)] - - when: - def descriptionList = sut.read(mappingContext) - - then: - descriptionList.size() == 2 - - ApiDescription apiDescription = descriptionList[0] - ApiDescription secondApiDescription = descriptionList[1] - - apiDescription.getPath() == prefix + '/somePath/{businessId}' - apiDescription.getDescription() == dummyHandlerMethod().method.name - !apiDescription.isHidden() - - secondApiDescription.getPath() == prefix + '/somePath/{businessId}' - secondApiDescription.getDescription() == dummyHandlerMethod().method.name - !secondApiDescription.isHidden() - - where: - pathProvider | prefix - new DefaultPathProvider() | "" - } - - def "should handle exceptions gracefully"() { - given: - def operationReader = Mock(ApiOperationReader) - ApiDescriptionReader sut = - new ApiDescriptionReader( - operationReader, - defaultWebPlugins(), - new ApiDescriptionLookup()) - - and: - RequestMappingInfo requestMappingInfo = requestMappingInfo( - "/doesNotMatterForThisTest", - [patternsRequestCondition: patternsRequestCondition('/somePath/{businessId}')]) - RequestMappingContext mappingContext = new RequestMappingContext( - "0", - documentationContext(), - new WebMvcRequestHandler( - Paths.ROOT, - new HandlerMethodResolver(new TypeResolver()), - requestMappingInfo, - dummyHandlerMethod())) - operationReader.read(_) >> { throw new StackOverflowError("ouch") } - - when: - def descriptionList = sut.read(mappingContext) - - then: - descriptionList.size() == 0 - } - - @Unroll("Sanitization works for #mappingPattern") - def "should sanitize request mapping endpoints"() { - expect: - Paths.sanitizeRequestMappingPattern(mappingPattern) == expected - - where: - mappingPattern | expected - "" | "/" - "/" | "/" - "/businesses" | "/businesses" - "/{businessId:\\w+}" | "/{businessId}" - "/{businessId:\\d{3}}" | "/{businessId}" - "/{businessId:\\d{3}}/{productId:\\D{3}\\d{3}}" | "/{businessId}/{productId}" - "/businesses/{businessId}" | "/businesses/{businessId}" - "/businesses/{businessId}/add" | "/businesses/{businessId}/add" - "/foo/bar:{baz}" | "/foo/bar:{baz}" - "/foo:{foo}/bar:{baz}" | "/foo:{foo}/bar:{baz}" - "/foo/bar:{baz:\\w+}" | "/foo/bar:{baz}" - "/{businessId:\\d{3}}:{productId:\\D{3}\\d{3}}" | "/{businessId}:{productId}" - "/{businessId:\\d{3}}:{productId:\\D{3}\\d{3}[(abcd){9,3}?(?!abc)?]+}" | "/{businessId}:{productId}" - } -} diff --git a/springfox-spring-webmvc/src/test/groovy/springfox/documentation/spring/web/scanners/ApiListingReferenceScannerSpec.groovy b/springfox-spring-webmvc/src/test/groovy/springfox/documentation/spring/web/scanners/ApiListingReferenceScannerSpec.groovy deleted file mode 100644 index 5e842359f30..00000000000 --- a/springfox-spring-webmvc/src/test/groovy/springfox/documentation/spring/web/scanners/ApiListingReferenceScannerSpec.groovy +++ /dev/null @@ -1,131 +0,0 @@ -/* - * - * Copyright 2015-2018 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.spring.web.scanners - -import com.fasterxml.classmate.TypeResolver -import springfox.documentation.RequestHandler -import springfox.documentation.annotations.ApiIgnore -import springfox.documentation.service.ResourceGroup - -import springfox.documentation.spring.web.WebMvcRequestHandler -import springfox.documentation.spring.web.dummy.DummyClass -import springfox.documentation.spring.web.dummy.DummyController -import springfox.documentation.spring.web.mixins.AccessorAssertions -import springfox.documentation.spring.web.mixins.RequestMappingSupport -import springfox.documentation.spring.web.paths.DefaultPathProvider -import springfox.documentation.spring.web.paths.Paths -import springfox.documentation.spring.web.plugins.DocumentationContextSpec -import springfox.documentation.spring.web.readers.operation.HandlerMethodResolver - -import static springfox.documentation.builders.PathSelectors.* -import static springfox.documentation.builders.RequestHandlerSelectors.* - -class ApiListingReferenceScannerSpec - extends DocumentationContextSpec - implements RequestMappingSupport, - AccessorAssertions { - - ApiListingReferenceScanner sut = new ApiListingReferenceScanner() - List requestHandlers - def methodResolver = new HandlerMethodResolver(new TypeResolver()) - - - def setup() { - requestHandlers = [Mock(RequestHandler)] - contextBuilder.requestHandlers(requestHandlers) - plugin - .pathProvider(new DefaultPathProvider()) - .select() - .apis(withClassAnnotation(ApiIgnore).negate()) - .paths(regex(".*?")) - .build() - } - - def "should not get expected exceptions with invalid constructor params"() { - given: - contextBuilder.requestHandlers(requestHandlers) - - when: - plugin - .groupName(groupName) - .configure(contextBuilder) - - then: - documentationContext().groupName == "default" - where: - handlerMappings | groupName | message - [requestMappingInfo("path")] | null | "resourceGroupingStrategy is required" - [requestMappingInfo("path")] | null | "groupName is required" - } - - - def "grouping of listing references using Spring grouping strategy"() { - given: - - requestHandlers = [ - new WebMvcRequestHandler( - Paths.ROOT, - methodResolver, - requestMappingInfo("/public/{businessId}"), - dummyControllerHandlerMethod()), - new WebMvcRequestHandler(Paths.ROOT, methodResolver, requestMappingInfo("/public/inventoryTypes"), dummyHandlerMethod()), - new WebMvcRequestHandler(Paths.ROOT, methodResolver, requestMappingInfo("/public/{businessId}/accounts"), dummyHandlerMethod()), - new WebMvcRequestHandler(Paths.ROOT, methodResolver, requestMappingInfo("/public/{businessId}/employees"), dummyHandlerMethod()), - new WebMvcRequestHandler(Paths.ROOT, methodResolver, requestMappingInfo("/public/{businessId}/inventory"), dummyHandlerMethod()), - new WebMvcRequestHandler(Paths.ROOT, methodResolver, requestMappingInfo("/public/{businessId}/inventory/products"), dummyHandlerMethod()) - ] - - when: - contextBuilder.requestHandlers(requestHandlers) - plugin.configure(contextBuilder) - and: - ApiListingReferenceScanResult result = sut.scan(documentationContext()) - - then: - result.resourceGroupRequestMappings.size() == 2 - result.resourceGroupRequestMappings[new ResourceGroup("dummy-controller", DummyController)].size() == 1 - result.resourceGroupRequestMappings[new ResourceGroup("dummy-class", DummyClass)].size() == 5 - } - - def "grouping of listing references using Class or Api Grouping Strategy"() { - given: - - requestHandlers = [ - new WebMvcRequestHandler(Paths.ROOT, methodResolver, requestMappingInfo("/public/{businessId}"), dummyControllerHandlerMethod()), - new WebMvcRequestHandler(Paths.ROOT, methodResolver, requestMappingInfo("/public/inventoryTypes"), dummyHandlerMethod()), - new WebMvcRequestHandler(Paths.ROOT, methodResolver, requestMappingInfo("/public/{businessId}/accounts"), dummyHandlerMethod()), - new WebMvcRequestHandler(Paths.ROOT, methodResolver, requestMappingInfo("/public/{businessId}/employees"), dummyHandlerMethod()), - new WebMvcRequestHandler(Paths.ROOT, methodResolver, requestMappingInfo("/public/{businessId}/inventory"), dummyHandlerMethod()), - new WebMvcRequestHandler(Paths.ROOT, methodResolver, requestMappingInfo("/public/{businessId}/inventory/products"), dummyHandlerMethod()) - ] - - when: - contextBuilder.requestHandlers(requestHandlers) - plugin.configure(contextBuilder) - and: - ApiListingReferenceScanResult result = sut.scan(documentationContext()) - - then: - result.resourceGroupRequestMappings.size() == 2 - result.resourceGroupRequestMappings[new ResourceGroup("dummy-controller", DummyController)].size() == 1 - result.resourceGroupRequestMappings[new ResourceGroup("dummy-class", DummyClass)].size() == 5 - } - -} \ No newline at end of file diff --git a/springfox-spring-webmvc/src/test/groovy/springfox/documentation/spring/web/scanners/ApiListingScannerSpec.groovy b/springfox-spring-webmvc/src/test/groovy/springfox/documentation/spring/web/scanners/ApiListingScannerSpec.groovy deleted file mode 100644 index b1ce4a6708f..00000000000 --- a/springfox-spring-webmvc/src/test/groovy/springfox/documentation/spring/web/scanners/ApiListingScannerSpec.groovy +++ /dev/null @@ -1,265 +0,0 @@ -/* - * - * Copyright 2015-2019 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.spring.web.scanners - -import com.fasterxml.classmate.TypeResolver -import org.springframework.web.servlet.mvc.method.RequestMappingInfo -import spock.lang.Unroll -import springfox.documentation.schema.ModelSpecification -import springfox.documentation.service.ApiListing -import springfox.documentation.service.ResourceGroup -import springfox.documentation.spi.service.ApiListingScannerPlugin -import springfox.documentation.spi.service.contexts.DocumentationContext -import springfox.documentation.spi.service.contexts.RequestMappingContext -import springfox.documentation.spi.service.contexts.SecurityContext - -import springfox.documentation.spring.web.WebMvcRequestHandler -import springfox.documentation.spring.web.dummy.Bug2219ListingScanner -import springfox.documentation.spring.web.dummy.DummyClass -import springfox.documentation.spring.web.dummy.DummyControllerWithResourcePath -import springfox.documentation.spring.web.mixins.ApiDescriptionSupport -import springfox.documentation.spring.web.mixins.AuthSupport -import springfox.documentation.spring.web.mixins.ModelProviderForServiceSupport -import springfox.documentation.spring.web.mixins.RequestMappingSupport -import springfox.documentation.spring.web.paths.Paths -import springfox.documentation.spring.web.plugins.DocumentationContextSpec -import springfox.documentation.spring.web.readers.operation.HandlerMethodResolver - -import static java.util.Collections.* -import static org.springframework.http.MediaType.* -import static springfox.documentation.builders.PathSelectors.* -import static springfox.documentation.spring.web.scanners.ApiListingScanner.* - -class ApiListingScannerSpec - extends DocumentationContextSpec - implements AuthSupport, - RequestMappingSupport, - ModelProviderForServiceSupport, - ApiDescriptionSupport { - - ApiDescriptionReader apiDescriptionReader - ApiModelReader apiModelReader - ApiListingScanningContext listingContext - ApiListingScanner scanner - def methodResolver = new HandlerMethodResolver(new TypeResolver()) - ApiModelSpecificationReader specificationReader - - def setup() { - SecurityContext securityContext = SecurityContext.builder() - .securityReferences(defaultAuth()) - .forPaths(regex('/anyPath.*')) - .build() - - plugin - .securityContexts(singletonList(securityContext)) - .configure(contextBuilder) - apiDescriptionReader = Mock(ApiDescriptionReader) - apiDescriptionReader.read(_) >> [] - apiModelReader = Mock(ApiModelReader) - apiModelReader.read(_) >> new HashMap<>() - specificationReader = Mock(ApiModelSpecificationReader) - specificationReader.read(_) >> new HashSet() - scanner = new ApiListingScanner( - apiDescriptionReader, - apiModelReader, - specificationReader, - defaultWebPlugins()) - } - - def "Should create an api listing for a single resource grouping "() { - given: - def context = documentationContext() - RequestMappingContext requestMappingContext = requestMapping(context) - listingContext = listingContext(requestMappingContext, context) - - when: - apiDescriptionReader.read(requestMappingContext) >> [] - - and: - def scanned = scanner.scan(listingContext) - - then: - scanned.containsKey("businesses") - Collection listings = scanned.get("businesses") - listings.first().consumes == [APPLICATION_JSON_VALUE, APPLICATION_XML_VALUE] as Set - listings.first().produces == [APPLICATION_JSON_VALUE] as Set - listings.first().description == 'Dummy Class' - } - - def "should assign global authorizations"() { - given: - def context = documentationContext() - def requestMappingContext = requestMapping(context) - listingContext = listingContext(requestMappingContext, context) - - when: - Map> apiListingMap = scanner.scan(listingContext) - - then: - Collection listings = apiListingMap.get('businesses') - listings.first().getSecurityReferences().size() == 0 - } - - def "Should create an api listing for an api description with no backing controller"() { - given: - plugin.groupName("different-group") - def context = documentationContext() - Map> resourceGroupRequestMappings = new HashMap<>() - listingContext = new ApiListingScanningContext(context, resourceGroupRequestMappings) - - and: - def sut = new ApiListingScanner( - apiDescriptionReader, - apiModelReader, - specificationReader, - customWebPlugins( - [], - [], - [], - [], - [], - [additionalListingsScanner()] - )) - - when: - def scanned = sut.scan(listingContext) - - then: - scanned.containsKey("different-group") - Collection listings = scanned.get("different-group") - listings.size() == 1 - listings.first().apis.first().description == 'This is a bug-fix for 2219' - } - - - def "Should not mix existing apis with apis with no backing controller"() { - given: - plugin.groupName("different-group") - def context = documentationContext() - def sut = new ApiListingScanner( - apiDescriptionReader, - apiModelReader, - specificationReader, - customWebPlugins( - [], - [], - [], - [], - [], - [additionalListingsScanner()] - )) - - and: - RequestMappingContext requestMappingContext = requestMapping(context) - listingContext = listingContext(requestMappingContext, context) - - when: - def scanned = sut.scan(listingContext) - - then: - scanned.size() == 2 - - and: - scanned.containsKey("different-group") - def differentListings = scanned.get("different-group") - differentListings.first().apis.first().description == 'This is a bug-fix for 2219' - - and: - scanned.containsKey("businesses") - def businessListings = scanned.get("businesses") - businessListings.size() == 1 - businessListings.first().description == "Dummy Class" - } - - def "should assign resource form @RequestMapping annotation"() { - given: - def context = documentationContext() - def requestMappingContext = requestMapping(context, "dummyMethod") - def resourceGroupRequestMappings = new HashMap<>() - resourceGroupRequestMappings.put( - new ResourceGroup("resourcePath", DummyControllerWithResourcePath), - [requestMappingContext]) - - listingContext = new ApiListingScanningContext(context, resourceGroupRequestMappings) - - when: - apiDescriptionReader.read(requestMappingContext) >> [] - - and: - def scanned = scanner.scan(listingContext) - - then: - scanned.containsKey("resourcePath") - Collection listings = scanned.get("resourcePath") - listings.first().resourcePath == "/resource-path" - } - - @Unroll - def "should find longest common path"() { - given: - String result = longestCommonPath(apiDescriptions(paths)).orElse(null) - - expect: - result == expected - - where: - paths | expected - [] | null - ['/a/b', '/a/b'] | '/a/b' - ['/a/b', '/a/b/c'] | '/a/b' - ['/a/b', '/a/'] | '/a' - ['/a/b', '/a/d/e/f'] | '/a' - ['/a/b/c/d/e/f', '/a', '/a/b'] | '/a' - ['/d', '/e', 'f'] | '/' - ['/a/b/c', '/a/b/c/d/e/f', '/a/b/c/d/e/f/g'] | '/a/b/c' - } - - def listingContext( - RequestMappingContext requestMappingContext, - DocumentationContext context) { - - ResourceGroup resourceGroup = new ResourceGroup("businesses", DummyClass) - Map> resourceGroupRequestMappings = new HashMap<>() - resourceGroupRequestMappings.put(resourceGroup, [requestMappingContext]) - new ApiListingScanningContext(context, resourceGroupRequestMappings) - } - - def requestMapping( - DocumentationContext context, - String methodName = "methodWithConcreteResponseBody", - String path = "/businesses") { - - RequestMappingInfo requestMappingInfo = requestMappingInfo(path) - RequestMappingContext requestMappingContext = - new RequestMappingContext( - "0", - context, - new WebMvcRequestHandler( - Paths.ROOT, - methodResolver, - requestMappingInfo, - dummyHandlerMethod(methodName))) - requestMappingContext - } - - ApiListingScannerPlugin additionalListingsScanner() { - new Bug2219ListingScanner() - } -} \ No newline at end of file diff --git a/springfox-spring-webmvc/src/test/groovy/springfox/documentation/spring/web/scanners/CachingOperationReaderSpec.groovy b/springfox-spring-webmvc/src/test/groovy/springfox/documentation/spring/web/scanners/CachingOperationReaderSpec.groovy deleted file mode 100644 index dbe12bdb400..00000000000 --- a/springfox-spring-webmvc/src/test/groovy/springfox/documentation/spring/web/scanners/CachingOperationReaderSpec.groovy +++ /dev/null @@ -1,61 +0,0 @@ -/* - * - * Copyright 2015-2018 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ -package springfox.documentation.spring.web.scanners - -import com.fasterxml.classmate.TypeResolver - -import org.springframework.web.servlet.mvc.method.RequestMappingInfo -import springfox.documentation.schema.mixins.TypesForTestingSupport -import springfox.documentation.service.Operation -import springfox.documentation.spi.service.contexts.RequestMappingContext -import springfox.documentation.spring.web.WebMvcRequestHandler -import springfox.documentation.spring.web.mixins.RequestMappingSupport -import springfox.documentation.spring.web.paths.Paths -import springfox.documentation.spring.web.plugins.DocumentationContextSpec -import springfox.documentation.spring.web.readers.operation.HandlerMethodResolver -import springfox.documentation.spring.web.readers.operation.OperationReader - -class CachingOperationReaderSpec - extends DocumentationContextSpec - implements TypesForTestingSupport, RequestMappingSupport { - def "Implementation caches the invocations"() { - given: - RequestMappingInfo requestMappingInfo = requestMappingInfo('/anyPath') - def methodResolver = new HandlerMethodResolver(new TypeResolver()) - - def context = documentationContext() - def requestMappingContext = new RequestMappingContext( - "0", - context, - new WebMvcRequestHandler(Paths.ROOT, methodResolver, - requestMappingInfo, - dummyHandlerMethod("methodWithConcreteResponseBody"))) - def mock = Mock(OperationReader) { - read(requestMappingContext) >> [anOperation()] - } - when: - def sut = new CachingOperationReader(mock) - then: - sut.read(requestMappingContext) == sut.read(requestMappingContext) - } - - def anOperation() { - Mock(Operation) - } -} diff --git a/springfox-spring-webmvc/src/test/groovy/springfox/documentation/spring/web/scanners/ResourcePathProviderSpec.groovy b/springfox-spring-webmvc/src/test/groovy/springfox/documentation/spring/web/scanners/ResourcePathProviderSpec.groovy deleted file mode 100644 index 635645f5bda..00000000000 --- a/springfox-spring-webmvc/src/test/groovy/springfox/documentation/spring/web/scanners/ResourcePathProviderSpec.groovy +++ /dev/null @@ -1,30 +0,0 @@ -package springfox.documentation.spring.web.scanners - -import spock.lang.Specification -import spock.lang.Unroll -import springfox.documentation.service.ResourceGroup -import springfox.documentation.spring.web.dummy.DummyClass -import springfox.documentation.spring.web.dummy.DummyClassWithRequestMapping -import springfox.documentation.spring.web.dummy.DummyClassWithRequestMappingWithMultipleMappings -import springfox.documentation.spring.web.dummy.DummyClassWithRequestMappingWithoutForwardSlash -import springfox.documentation.spring.web.dummy.DummyController - -class ResourcePathProviderSpec extends Specification { - @Unroll - def "Determines resource path for #clazz"() { - given: - def sut = new ResourcePathProvider(new ResourceGroup("test", clazz)) - - expect: - path == sut.resourcePath().orElse(null) - - where: - clazz | path - null | null - DummyClass | null - DummyClassWithRequestMapping | "/dummy" - DummyClassWithRequestMappingWithoutForwardSlash | "/dummy" - DummyClassWithRequestMappingWithMultipleMappings | "/dummy" - DummyController | null - } -} diff --git a/springfox-spring-webmvc/src/test/groovy/springfox/documentation/spring/web/scanners/SwaggerApiDocumentationScannerSpec.groovy b/springfox-spring-webmvc/src/test/groovy/springfox/documentation/spring/web/scanners/SwaggerApiDocumentationScannerSpec.groovy deleted file mode 100644 index 0714af3be20..00000000000 --- a/springfox-spring-webmvc/src/test/groovy/springfox/documentation/spring/web/scanners/SwaggerApiDocumentationScannerSpec.groovy +++ /dev/null @@ -1,216 +0,0 @@ -/* - * - * Copyright 2015-2018 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.spring.web.scanners - -import com.fasterxml.classmate.TypeResolver -import springfox.documentation.builders.ApiDescriptionBuilder -import springfox.documentation.builders.ApiListingBuilder -import springfox.documentation.service.ApiInfo -import springfox.documentation.service.ApiKey -import springfox.documentation.service.ApiListingReference -import springfox.documentation.service.Documentation -import springfox.documentation.service.ResourceListing -import springfox.documentation.spi.service.contexts.Defaults -import springfox.documentation.spi.service.contexts.RequestMappingContext -import springfox.documentation.spring.web.WebMvcRequestHandler -import springfox.documentation.spring.web.mixins.RequestMappingSupport -import springfox.documentation.spring.web.paths.DefaultPathProvider -import springfox.documentation.spring.web.paths.Paths -import springfox.documentation.spring.web.plugins.DocumentationContextSpec -import springfox.documentation.spring.web.readers.operation.HandlerMethodResolver - -import static springfox.documentation.builders.PathSelectors.* - -class SwaggerApiDocumentationScannerSpec extends DocumentationContextSpec implements RequestMappingSupport { - - ApiListingReferenceScanner listingReferenceScanner = Mock(ApiListingReferenceScanner) - ApiListingScanner listingScanner = Mock(ApiListingScanner) - ApiDocumentationScanner swaggerApiResourceListing = - new ApiDocumentationScanner(listingReferenceScanner, listingScanner) - - def "default swagger resource"() { - when: "I create a swagger resource" - listingReferenceScanner.scan(_) >> new ApiListingReferenceScanResult(new HashMap<>()) - listingScanner.scan(_) >> new HashMap<>() - - and: - Documentation scanned = swaggerApiResourceListing.scan(documentationContext()) - - then: "I should should have the correct defaults" - ResourceListing resourceListing = scanned.resourceListing - def apiListingReferenceList = resourceListing.getApis() - def authorizationTypes = resourceListing.getSecuritySchemes() - - scanned.groupName == "default" - resourceListing.getApiVersion() == "1.0" - - resourceListing.getInfo() != null - apiListingReferenceList == [] - authorizationTypes == [] - } - - def "resource with api info"() { - given: - ApiInfo expected = new ApiInfo("title", "description", "1.0", "terms", "contact", "license", "licenseUrl") - - when: - plugin - .groupName("groupName") - .select() - .paths(regex(".*")) - .build() - .apiInfo(expected) - .configure(contextBuilder) - listingReferenceScanner.scan(_) >> new ApiListingReferenceScanResult(new HashMap<>()) - listingScanner.scan(_) >> new HashMap<>() - - and: - Documentation scanned = swaggerApiResourceListing.scan(documentationContext()) - - then: - ApiInfo actual = scanned.getResourceListing().getInfo() - actual.getTitle() == expected.getTitle() - actual.getVersion() == expected.getVersion() - actual.getDescription() == expected.getDescription() - actual.getTermsOfServiceUrl() == expected.getTermsOfServiceUrl() - actual.getContact() == expected.getContact() - actual.getLicense() == expected.getLicense() - actual.getLicenseUrl() == expected.getLicenseUrl() - } - - def "resource with authorization types"() { - given: - ApiKey apiKey = new ApiKey("mykey", "api_key", "header",) - - when: - plugin - .groupName("groupName") - .select() - .paths(regex(".*")) - .build() - .securitySchemes([apiKey]) - .configure(contextBuilder) - listingReferenceScanner.scan(_) >> new ApiListingReferenceScanResult(new HashMap<>()) - listingScanner.scan(_) >> new HashMap<>() - - and: - Documentation scanned = swaggerApiResourceListing.scan(documentationContext()) - - then: - ResourceListing resourceListing = scanned.resourceListing - def authorizationTypes = resourceListing.getSecuritySchemes() - def apiKeyAuthType = authorizationTypes[0] - apiKeyAuthType instanceof ApiKey - apiKeyAuthType.name == "mykey" - apiKeyAuthType.keyname == "api_key" - apiKeyAuthType.passAs == "header" - } - - def "resource with mocked apis"() { - given: - DefaultPathProvider pathProvider = new DefaultPathProvider() - plugin - .groupName("groupName") - .select() - .paths(regex(".*")) - .build() - .pathProvider(pathProvider) - .configure(contextBuilder) - - RequestMappingContext requestMappingContext = new RequestMappingContext("0_0", - documentationContext(), - new WebMvcRequestHandler( - Paths.ROOT, - new HandlerMethodResolver(new TypeResolver()), - requestMappingInfo("somePath/"), dummyHandlerMethod())) - - and: - def mockListingRef = Mock(ApiListingReference) - mockListingRef.path >> "/some/path" - - when: - listingReferenceScanner.scan(_) >> - new ApiListingReferenceScanResult([resourceGroup: [requestMappingContext]]) - listingScanner.scan(_) >> new HashMap<>() - - and: - Documentation scanned = swaggerApiResourceListing.scan(documentationContext()) - scanned.resourceListing != null - - then: - scanned.groupName == "groupName" - 1 * listingReferenceScanner.scan(_) >> new ApiListingReferenceScanResult([resourceGroup: [requestMappingContext]]) - } - - def "Should sort based on position"() { - given: - def defaults = new Defaults() - def ordering = defaults.apiListingReferenceOrdering() - plugin - .groupName("groupName") - .select() - .paths(regex(".*")) - .build() - .apiListingReferenceOrdering(ordering) - .configure(contextBuilder) - - def listingsMap = new HashMap<>() - def listings = [ - apiListing(defaults, 1, "/b"), - apiListing(defaults, 2, "/c"), - apiListing(defaults, 2, "/a"), - ] - listings.each { - listingsMap.putIfAbsent("test", new LinkedList()) - listingsMap.get("test").add(it) - } - listingReferenceScanner.scan(_) >> new ApiListingReferenceScanResult(new HashMap<>()) - listingScanner.scan(_) >> listingsMap - - when: - Documentation scanned = swaggerApiResourceListing.scan(documentationContext()) - - then: - scanned.resourceListing.apis.size() == 1 - - def resourceLinkApi = scanned.resourceListing.apis.get(0) - resourceLinkApi.path == "/groupName/test" - resourceLinkApi.description.normalize() == - """Operation with path /a and position 2 - |Operation with path /b and position 1 - |Operation with path /c and position 2""".stripMargin() - - where: - index | path | position - 0 | '/b' | 0 - 1 | '/a' | 0 - 2 | '/c' | 0 - } - - def apiListing(Defaults defaults, int position, String path) { - new ApiListingBuilder(defaults.apiDescriptionOrdering()) - .position(position) - .apis([new ApiDescriptionBuilder(defaults.operationOrdering()) - .path(path) - .build()]) - .description("Operation with path $path and position $position") - .build() - } -} diff --git a/springfox-spring-webmvc/src/test/java/springfox/documentation/spring/web/WebMvcObjectMapperConfigurerIntegrationTest.java b/springfox-spring-webmvc/src/test/java/springfox/documentation/spring/web/WebMvcObjectMapperConfigurerIntegrationTest.java deleted file mode 100644 index a88b1cc41b2..00000000000 --- a/springfox-spring-webmvc/src/test/java/springfox/documentation/spring/web/WebMvcObjectMapperConfigurerIntegrationTest.java +++ /dev/null @@ -1,117 +0,0 @@ -/* - * - * Copyright 2015-2019 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ -package springfox.documentation.spring.web; - -import org.junit.Before; -import org.junit.Test; -import org.springframework.context.ApplicationListener; -import org.springframework.context.annotation.AnnotationConfigApplicationContext; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.http.converter.HttpMessageConverter; -import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter; -import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter; -import springfox.documentation.schema.configuration.ObjectMapperConfigured; - -import java.util.ArrayList; -import java.util.List; - -import static org.junit.Assert.*; - -public class WebMvcObjectMapperConfigurerIntegrationTest { - @Before - public void setup() { - TestObjectMapperListener.firedCount = 0; - } - - @Test - public void event_is_fired_when_default_rmh_is_loaded() { - - AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(TestDefaultConfig.class); - - context.getBean("defaultRmh", RequestMappingHandlerAdapter.class); - - assertEquals(TestObjectMapperListener.firedCount, 1L); - } - - @Test - public void event_is_fired_when_rmh_with_multiple_message_converters_is_loaded() { - - AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(TestMultipleConfig.class); - - context.getBean("multipleMCRmh", RequestMappingHandlerAdapter.class); - - assertEquals(TestObjectMapperListener.firedCount, 2L); - } - - static class TestObjectMapperListener implements ApplicationListener { - @SuppressWarnings("VisibilityModifier") - static long firedCount = 0; - - @Override - public void onApplicationEvent(ObjectMapperConfigured event) { - firedCount++; - } - } - - - @Configuration - static class TestDefaultConfig { - - - @Bean - public RequestMappingHandlerAdapter defaultRmh() { - return new RequestMappingHandlerAdapter(); - } - - @Bean - public static WebMvcObjectMapperConfigurer objectMapperConfigurer() { - return new WebMvcObjectMapperConfigurer(); - } - - @Bean - public static TestObjectMapperListener listener() { - return new TestObjectMapperListener(); - } - } - - @Configuration - static class TestMultipleConfig { - - @Bean - public RequestMappingHandlerAdapter multipleMCRmh() { - RequestMappingHandlerAdapter adapter = new RequestMappingHandlerAdapter(); - List> messageConverters = new ArrayList<>(); - messageConverters.add(new MappingJackson2HttpMessageConverter()); - messageConverters.add(new MappingJackson2HttpMessageConverter()); - adapter.setMessageConverters(messageConverters); - return adapter; - } - - @Bean - public static WebMvcObjectMapperConfigurer objectMapperConfigurer() { - return new WebMvcObjectMapperConfigurer(); - } - - @Bean - public static TestObjectMapperListener listener() { - return new TestObjectMapperListener(); - } - } -} \ No newline at end of file diff --git a/springfox-swagger-common/build.gradle b/springfox-swagger-common/build.gradle index 7f9204006e6..979de7a066b 100644 --- a/springfox-swagger-common/build.gradle +++ b/springfox-swagger-common/build.gradle @@ -13,7 +13,6 @@ dependencies { api project(':springfox-spi') api project(':springfox-schema') api project(':springfox-spring-web') - api project(':springfox-spring-webmvc') api libs.core api libs.spring @@ -29,11 +28,10 @@ dependencies { testImplementation project(':springfox-core').sourceSets.test.output testImplementation project(':springfox-schema').sourceSets.test.output testImplementation project(':springfox-spring-web').sourceSets.test.output - testImplementation project(':springfox-spring-webmvc').sourceSets.test.output testImplementation libs.test testImplementation "org.skyscreamer:jsonassert:${jsonAssert}" testImplementation "jakarta.servlet:jakarta.servlet-api:$servlet" testImplementation libs.clientProvided testImplementation libs.springProvidedWithMvc -} \ No newline at end of file +} diff --git a/springfox-swagger-common/gradle/wrapper/gradle-wrapper.jar b/springfox-swagger-common/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..41d9927a4d4fb3f96a785543079b8df6723c946b GIT binary patch literal 59821 zcma&NV|1p`(k7gaZQHhOJ9%QKV?D8LCmq{1JGRYE(y=?XJw0>InKkE~^UnAEs2gk5 zUVGPCwX3dOb!}xiFmPB95NK!+5D<~S0s;d1zn&lrfAn7 zC?Nb-LFlib|DTEqB8oDS5&$(u1<5;wsY!V`2F7^=IR@I9so5q~=3i_(hqqG<9SbL8Q(LqDrz+aNtGYWGJ2;p*{a-^;C>BfGzkz_@fPsK8{pTT~_VzB$E`P@> z7+V1WF2+tSW=`ZRj3&0m&d#x_lfXq`bb-Y-SC-O{dkN2EVM7@!n|{s+2=xSEMtW7( zz~A!cBpDMpQu{FP=y;sO4Le}Z)I$wuFwpugEY3vEGfVAHGqZ-<{vaMv-5_^uO%a{n zE_Zw46^M|0*dZ`;t%^3C19hr=8FvVdDp1>SY>KvG!UfD`O_@weQH~;~W=fXK_!Yc> z`EY^PDJ&C&7LC;CgQJeXH2 zjfM}2(1i5Syj)Jj4EaRyiIl#@&lC5xD{8hS4Wko7>J)6AYPC-(ROpVE-;|Z&u(o=X z2j!*>XJ|>Lo+8T?PQm;SH_St1wxQPz)b)Z^C(KDEN$|-6{A>P7r4J1R-=R7|FX*@! zmA{Ja?XE;AvisJy6;cr9Q5ovphdXR{gE_7EF`ji;n|RokAJ30Zo5;|v!xtJr+}qbW zY!NI6_Wk#6pWFX~t$rAUWi?bAOv-oL6N#1>C~S|7_e4 zF}b9(&a*gHk+4@J26&xpiWYf2HN>P;4p|TD4f586umA2t@cO1=Fx+qd@1Ae#Le>{-?m!PnbuF->g3u)7(n^llJfVI%Q2rMvetfV5 z6g|sGf}pV)3_`$QiKQnqQ<&ghOWz4_{`rA1+7*M0X{y(+?$|{n zs;FEW>YzUWg{sO*+D2l6&qd+$JJP_1Tm;To<@ZE%5iug8vCN3yH{!6u5Hm=#3HJ6J zmS(4nG@PI^7l6AW+cWAo9sFmE`VRcM`sP7X$^vQY(NBqBYU8B|n-PrZdNv8?K?kUTT3|IE`-A8V*eEM2=u*kDhhKsmVPWGns z8QvBk=BPjvu!QLtlF0qW(k+4i+?H&L*qf262G#fks9}D5-L{yiaD10~a;-j!p!>5K zl@Lh+(9D{ePo_S4F&QXv|q_yT`GIPEWNHDD8KEcF*2DdZD;=J6u z|8ICSoT~5Wd!>g%2ovFh`!lTZhAwpIbtchDc{$N%<~e$E<7GWsD42UdJh1fD($89f2on`W`9XZJmr*7lRjAA8K0!(t8-u>2H*xn5cy1EG{J;w;Q-H8Yyx+WW(qoZZM7p(KQx^2-yI6Sw?k<=lVOVwYn zY*eDm%~=|`c{tUupZ^oNwIr!o9T;H3Fr|>NE#By8SvHb&#;cyBmY1LwdXqZwi;qn8 zK+&z{{95(SOPXAl%EdJ3jC5yV^|^}nOT@M0)|$iOcq8G{#*OH7=DlfOb; z#tRO#tcrc*yQB5!{l5AF3(U4>e}nEvkoE_XCX=a3&A6Atwnr&`r&f2d%lDr8f?hBB zr1dKNypE$CFbT9I?n){q<1zHmY>C=5>9_phi79pLJG)f=#dKdQ7We8emMjwR*qIMF zE_P-T*$hX#FUa%bjv4Vm=;oxxv`B*`weqUn}K=^TXjJG=UxdFMSj-QV6fu~;- z|IsUq`#|73M%Yn;VHJUbt<0UHRzbaF{X@76=8*-IRx~bYgSf*H(t?KH=?D@wk*E{| z2@U%jKlmf~C^YxD=|&H?(g~R9-jzEb^y|N5d`p#2-@?BUcHys({pUz4Zto7XwKq2X zSB~|KQGgv_Mh@M!*{nl~2~VV_te&E7K39|WYH zCxfd|v_4!h$Ps2@atm+gj14Ru)DhivY&(e_`eA)!O1>nkGq|F-#-6oo5|XKEfF4hR z%{U%ar7Z8~B!foCd_VRHr;Z1c0Et~y8>ZyVVo9>LLi(qb^bxVkbq-Jq9IF7!FT`(- zTMrf6I*|SIznJLRtlP)_7tQ>J`Um>@pP=TSfaPB(bto$G1C zx#z0$=zNpP-~R);kM4O)9Mqn@5Myv5MmmXOJln312kq#_94)bpSd%fcEo7cD#&|<` zrcal$(1Xv(nDEquG#`{&9Ci~W)-zd_HbH-@2F6+|a4v}P!w!Q*h$#Zu+EcZeY>u&?hn#DCfC zVuye5@Ygr+T)0O2R1*Hvlt>%rez)P2wS}N-i{~IQItGZkp&aeY^;>^m7JT|O^{`78 z$KaK0quwcajja;LU%N|{`2o&QH@u%jtH+j!haGj;*ZCR*`UgOXWE>qpXqHc?g&vA& zt-?_g8k%ZS|D;()0Lf!>7KzTSo-8hUh%OA~i76HKRLudaNiwo*E9HxmzN4y>YpZNO zUE%Q|H_R_UmX=*f=2g=xyP)l-DP}kB@PX|(Ye$NOGN{h+fI6HVw`~Cd0cKqO;s6aiYLy7sl~%gs`~XaL z^KrZ9QeRA{O*#iNmB7_P!=*^pZiJ5O@iE&X2UmUCPz!)`2G3)5;H?d~3#P|)O(OQ_ zua+ZzwWGkWflk4j^Lb=x56M75_p9M*Q50#(+!aT01y80x#rs9##!;b-BH?2Fu&vx} za%4!~GAEDsB54X9wCF~juV@aU}fp_(a<`Ig0Pip8IjpRe#BR?-niYcz@jI+QY zBU9!8dAfq@%p;FX)X=E7?B=qJJNXlJ&7FBsz;4&|*z{^kEE!XbA)(G_O6I9GVzMAF z8)+Un(6od`W7O!!M=0Z)AJuNyN8q>jNaOdC-zAZ31$Iq%{c_SYZe+(~_R`a@ zOFiE*&*o5XG;~UjsuW*ja-0}}rJdd@^VnQD!z2O~+k-OSF%?hqcFPa4e{mV1UOY#J zTf!PM=KMNAzbf(+|AL%K~$ahX0Ol zbAxKu3;v#P{Qia{_WzHl`!@!8c#62XSegM{tW1nu?Ee{sQq(t{0TSq67YfG;KrZ$n z*$S-+R2G?aa*6kRiTvVxqgUhJ{ASSgtepG3hb<3hlM|r>Hr~v_DQ>|Nc%&)r0A9go z&F3Ao!PWKVq~aWOzLQIy&R*xo>}{UTr}?`)KS&2$3NR@a+>+hqK*6r6Uu-H};ZG^| zfq_Vl%YE1*uGwtJ>H*Y(Q9E6kOfLJRlrDNv`N;jnag&f<4#UErM0ECf$8DASxMFF& zK=mZgu)xBz6lXJ~WZR7OYw;4&?v3Kk-QTs;v1r%XhgzSWVf|`Sre2XGdJb}l1!a~z zP92YjnfI7OnF@4~g*LF>G9IZ5c+tifpcm6#m)+BmnZ1kz+pM8iUhwag`_gqr(bnpy zl-noA2L@2+?*7`ZO{P7&UL~ahldjl`r3=HIdo~Hq#d+&Q;)LHZ4&5zuDNug@9-uk; z<2&m#0Um`s=B}_}9s&70Tv_~Va@WJ$n~s`7tVxi^s&_nPI0`QX=JnItlOu*Tn;T@> zXsVNAHd&K?*u~a@u8MWX17VaWuE0=6B93P2IQ{S$-WmT+Yp!9eA>@n~=s>?uDQ4*X zC(SxlKap@0R^z1p9C(VKM>nX8-|84nvIQJ-;9ei0qs{}X>?f%&E#%-)Bpv_p;s4R+ z;PMpG5*rvN&l;i{^~&wKnEhT!S!LQ>udPzta#Hc9)S8EUHK=%x+z@iq!O{)*XM}aI zBJE)vokFFXTeG<2Pq}5Na+kKnu?Ch|YoxdPb&Z{07nq!yzj0=xjzZj@3XvwLF0}Pa zn;x^HW504NNfLY~w!}5>`z=e{nzGB>t4ntE>R}r7*hJF3OoEx}&6LvZz4``m{AZxC zz6V+^73YbuY>6i9ulu)2`ozP(XBY5n$!kiAE_Vf4}Ih)tlOjgF3HW|DF+q-jI_0p%6Voc^e;g28* z;Sr4X{n(X7eEnACWRGNsHqQ_OfWhAHwnSQ87@PvPcpa!xr9`9+{QRn;bh^jgO8q@v zLekO@-cdc&eOKsvXs-eMCH8Y{*~3Iy!+CANy+(WXYS&6XB$&1+tB?!qcL@@) zS7XQ|5=o1fr8yM7r1AyAD~c@Mo`^i~hjx{N17%pDX?j@2bdBEbxY}YZxz!h#)q^1x zpc_RnoC3`V?L|G2R1QbR6pI{Am?yW?4Gy`G-xBYfebXvZ=(nTD7u?OEw>;vQICdPJBmi~;xhVV zisVvnE!bxI5|@IIlDRolo_^tc1{m)XTbIX^<{TQfsUA1Wv(KjJED^nj`r!JjEA%MaEGqPB z9YVt~ol3%e`PaqjZt&-)Fl^NeGmZ)nbL;92cOeLM2H*r-zA@d->H5T_8_;Jut0Q_G zBM2((-VHy2&eNkztIpHk&1H3M3@&wvvU9+$RO%fSEa_d5-qZ!<`-5?L9lQ1@AEpo* z3}Zz~R6&^i9KfRM8WGc6fTFD%PGdruE}`X$tP_*A)_7(uI5{k|LYc-WY*%GJ6JMmw zNBT%^E#IhekpA(i zcB$!EB}#>{^=G%rQ~2;gbObT9PQ{~aVx_W6?(j@)S$&Ja1s}aLT%A*mP}NiG5G93- z_DaRGP77PzLv0s32{UFm##C2LsU!w{vHdKTM1X)}W%OyZ&{3d^2Zu-zw?fT=+zi*q z^fu6CXQ!i?=ljsqSUzw>g#PMk>(^#ejrYp(C)7+@Z1=Mw$Rw!l8c9}+$Uz;9NUO(kCd#A1DX4Lbis0k; z?~pO(;@I6Ajp}PL;&`3+;OVkr3A^dQ(j?`by@A!qQam@_5(w6fG>PvhO`#P(y~2ue zW1BH_GqUY&>PggMhhi@8kAY;XWmj>y1M@c`0v+l~l0&~Kd8ZSg5#46wTLPo*Aom-5 z>qRXyWl}Yda=e@hJ%`x=?I42(B0lRiR~w>n6p8SHN~B6Y>W(MOxLpv>aB)E<1oEcw z%X;#DJpeDaD;CJRLX%u!t23F|cv0ZaE183LXxMq*uWn)cD_ zp!@i5zsmcxb!5uhp^@>U;K>$B|8U@3$65CmhuLlZ2(lF#hHq-<<+7ZN9m3-hFAPgA zKi;jMBa*59ficc#TRbH_l`2r>z(Bm_XEY}rAwyp~c8L>{A<0@Q)j*uXns^q5z~>KI z)43=nMhcU1ZaF;CaBo>hl6;@(2#9yXZ7_BwS4u>gN%SBS<;j{{+p}tbD8y_DFu1#0 zx)h&?`_`=ti_6L>VDH3>PPAc@?wg=Omdoip5j-2{$T;E9m)o2noyFW$5dXb{9CZ?c z);zf3U526r3Fl+{82!z)aHkZV6GM@%OKJB5mS~JcDjieFaVn}}M5rtPnHQVw0Stn- zEHs_gqfT8(0b-5ZCk1%1{QQaY3%b>wU z7lyE?lYGuPmB6jnMI6s$1uxN{Tf_n7H~nKu+h7=%60WK-C&kEIq_d4`wU(*~rJsW< zo^D$-(b0~uNVgC+$J3MUK)(>6*k?92mLgpod{Pd?{os+yHr&t+9ZgM*9;dCQBzE!V zk6e6)9U6Bq$^_`E1xd}d;5O8^6?@bK>QB&7l{vAy^P6FOEO^l7wK4K=lLA45gQ3$X z=$N{GR1{cxO)j;ZxKI*1kZIT9p>%FhoFbRK;M(m&bL?SaN zzkZS9xMf={o@gpG%wE857u@9dq>UKvbaM1SNtMA9EFOp7$BjJQVkIm$wU?-yOOs{i z1^(E(WwZZG{_#aIzfpGc@g5-AtK^?Q&vY#CtVpfLbW?g0{BEX4Vlk(`AO1{-D@31J zce}#=$?Gq+FZG-SD^z)-;wQg9`qEO}Dvo+S9*PUB*JcU)@S;UVIpN7rOqXmEIerWo zP_lk!@RQvyds&zF$Rt>N#_=!?5{XI`Dbo0<@>fIVgcU*9Y+ z)}K(Y&fdgve3ruT{WCNs$XtParmvV;rjr&R(V&_#?ob1LzO0RW3?8_kSw)bjom#0; zeNllfz(HlOJw012B}rgCUF5o|Xp#HLC~of%lg+!pr(g^n;wCX@Yk~SQOss!j9f(KL zDiI1h#k{po=Irl)8N*KU*6*n)A8&i9Wf#7;HUR^5*6+Bzh;I*1cICa|`&`e{pgrdc zs}ita0AXb$c6{tu&hxmT0faMG0GFc)unG8tssRJd%&?^62!_h_kn^HU_kBgp$bSew zqu)M3jTn;)tipv9Wt4Ll#1bmO2n?^)t^ZPxjveoOuK89$oy4(8Ujw{nd*Rs*<+xFi z{k*9v%sl?wS{aBSMMWdazhs0#gX9Has=pi?DhG&_0|cIyRG7c`OBiVG6W#JjYf7-n zIQU*Jc+SYnI8oG^Q8So9SP_-w;Y00$p5+LZ{l+81>v7|qa#Cn->312n=YQd$PaVz8 zL*s?ZU*t-RxoR~4I7e^c!8TA4g>w@R5F4JnEWJpy>|m5la2b#F4d*uoz!m=i1;`L` zB(f>1fAd~;*wf%GEbE8`EA>IO9o6TdgbIC%+en!}(C5PGYqS0{pa?PD)5?ds=j9{w za9^@WBXMZ|D&(yfc~)tnrDd#*;u;0?8=lh4%b-lFPR3ItwVJp};HMdEw#SXg>f-zU zEiaj5H=jzRSy(sWVd%hnLZE{SUj~$xk&TfheSch#23)YTcjrB+IVe0jJqsdz__n{- zC~7L`DG}-Dgrinzf7Jr)e&^tdQ}8v7F+~eF*<`~Vph=MIB|YxNEtLo1jXt#9#UG5` zQ$OSk`u!US+Z!=>dGL>%i#uV<5*F?pivBH@@1idFrzVAzttp5~>Y?D0LV;8Yv`wAa{hewVjlhhBM z_mJhU9yWz9Jexg@G~dq6EW5^nDXe(sU^5{}qbd0*yW2Xq6G37f8{{X&Z>G~dUGDFu zgmsDDZZ5ZmtiBw58CERFPrEG>*)*`_B75!MDsOoK`T1aJ4GZ1avI?Z3OX|Hg?P(xy zSPgO$alKZuXd=pHP6UZy0G>#BFm(np+dekv0l6gd=36FijlT8^kI5; zw?Z*FPsibF2d9T$_L@uX9iw*>y_w9HSh8c=Rm}f>%W+8OS=Hj_wsH-^actull3c@!z@R4NQ4qpytnwMaY z)>!;FUeY?h2N9tD(othc7Q=(dF zZAX&Y1ac1~0n(z}!9{J2kPPnru1?qteJPvA2m!@3Zh%+f1VQt~@leK^$&ZudOpS!+ zw#L0usf!?Df1tB?9=zPZ@q2sG!A#9 zKZL`2cs%|Jf}wG=_rJkwh|5Idb;&}z)JQuMVCZSH9kkG%zvQO01wBN)c4Q`*xnto3 zi7TscilQ>t_SLij{@Fepen*a(`upw#RJAx|JYYXvP1v8f)dTHv9pc3ZUwx!0tOH?c z^Hn=gfjUyo!;+3vZhxNE?LJgP`qYJ`J)umMXT@b z{nU(a^xFfofcxfHN-!Jn*{Dp5NZ&i9#9r{)s^lUFCzs5LQL9~HgxvmU#W|iNs0<3O z%Y2FEgvts4t({%lfX1uJ$w{JwfpV|HsO{ZDl2|Q$-Q?UJd`@SLBsMKGjFFrJ(s?t^ z2Llf`deAe@YaGJf)k2e&ryg*m8R|pcjct@rOXa=64#V9!sp=6tC#~QvYh&M~zmJ;% zr*A}V)Ka^3JE!1pcF5G}b&jdrt;bM^+J;G^#R08x@{|ZWy|547&L|k6)HLG|sN<~o z?y`%kbfRN_vc}pwS!Zr}*q6DG7;be0qmxn)eOcD%s3Wk`=@GM>U3ojhAW&WRppi0e zudTj{ufwO~H7izZJmLJD3uPHtjAJvo6H=)&SJ_2%qRRECN#HEU_RGa(Pefk*HIvOH zW7{=Tt(Q(LZ6&WX_Z9vpen}jqge|wCCaLYpiw@f_%9+-!l{kYi&gT@Cj#D*&rz1%e z@*b1W13bN8^j7IpAi$>`_0c!aVzLe*01DY-AcvwE;kW}=Z{3RJLR|O~^iOS(dNEnL zJJ?Dv^ab++s2v!4Oa_WFDLc4fMspglkh;+vzg)4;LS{%CR*>VwyP4>1Tly+!fA-k? z6$bg!*>wKtg!qGO6GQ=cAmM_RC&hKg$~(m2LdP{{*M+*OVf07P$OHp*4SSj9H;)1p z^b1_4p4@C;8G7cBCB6XC{i@vTB3#55iRBZiml^jc4sYnepCKUD+~k}TiuA;HWC6V3 zV{L5uUAU9CdoU+qsFszEwp;@d^!6XnX~KI|!o|=r?qhs`(-Y{GfO4^d6?8BC0xonf zKtZc1C@dNu$~+p#m%JW*J7alfz^$x`U~)1{c7svkIgQ3~RK2LZ5;2TAx=H<4AjC8{ z;)}8OfkZy7pSzVsdX|wzLe=SLg$W1+`Isf=o&}npxWdVR(i8Rr{uzE516a@28VhVr zVgZ3L&X(Q}J0R2{V(}bbNwCDD5K)<5h9CLM*~!xmGTl{Mq$@;~+|U*O#nc^oHnFOy z9Kz%AS*=iTBY_bSZAAY6wXCI?EaE>8^}WF@|}O@I#i69ljjWQPBJVk zQ_rt#J56_wGXiyItvAShJpLEMtW_)V5JZAuK#BAp6bV3K;IkS zK0AL(3ia99!vUPL#j>?<>mA~Q!mC@F-9I$9Z!96ZCSJO8FDz1SP3gF~m`1c#y!efq8QN}eHd+BHwtm%M5586jlU8&e!CmOC z^N_{YV$1`II$~cTxt*dV{-yp61nUuX5z?N8GNBuZZR}Uy_Y3_~@Y3db#~-&0TX644OuG^D3w_`?Yci{gTaPWST8`LdE)HK5OYv>a=6B%R zw|}>ngvSTE1rh`#1Rey0?LXTq;bCIy>TKm^CTV4BCSqdpx1pzC3^ca*S3fUBbKMzF z6X%OSdtt50)yJw*V_HE`hnBA)1yVN3Ruq3l@lY;%Bu+Q&hYLf_Z@fCUVQY-h4M3)- zE_G|moU)Ne0TMjhg?tscN7#ME6!Rb+y#Kd&-`!9gZ06o3I-VX1d4b1O=bpRG-tDK0 zSEa9y46s7QI%LmhbU3P`RO?w#FDM(}k8T`&>OCU3xD=s5N7}w$GntXF;?jdVfg5w9OR8VPxp5{uw zD+_;Gb}@7Vo_d3UV7PS65%_pBUeEwX_Hwfe2e6Qmyq$%0i8Ewn%F7i%=CNEV)Qg`r|&+$ zP6^Vl(MmgvFq`Zb715wYD>a#si;o+b4j^VuhuN>+sNOq6Qc~Y;Y=T&!Q4>(&^>Z6* zwliz!_16EDLTT;v$@W(s7s0s zi*%p>q#t)`S4j=Ox_IcjcllyT38C4hr&mlr6qX-c;qVa~k$MG;UqdnzKX0wo0Xe-_)b zrHu1&21O$y5828UIHI@N;}J@-9cpxob}zqO#!U%Q*ybZ?BH#~^fOT_|8&xAs_rX24 z^nqn{UWqR?MlY~klh)#Rz-*%&e~9agOg*fIN`P&v!@gcO25Mec23}PhzImkdwVT|@ zFR9dYYmf&HiUF4xO9@t#u=uTBS@k*97Z!&hu@|xQnQDkLd!*N`!0JN7{EUoH%OD85 z@aQ2(w-N)1_M{;FV)C#(a4p!ofIA3XG(XZ2E#%j_(=`IWlJAHWkYM2&(+yY|^2TB0 z>wfC-+I}`)LFOJ%KeBb1?eNxGKeq?AI_eBE!M~$wYR~bB)J3=WvVlT8ZlF2EzIFZt zkaeyj#vmBTGkIL9mM3cEz@Yf>j=82+KgvJ-u_{bBOxE5zoRNQW3+Ahx+eMGem|8xo zL3ORKxY_R{k=f~M5oi-Z>5fgqjEtzC&xJEDQ@`<)*Gh3UsftBJno-y5Je^!D?Im{j za*I>RQ=IvU@5WKsIr?kC$DT+2bgR>8rOf3mtXeMVB~sm%X7W5`s=Tp>FR544tuQ>9qLt|aUSv^io&z93luW$_OYE^sf8DB?gx z4&k;dHMWph>Z{iuhhFJr+PCZ#SiZ9e5xM$A#0yPtVC>yk&_b9I676n|oAH?VeTe*1 z@tDK}QM-%J^3Ns6=_vh*I8hE?+=6n9nUU`}EX|;Mkr?6@NXy8&B0i6h?7%D=%M*Er zivG61Wk7e=v;<%t*G+HKBqz{;0Biv7F+WxGirONRxJij zon5~(a`UR%uUzfEma99QGbIxD(d}~oa|exU5Y27#4k@N|=hE%Y?Y3H%rcT zHmNO#ZJ7nPHRG#y-(-FSzaZ2S{`itkdYY^ZUvyw<7yMBkNG+>$Rfm{iN!gz7eASN9-B3g%LIEyRev|3)kSl;JL zX7MaUL_@~4ot3$woD0UA49)wUeu7#lj77M4ar8+myvO$B5LZS$!-ZXw3w;l#0anYz zDc_RQ0Ome}_i+o~H=CkzEa&r~M$1GC!-~WBiHiDq9Sdg{m|G?o7g`R%f(Zvby5q4; z=cvn`M>RFO%i_S@h3^#3wImmWI4}2x4skPNL9Am{c!WxR_spQX3+;fo!y(&~Palyjt~Xo0uy6d%sX&I`e>zv6CRSm)rc^w!;Y6iVBb3x@Y=`hl9jft zXm5vilB4IhImY5b->x{!MIdCermpyLbsalx8;hIUia%*+WEo4<2yZ6`OyG1Wp%1s$ zh<|KrHMv~XJ9dC8&EXJ`t3ETz>a|zLMx|MyJE54RU(@?K&p2d#x?eJC*WKO9^d17# zdTTKx-Os3k%^=58Sz|J28aCJ}X2-?YV3T7ee?*FoDLOC214J4|^*EX`?cy%+7Kb3(@0@!Q?p zk>>6dWjF~y(eyRPqjXqDOT`4^Qv-%G#Zb2G?&LS-EmO|ixxt79JZlMgd^~j)7XYQ; z62rGGXA=gLfgy{M-%1gR87hbhxq-fL)GSfEAm{yLQP!~m-{4i_jG*JsvUdqAkoc#q6Yd&>=;4udAh#?xa2L z7mFvCjz(hN7eV&cyFb%(U*30H@bQ8-b7mkm!=wh2|;+_4vo=tyHPQ0hL=NR`jbsSiBWtG ztMPPBgHj(JTK#0VcP36Z`?P|AN~ybm=jNbU=^3dK=|rLE+40>w+MWQW%4gJ`>K!^- zx4kM*XZLd(E4WsolMCRsdvTGC=37FofIyCZCj{v3{wqy4OXX-dZl@g`Dv>p2`l|H^ zS_@(8)7gA62{Qfft>vx71stILMuyV4uKb7BbCstG@|e*KWl{P1$=1xg(7E8MRRCWQ1g)>|QPAZot~|FYz_J0T+r zTWTB3AatKyUsTXR7{Uu) z$1J5SSqoJWt(@@L5a)#Q6bj$KvuC->J-q1!nYS6K5&e7vNdtj- zj9;qwbODLgIcObqNRGs1l{8>&7W?BbDd!87=@YD75B2ep?IY|gE~t)$`?XJ45MG@2 zz|H}f?qtEb_p^Xs$4{?nA=Qko3Lc~WrAS`M%9N60FKqL7XI+v_5H-UDiCbRm`fEmv z$pMVH*#@wQqml~MZe+)e4Ts3Gl^!Z0W3y$;|9hI?9(iw29b7en0>Kt2pjFXk@!@-g zTb4}Kw!@u|V!wzk0|qM*zj$*-*}e*ZXs#Y<6E_!BR}3^YtjI_byo{F+w9H9?f%mnBh(uE~!Um7)tgp2Ye;XYdVD95qt1I-fc@X zXHM)BfJ?^g(s3K|{N8B^hamrWAW|zis$`6|iA>M-`0f+vq(FLWgC&KnBDsM)_ez1# zPCTfN8{s^K`_bum2i5SWOn)B7JB0tzH5blC?|x;N{|@ch(8Uy-O{B2)OsfB$q0@FR z27m3YkcVi$KL;;4I*S;Z#6VfZcZFn!D2Npv5pio)sz-`_H*#}ROd7*y4i(y(YlH<4 zh4MmqBe^QV_$)VvzWgMXFy`M(vzyR2u!xx&%&{^*AcVLrGa8J9ycbynjKR~G6zC0e zlEU>zt7yQtMhz>XMnz>ewXS#{Bulz$6HETn?qD5v3td>`qGD;Y8&RmkvN=24=^6Q@DYY zxMt}uh2cSToMkkIWo1_Lp^FOn$+47JXJ*#q=JaeiIBUHEw#IiXz8cStEsw{UYCA5v_%cF@#m^Y!=+qttuH4u}r6gMvO4EAvjBURtLf& z6k!C|OU@hv_!*qear3KJ?VzVXDKqvKRtugefa7^^MSWl0fXXZR$Xb!b6`eY4A1#pk zAVoZvb_4dZ{f~M8fk3o?{xno^znH1t;;E6K#9?erW~7cs%EV|h^K>@&3Im}c7nm%Y zbLozFrwM&tSNp|46)OhP%MJ(5PydzR>8)X%i3!^L%3HCoCF#Y0#9vPI5l&MK*_ z6G8Y>$`~c)VvQle_4L_AewDGh@!bKkJeEs_NTz(yilnM!t}7jz>fmJb89jQo6~)%% z@GNIJ@AShd&K%UdQ5vR#yT<-goR+D@Tg;PuvcZ*2AzSWN&wW$Xc+~vW)pww~O|6hL zBxX?hOyA~S;3rAEfI&jmMT4f!-eVm%n^KF_QT=>!A<5tgXgi~VNBXqsFI(iI$Tu3x0L{<_-%|HMG4Cn?Xs zq~fvBhu;SDOCD7K5(l&i7Py-;Czx5byV*3y%#-Of9rtz?M_owXc2}$OIY~)EZ&2?r zLQ(onz~I7U!w?B%LtfDz)*X=CscqH!UE=mO?d&oYvtj|(u)^yomS;Cd>Men|#2yuD zg&tf(*iSHyo;^A03p&_j*QXay9d}qZ0CgU@rnFNDIT5xLhC5_tlugv()+w%`7;ICf z>;<#L4m@{1}Og76*e zHWFm~;n@B1GqO8s%=qu)+^MR|jp(ULUOi~v;wE8SB6^mK@adSb=o+A_>Itjn13AF& zDZe+wUF9G!JFv|dpj1#d+}BO~s*QTe3381TxA%Q>P*J#z%( z5*8N^QWxgF73^cTKkkvgvIzf*cLEyyKw)Wf{#$n{uS#(rAA~>TS#!asqQ2m_izXe3 z7$Oh=rR;sdmVx3G)s}eImsb<@r2~5?vcw*Q4LU~FFh!y4r*>~S7slAE6)W3Up2OHr z2R)+O<0kKo<3+5vB}v!lB*`%}gFldc+79iahqEx#&Im@NCQU$@PyCZbcTt?K{;o@4 z312O9GB)?X&wAB}*-NEU zn@6`)G`FhT8O^=Cz3y+XtbwO{5+{4-&?z!esFts-C zypwgI^4#tZ74KC+_IW|E@kMI=1pSJkvg$9G3Va(!reMnJ$kcMiZ=30dTJ%(Ws>eUf z;|l--TFDqL!PZbLc_O(XP0QornpP;!)hdT#Ts7tZ9fcQeH&rhP_1L|Z_ha#JOroe^qcsLi`+AoBWHPM7}gD z+mHuPXd14M?nkp|nu9G8hPk;3=JXE-a204Fg!BK|$MX`k-qPeD$2OOqvF;C(l8wm13?>i(pz7kRyYm zM$IEzf`$}B%ezr!$(UO#uWExn%nTCTIZzq&8@i8sP#6r8 z*QMUzZV(LEWZb)wbmf|Li;UpiP;PlTQ(X4zreD`|`RG!7_wc6J^MFD!A=#K*ze>Jg z?9v?p(M=fg_VB0+c?!M$L>5FIfD(KD5ku*djwCp+5GVIs9^=}kM2RFsxx0_5DE%BF zykxwjWvs=rbi4xKIt!z$&v(`msFrl4n>a%NO_4`iSyb!UiAE&mDa+apc zPe)#!ToRW~rqi2e1bdO1RLN5*uUM@{S`KLJhhY-@TvC&5D(c?a(2$mW-&N%h5IfEM zdFI6`6KJiJQIHvFiG-34^BtO3%*$(-Ht_JU*(KddiUYoM{coadlG&LVvke&*p>Cac z^BPy2Zteiq1@ulw0e)e*ot7@A$RJui0$l^{lsCt%R;$){>zuRv9#w@;m=#d%%TJmm zC#%eFOoy$V)|3*d<OC1iP+4R7D z8FE$E8l2Y?(o-i6wG=BKBh0-I?i3WF%hqdD7VCd;vpk|LFP!Et8$@voH>l>U8BY`Q zC*G;&y6|!p=7`G$*+hxCv!@^#+QD3m>^azyZoLS^;o_|plQaj-wx^ zRV&$HcY~p)2|Zqp0SYU?W3zV87s6JP-@D~$t0 zvd;-YL~JWc*8mtHz_s(cXus#XYJc5zdC=&!4MeZ;N3TQ>^I|Pd=HPjVP*j^45rs(n zzB{U4-44=oQ4rNN6@>qYVMH4|GmMIz#z@3UW-1_y#eNa+Q%(41oJ5i(DzvMO^%|?L z^r_+MZtw0DZ0=BT-@?hUtA)Ijk~Kh-N8?~X5%KnRH7cb!?Yrd8gtiEo!v{sGrQk{X zvV>h{8-DqTyuAxIE(hb}jMVtga$;FIrrKm>ye5t%M;p!jcH1(Bbux>4D#MVhgZGd> z=c=nVb%^9T?iDgM&9G(mV5xShc-lBLi*6RShenDqB%`-2;I*;IHg6>#ovKQ$M}dDb z<$USN%LMqa5_5DR7g7@(oAoQ%!~<1KSQr$rmS{UFQJs5&qBhgTEM_Y7|0Wv?fbP`z z)`8~=v;B)+>Jh`V*|$dTxKe`HTBkho^-!!K#@i{9FLn-XqX&fQcGsEAXp)BV7(`Lk zC{4&+Pe-0&<)C0kAa(MTnb|L;ZB5i|b#L1o;J)+?SV8T*U9$Vxhy}dm3%!A}SK9l_6(#5(e*>8|;4gNKk7o_%m_ zEaS=Z(ewk}hBJ>v`jtR=$pm_Wq3d&DU+6`BACU4%qdhH1o^m8hT2&j<4Z8!v=rMCk z-I*?48{2H*&+r<{2?wp$kh@L@=rj8c`EaS~J>W?)trc?zP&4bsNagS4yafuDoXpi5`!{BVqJ1$ZC3`pf$`LIZ(`0&Ik+!_Xa=NJW`R2 zd#Ntgwz`JVwC4A61$FZ&kP)-{T|rGO59`h#1enAa`cWxRR8bKVvvN6jBzAYePrc&5 z+*zr3en|LYB2>qJp479rEALk5d*X-dfKn6|kuNm;2-U2+P3_rma!nWjZQ-y*q3JS? zBE}zE-!1ZBR~G%v!$l#dZ*$UV4$7q}xct}=on+Ba8{b>Y9h*f-GW0D0o#vJ0%ALg( ztG2+AjWlG#d;myA(i&dh8Gp?y9HD@`CTaDAy?c&0unZ%*LbLIg4;m{Kc?)ws3^>M+ zt5>R)%KIJV*MRUg{0$#nW=Lj{#8?dD$yhjBOrAeR#4$H_Dc(eyA4dNjZEz1Xk+Bqt zB&pPl+?R{w8GPv%VI`x`IFOj320F1=cV4aq0(*()Tx!VVxCjua;)t}gTr=b?zY+U! zkb}xjXZ?hMJN{Hjw?w&?gz8Ow`htX z@}WG*_4<%ff8(!S6bf3)p+8h2!Rory>@aob$gY#fYJ=LiW0`+~l7GI%EX_=8 z{(;0&lJ%9)M9{;wty=XvHbIx|-$g4HFij`J$-z~`mW)*IK^MWVN+*>uTNqaDmi!M8 zurj6DGd)g1g(f`A-K^v)3KSOEoZXImXT06apJum-dO_%oR)z6Bam-QC&CNWh7kLOE zcxLdVjYLNO2V?IXWa-ys30Jbxw(Xm?U1{4kDs9`gZQHh8X{*w9=H&Zz&-6RL?uq#R zxN+k~JaL|gdsdvY_u6}}MHC?a@ElFeipA1Lud#M~)pp2SnG#K{a@tSpvXM;A8gz9> zRVDV5T1%%!LsNRDOw~LIuiAiKcj<%7WpgjP7G6mMU1#pFo6a-1>0I5ZdhxnkMX&#L z=Vm}?SDlb_LArobqpnU!WLQE*yVGWgs^4RRy4rrJwoUUWoA~ZJUx$mK>J6}7{CyC4 zv=8W)kKl7TmAnM%m;anEDPv5tzT{A{ON9#FPYF6c=QIc*OrPp96tiY&^Qs+#A1H>Y z<{XtWt2eDwuqM zQ_BI#UIP;2-olOL4LsZ`vTPv-eILtuB7oWosoSefWdM}BcP>iH^HmimR`G`|+9waCO z&M375o@;_My(qYvPNz;N8FBZaoaw3$b#x`yTBJLc8iIP z--la{bzK>YPP|@Mke!{Km{vT8Z4|#An*f=EmL34?!GJfHaDS#41j~8c5KGKmj!GTh&QIH+DjEI*BdbSS2~6VTt}t zhAwNQNT6%c{G`If3?|~Fp7iwee(LaUS)X9@I29cIb61} z$@YBq4hSplr&liE@ye!y&7+7n$fb+8nS~co#^n@oCjCwuKD61x$5|0ShDxhQES5MP z(gH|FO-s6#$++AxnkQR!3YMgKcF)!&aqr^a3^{gAVT`(tY9@tqgY7@ z>>ul3LYy`R({OY7*^Mf}UgJl(N7yyo$ag;RIpYHa_^HKx?DD`%Vf1D0s^ zjk#OCM5oSzuEz(7X`5u~C-Y~n4B}_3*`5B&8tEdND@&h;H{R`o%IFpIJ4~Kw!kUjehGT8W!CD7?d8sg_$KKp%@*dW)#fI1#R<}kvzBVpaog_2&W%c_jJfP` z6)wE+$3+Hdn^4G}(ymPyasc1<*a7s2yL%=3LgtZLXGuA^jdM^{`KDb%%}lr|ONDsl zy~~jEuK|XJ2y<`R{^F)Gx7DJVMvpT>gF<4O%$cbsJqK1;v@GKXm*9l3*~8^_xj*Gs z=Z#2VQ6`H@^~#5Pv##@CddHfm;lbxiQnqy7AYEH(35pTg^;u&J2xs-F#jGLuDw2%z z`a>=0sVMM+oKx4%OnC9zWdbpq*#5^yM;og*EQKpv`^n~-mO_vj=EgFxYnga(7jO?G z`^C87B4-jfB_RgN2FP|IrjOi;W9AM1qS}9W@&1a9Us>PKFQ9~YE!I~wTbl!m3$Th? z)~GjFxmhyyGxN}t*G#1^KGVXm#o(K0xJyverPe}mS=QgJ$#D}emQDw+dHyPu^&Uv> z4O=3gK*HLFZPBY|!VGq60Of6QrAdj`nj1h!$?&a;Hgaj{oo{l0P3TzpJK_q_eW8Ng zP6QF}1{V;xlolCs?pGegPoCSxx@bshb#3ng4Fkp4!7B0=&+1%187izf@}tvsjZ6{m z4;K>sR5rm97HJrJ`w}Y`-MZN$Wv2N%X4KW(N$v2@R1RkRJH2q1Ozs0H`@ zd5)X-{!{<+4Nyd=hQ8Wm3CCd}ujm*a?L79ztfT7@&(?B|!pU5&%9Rl!`i;suAg0+A zxb&UYpo-z}u6CLIndtH~C|yz&!OV_I*L;H#C7ie_5uB1fNRyH*<^d=ww=gxvE%P$p zRHKI{^{nQlB9nLhp9yj-so1is{4^`{Xd>Jl&;dX;J)#- z=fmE5GiV?-&3kcjM1+XG7&tSq;q9Oi4NUuRrIpoyp*Fn&nVNFdUuGQ_g)g>VzXGdneB7`;!aTUE$t* z5iH+8XPxrYl)vFo~+vmcU-2) zq!6R(T0SsoDnB>Mmvr^k*{34_BAK+I=DAGu){p)(ndZqOFT%%^_y;X(w3q-L``N<6 zw9=M zoQ8Lyp>L_j$T20UUUCzYn2-xdN}{e@$8-3vLDN?GbfJ>7*qky{n!wC#1NcYQr~d51 zy;H!am=EI#*S&TCuP{FA3CO)b0AAiN*tLnDbvKwxtMw-l;G2T@EGH)YU?-B`+Y=!$ zypvDn@5V1Tr~y~U0s$ee2+CL3xm_BmxD3w}d_Pd@S%ft#v~_j;6sC6cy%E|dJy@wj z`+(YSh2CrXMxI;yVy*=O@DE2~i5$>nuzZ$wYHs$y`TAtB-ck4fQ!B8a;M=CxY^Nf{ z+UQhn0jopOzvbl(uZZ1R-(IFaprC$9hYK~b=57@ zAJ8*pH%|Tjotzu5(oxZyCQ{5MAw+6L4)NI!9H&XM$Eui-DIoDa@GpNI=I4}m>Hr^r zZjT?xDOea}7cq+TP#wK1p3}sbMK{BV%(h`?R#zNGIP+7u@dV5#zyMau+w}VC1uQ@p zrFUjrJAx6+9%pMhv(IOT52}Dq{B9njh_R`>&j&5Sbub&r*hf4es)_^FTYdDX$8NRk zMi=%I`)hN@N9>X&Gu2RmjKVsUbU>TRUM`gwd?CrL*0zxu-g#uNNnnicYw=kZ{7Vz3 zULaFQ)H=7%Lm5|Z#k?<{ux{o4T{v-e zTLj?F(_qp{FXUzOfJxEyKO15Nr!LQYHF&^jMMBs z`P-}WCyUYIv>K`~)oP$Z85zZr4gw>%aug1V1A)1H(r!8l&5J?ia1x_}Wh)FXTxZUE zs=kI}Ix2cK%Bi_Hc4?mF^m`sr6m8M(n?E+k7Tm^Gn}Kf= zfnqoyVU^*yLypz?s+-XV5(*oOBwn-uhwco5b(@B(hD|vtT8y7#W{>RomA_KchB&Cd zcFNAD9mmqR<341sq+j+2Ra}N5-3wx5IZqg6Wmi6CNO#pLvYPGNER}Q8+PjvIJ42|n zc5r@T*p)R^U=d{cT2AszQcC6SkWiE|hdK)m{7ul^mU+ED1R8G#)#X}A9JSP_ubF5p z8Xxcl;jlGjPwow^p+-f_-a~S;$lztguPE6SceeUCfmRo=Qg zKHTY*O_ z;pXl@z&7hniVYVbGgp+Nj#XP^Aln2T!D*{(Td8h{8Dc?C)KFfjPybiC`Va?Rf)X>y z;5?B{bAhPtbmOMUsAy2Y0RNDQ3K`v`gq)#ns_C&ec-)6cq)d^{5938T`Sr@|7nLl; zcyewuiSUh7Z}q8iIJ@$)L3)m)(D|MbJm_h&tj^;iNk%7K-YR}+J|S?KR|29K?z-$c z<+C4uA43yfSWBv*%z=-0lI{ev`C6JxJ};A5N;lmoR(g{4cjCEn33 z-ef#x^uc%cM-f^_+*dzE?U;5EtEe;&8EOK^K}xITa?GH`tz2F9N$O5;)`Uof4~l+t z#n_M(KkcVP*yMYlk_~5h89o zlf#^qjYG8Wovx+f%x7M7_>@r7xaXa2uXb?_*=QOEe_>ErS(v5-i)mrT3&^`Oqr4c9 zDjP_6T&NQMD`{l#K&sHTm@;}ed_sQ88X3y`ON<=$<8Qq{dOPA&WAc2>EQ+U8%>yWR zK%(whl8tB;{C)yRw|@Gn4%RhT=bbpgMZ6erACc>l5^p)9tR`(2W-D*?Ph6;2=Fr|G- zdF^R&aCqyxqWy#P7#G8>+aUG`pP*ow93N=A?pA=aW0^^+?~#zRWcf_zlKL8q8-80n zqGUm=S8+%4_LA7qrV4Eq{FHm9#9X15%ld`@UKyR7uc1X*>Ebr0+2yCye6b?i=r{MPoqnTnYnq z^?HWgl+G&@OcVx4$(y;{m^TkB5Tnhx2O%yPI=r*4H2f_6Gfyasq&PN^W{#)_Gu7e= zVHBQ8R5W6j;N6P3O(jsRU;hkmLG(Xs_8=F&xh@`*|l{~0OjUVlgm z7opltSHg7Mb%mYamGs*v1-#iW^QMT**f+Nq*AzIvFT~Ur3KTD26OhIw1WQsL(6nGg znHUo-4e15cXBIiyqN};5ydNYJ6zznECVVR44%(P0oW!yQ!YH)FPY?^k{IrtrLo7Zo`?sg%%oMP9E^+H@JLXicr zi?eoI?LODRPcMLl90MH32rf8btf69)ZE~&4d%(&D{C45egC6bF-XQ;6QKkbmqW>_H z{86XDZvjiN2wr&ZPfi;^SM6W+IP0);50m>qBhzx+docpBkkiY@2bSvtPVj~E`CfEu zhQG5G>~J@dni5M5Jmv7GD&@%UR`k3ru-W$$onI259jM&nZ)*d3QFF?Mu?{`+nVzkx z=R*_VH=;yeU?9TzQ3dP)q;P)4sAo&k;{*Eky1+Z!10J<(cJC3zY9>bP=znA=<-0RR zMnt#<9^X7BQ0wKVBV{}oaV=?JA=>R0$az^XE%4WZcA^Em>`m_obQyKbmf-GA;!S-z zK5+y5{xbkdA?2NgZ0MQYF-cfOwV0?3Tzh8tcBE{u%Uy?Ky4^tn^>X}p>4&S(L7amF zpWEio8VBNeZ=l!%RY>oVGOtZh7<>v3?`NcHlYDPUBRzgg z0OXEivCkw<>F(>1x@Zk=IbSOn+frQ^+jI*&qdtf4bbydk-jgVmLAd?5ImK+Sigh?X zgaGUlbf^b-MH2@QbqCawa$H1Vb+uhu{zUG9268pa{5>O&Vq8__Xk5LXDaR1z$g;s~;+Ae82wq#l;wo08tX(9uUX6NJWq1vZLh3QbP$# zL`udY|Qp*4ER`_;$%)2 zmcJLj|FD`(;ts0bD{}Ghq6UAVpEm#>j`S$wHi0-D_|)bEZ}#6) zIiqH7Co;TB`<6KrZi1SF9=lO+>-_3=Hm%Rr7|Zu-EzWLSF{9d(H1v*|UZDWiiqX3} zmx~oQ6%9~$=KjPV_ejzz7aPSvTo+3@-a(OCCoF_u#2dHY&I?`nk zQ@t8#epxAv@t=RUM09u?qnPr6=Y5Pj;^4=7GJ`2)Oq~H)2V)M1sC^S;w?hOB|0zXT zQdf8$)jslO>Q}(4RQ$DPUF#QUJm-k9ysZFEGi9xN*_KqCs9Ng(&<;XONBDe1Joku? z*W!lx(i&gvfXZ4U(AE@)c0FI2UqrFLOO$&Yic|`L;Vyy-kcm49hJ^Mj^H9uY8Fdm2 z?=U1U_5GE_JT;Tx$2#I3rAAs(q@oebIK=19a$N?HNQ4jw0ljtyGJ#D}z3^^Y=hf^Bb--297h6LQxi0-`TB|QY2QPg92TAq$cEQdWE ze)ltSTVMYe0K4wte6;^tE+^>|a>Hit_3QDlFo!3Jd`GQYTwlR#{<^MzG zK!vW&))~RTKq4u29bc<+VOcg7fdorq-kwHaaCQe6tLB{|gW1_W_KtgOD0^$^|`V4C# z*D_S9Dt_DIxpjk3my5cBFdiYaq||#0&0&%_LEN}BOxkb3v*d$4L|S|z z!cZZmfe~_Y`46v=zul=aixZTQCOzb(jx>8&a%S%!(;x{M2!*$od2!Pwfs>RZ-a%GOZdO88rS)ZW~{$656GgW)$Q=@!x;&Nn~!K)lr4gF*%qVO=hlodHA@2)keS2 zC}7O=_64#g&=zY?(zhzFO3)f5=+`dpuyM!Q)zS&otpYB@hhn$lm*iK2DRt+#1n|L%zjM}nB*$uAY^2JIw zV_P)*HCVq%F))^)iaZD#R9n^{sAxBZ?Yvi1SVc*`;8|F2X%bz^+s=yS&AXjysDny)YaU5RMotF-tt~FndTK ziRve_5b!``^ZRLG_ks}y_ye0PKyKQSsQCJuK5()b2ThnKPFU?An4;dK>)T^4J+XjD zEUsW~H?Q&l%K4<1f5^?|?lyCQe(O3?!~OU{_Wxs#|Ff8?a_WPQUKvP7?>1()Cy6oLeA zjEF^d#$6Wb${opCc^%%DjOjll%N2=GeS6D-w=Ap$Ux2+0v#s#Z&s6K*)_h{KFfgKjzO17@p1nKcC4NIgt+3t}&}F z@cV; zZ1r#~?R@ZdSwbFNV(fFl2lWI(Zf#nxa<6f!nBZD>*K)nI&Fun@ngq@Ge!N$O< zySt*mY&0moUXNPe~Fg=%gIu)tJ;asscQ!-AujR@VJBRoNZNk;z4hs4T>Ud!y=1NwGs-k zlTNeBOe}=)Epw=}+dfX;kZ32h$t&7q%Xqdt-&tlYEWc>>c3(hVylsG{Ybh_M8>Cz0ZT_6B|3!_(RwEJus9{;u-mq zW|!`{BCtnao4;kCT8cr@yeV~#rf76=%QQs(J{>Mj?>aISwp3{^BjBO zLV>XSRK+o=oVDBnbv?Y@iK)MiFSl{5HLN@k%SQZ}yhPiu_2jrnI?Kk?HtCv>wN$OM zSe#}2@He9bDZ27hX_fZey=64#SNU#1~=icK`D>a;V-&Km>V6ZdVNj7d2 z-NmAoOQm_aIZ2lXpJhlUeJ95eZt~4_S zIfrDs)S$4UjyxKSaTi#9KGs2P zfSD>(y~r+bU4*#|r`q+be_dopJzKK5JNJ#rR978ikHyJKD>SD@^Bk$~D0*U38Y*IpYcH>aaMdZq|YzQ-Ixd(_KZK!+VL@MWGl zG!k=<%Y-KeqK%``uhx}0#X^@wS+mX@6Ul@90#nmYaKh}?uw>U;GS4fn3|X%AcV@iY z8v+ePk)HxSQ7ZYDtlYj#zJ?5uJ8CeCg3efmc#|a%2=u>+vrGGRg$S@^mk~0f;mIu! zWMA13H1<@hSOVE*o0S5D8y=}RiL#jQpUq42D}vW$z*)VB*FB%C?wl%(3>ANaY)bO@ zW$VFutemwy5Q*&*9HJ603;mJJkB$qp6yxNOY0o_4*y?2`qbN{m&*l{)YMG_QHXXa2 z+hTmlA;=mYwg{Bfusl zyF&}ib2J;#q5tN^e)D62fWW*Lv;Rnb3GO-JVtYG0CgR4jGujFo$Waw zSNLhc{>P~>{KVZE1Vl1!z)|HFuN@J7{`xIp_)6>*5Z27BHg6QIgqLqDJTmKDM+ON* zK0Fh=EG`q13l z+m--9UH0{ZGQ%j=OLO8G2WM*tgfY}bV~>3Grcrpehjj z6Xe<$gNJyD8td3EhkHjpKk}7?k55Tu7?#;5`Qcm~ki;BeOlNr+#PK{kjV>qfE?1No zMA07}b>}Dv!uaS8Hym0TgzxBxh$*RX+Fab6Gm02!mr6u}f$_G4C|^GSXJMniy^b`G z74OC=83m0G7L_dS99qv3a0BU({t$zHQsB-RI_jn1^uK9ka_%aQuE2+~J2o!7`735Z zb?+sTe}Gd??VEkz|KAPMfj(1b{om89p5GIJ^#Aics_6DD%WnNGWAW`I<7jT|Af|8g zZA0^)`p8i#oBvX2|I&`HC8Pn&0>jRuMF4i0s=}2NYLmgkZb=0w9tvpnGiU-gTUQhJ zR6o4W6ZWONuBZAiN77#7;TR1^RKE(>>OL>YU`Yy_;5oj<*}ac99DI(qGCtn6`949f ziMpY4k>$aVfffm{dNH=-=rMg|u?&GIToq-u;@1-W&B2(UOhC-O2N5_px&cF-C^tWp zXvChm9@GXEcxd;+Q6}u;TKy}$JF$B`Ty?|Y3tP$N@Rtoy(*05Wj-Ks32|2y2ZM>bM zi8v8E1os!yorR!FSeP)QxtjIKh=F1ElfR8U7StE#Ika;h{q?b?Q+>%78z^>gTU5+> zxQ$a^rECmETF@Jl8fg>MApu>btHGJ*Q99(tMqsZcG+dZ6Yikx7@V09jWCiQH&nnAv zY)4iR$Ro223F+c3Q%KPyP9^iyzZsP%R%-i^MKxmXQHnW6#6n7%VD{gG$E;7*g86G< zu$h=RN_L2(YHO3@`B<^L(q@^W_0#U%mLC9Q^XEo3LTp*~(I%?P_klu-c~WJxY1zTI z^PqntLIEmdtK~E-v8yc&%U+jVxW5VuA{VMA4Ru1sk#*Srj0Pk#tZuXxkS=5H9?8eb z)t38?JNdP@#xb*yn=<*_pK9^lx%;&yH6XkD6-JXgdddZty8@Mfr9UpGE!I<37ZHUe z_Rd+LKsNH^O)+NW8Ni-V%`@J_QGKA9ZCAMSnsN>Ych9VW zCE7R_1FVy}r@MlkbxZ*TRIGXu`ema##OkqCM9{wkWQJg^%3H${!vUT&vv2250jAWN zw=h)C!b2s`QbWhBMSIYmWqZ_~ReRW;)U#@C&ThctSd_V!=HA=kdGO-Hl57an|M1XC?~3f0{7pyjWY}0mChU z2Fj2(B*r(UpCKm-#(2(ZJD#Y|Or*Vc5VyLpJ8gO1;fCm@EM~{DqpJS5FaZ5%|ALw) zyumBl!i@T57I4ITCFmdbxhaOYud}i!0YkdiNRaQ%5$T5>*HRBhyB~<%-5nj*b8=i= z(8g(LA50%0Zi_eQe}Xypk|bt5e6X{aI^jU2*c?!p*$bGk=?t z+17R){lx~Z{!B34Zip~|A;8l@%*Gc}kT|kC0*Ny$&fI3@%M! zqk_zvN}7bM`x@jqFOtaxI?*^Im5ix@=`QEv;__i;Tek-&7kGm6yP17QANVL>*d0B=4>i^;HKb$k8?DYFMr38IX4azK zBbwjF%$>PqXhJh=*7{zH5=+gi$!nc%SqFZlwRm zmpctOjZh3bwt!Oc>qVJhWQf>`HTwMH2ibK^eE*j!&Z`-bs8=A`Yvnb^?p;5+U=Fb8 z@h>j_3hhazd$y^Z-bt%3%E3vica%nYnLxW+4+?w{%|M_=w^04U{a6^22>M_?{@mXP zS|Qjcn4&F%WN7Z?u&I3fU(UQVw4msFehxR*80dSb=a&UG4zDQp&?r2UGPy@G?0FbY zVUQ?uU9-c;f9z06$O5FO1TOn|P{pLcDGP?rfdt`&uw|(Pm@$n+A?)8 zP$nG(VG&aRU*(_5z#{+yVnntu`6tEq>%9~n^*ao}`F6ph_@6_8|AfAXtFfWee_14` zKKURYV}4}=UJmxv7{RSz5QlwZtzbYQs0;t3?kx*7S%nf-aY&lJ@h?-BAn%~0&&@j) zQd_6TUOLXErJ`A3vE?DJIbLE;s~s%eVt(%fMzUq^UfZV9c?YuhO&6pwKt>j(=2CkgTNEq7&c zfeGN+%5DS@b9HO>zsoRXv@}(EiA|t5LPi}*R3?(-=iASADny<{D0WiQG>*-BSROk4vI6%$R>q64J&v-T+(D<_(b!LD z9GL;DV;;N3!pZYg23mcg81tx>7)=e%f|i{6Mx0GczVpc}{}Mg(W_^=Wh0Rp+xXgX` z@hw|5=Je&nz^Xa>>vclstYt;8c2PY)87Ap;z&S&`yRN>yQVV#K{4&diVR7Rm;S{6m z6<+;jwbm`==`JuC6--u6W7A@o4&ZpJV%5+H)}toy0afF*!)AaG5=pz_i9}@OG%?$O z2cec6#@=%xE3K8;^ps<2{t4SnqH+#607gAHP-G4^+PBiC1s>MXf&bQ|Pa;WBIiErV z?3VFpR9JFl9(W$7p3#xe(Bd?Z93Uu~jHJFo7U3K_x4Ej-=N#=a@f;kPV$>;hiN9i9 z<6elJl?bLI$o=|d6jlihA4~bG;Fm2eEnlGxZL`#H%Cdes>uJfMJ4>@1SGGeQ81DwxGxy7L5 zm05Ik*WpSgZvHh@Wpv|2i|Y#FG?Y$hbRM5ZF0Z7FB3cY0+ei#km9mDSPI}^!<<`vr zuv$SPg2vU{wa)6&QMY)h1hbbxvR2cc_6WcWR`SH& z&KuUQcgu}!iW2Wqvp~|&&LSec9>t(UR_|f$;f-fC&tSO-^-eE0B~Frttnf+XN(#T) z^PsuFV#(pE#6ztaI8(;ywN%CtZh?w&;_)w_s@{JiA-SMjf&pQk+Bw<}f@Q8-xCQMwfaf zMgHsAPU=>>Kw~uDFS(IVRN{$ak(SV(hrO!UqhJ?l{lNnA1>U24!=>|q_p404Xd>M# z7?lh^C&-IfeIr`Dri9If+bc%oU0?|Rh8)%BND5;_9@9tuM)h5Kcw6}$Ca7H_n)nOf0pd`boCXItb`o11 zb`)@}l6I_h>n+;`g+b^RkYs7;voBz&Gv6FLmyvY|2pS)z#P;t8k;lS>49a$XeVDc4 z(tx2Pe3N%Gd(!wM`E7WRBZy)~vh_vRGt&esDa0NCua)rH#_39*H0!gIXpd>~{rGx+ zJKAeXAZ-z5n=mMVqlM5Km;b;B&KSJlScD8n?2t}kS4Wf9@MjIZSJ2R?&=zQn zs_`=+5J$47&mP4s{Y{TU=~O_LzSrXvEP6W?^pz<#Y*6Fxg@$yUGp31d(h+4x>xpb< zH+R639oDST6F*0iH<9NHC^Ep*8D4-%p2^n-kD6YEI<6GYta6-I;V^ZH3n5}syTD=P z3b6z=jBsdP=FlXcUe@I|%=tY4J_2j!EVNEzph_42iO3yfir|Dh>nFl&Lu9!;`!zJB zCis9?_(%DI?$CA(00pkzw^Up`O;>AnPc(uE$C^a9868t$m?5Q)CR%!crI$YZpiYK6m= z!jv}82He`QKF;10{9@roL2Q7CF)OeY{~dBp>J~X#c-Z~{YLAxNmn~kWQW|2u!Yq00 zl5LKbzl39sVCTpm9eDW_T>Z{x@s6#RH|P zA~_lYas7B@SqI`N=>x50Vj@S)QxouKC(f6Aj zz}7e5e*5n?j@GO;mCYEo^Jp_*BmLt3!N)(T>f#L$XHQWzZEVlJo(>qH@7;c%fy zS-jm^Adju9Sm8rOKTxfTU^!&bg2R!7C_-t+#mKb_K?0R72%26ASF;JWA_prJ8_SVW zOSC7C&CpSrgfXRp8r)QK34g<~!1|poTS7F;)NseFsbwO$YfzEeG3oo!qe#iSxQ2S# z1=Fxc9J;2)pCab-9o-m8%BLjf(*mk#JJX3k9}S7Oq)dV0jG)SOMbw7V^Z<5Q0Cy$< z^U0QUVd4(96W03OA1j|x%{sd&BRqIERDb6W{u1p1{J(a;fd6lnWzjeS`d?L3-0#o7 z{Qv&L7!Tm`9|}u=|IbwS_jgH(_V@o`S*R(-XC$O)DVwF~B&5c~m!zl14ydT6sK+Ly zn+}2hQ4RTC^8YvrQ~vk$f9u=pTN{5H_yTOcza9SVE&nt_{`ZC8zkmFji=UyD`G4~f zUfSTR=Kju>6u+y&|Bylb*W&^P|8fvEbQH3+w*DrKq|9xMzq2OiZyM=;(?>~4+O|jn zC_Et05oc>e%}w4ye2Fm%RIR??VvofwZS-}BL@X=_4jdHp}FlMhW_IW?Zh`4$z*Wr!IzQHa3^?1|);~VaWmsIcmc6 zJs{k0YW}OpkfdoTtr4?9F6IX6$!>hhA+^y_y@vvA_Gr7u8T+i-< zDX(~W5W{8mfbbM-en&U%{mINU#Q8GA`byo)iLF7rMVU#wXXY`a3ji3m{4;x53216i z`zA8ap?>_}`tQj7-%$K78uR}R$|@C2)qgop$}o=g(jOv0ishl!E(R73N=i0~%S)6+ z1xFP7|H0yt3Z_Re*_#C2m3_X{=zi1C&3CM7e?9-Y5lCtAlA%RFG9PDD=Quw1dfYnZ zdUL)#+m`hKx@PT`r;mIx_RQ6Txbti+&;xQorP;$H=R2r)gPMO9>l+!p*Mt04VH$$M zSLwJ81IFjQ5N!S#;MyBD^IS`2n04kuYbZ2~4%3%tp0jn^**BZQ05ELp zY%yntZ=52s6U5Y93Aao)v~M3y?6h7mZcVGp63pK*d&!TRjW99rUU;@s#3kYB76Bs$|LRwkH>L!0Xe zE=dz1o}phhnOVYZFsajQsRA^}IYZnk9Wehvo>gHPA=TPI?2A`plIm8=F1%QiHx*Zn zi)*Y@)$aXW0v1J|#+R2=$ysooHZ&NoA|Wa}htd`=Eud!(HD7JlT8ug|yeBZmpry(W z)pS>^1$N#nuo3PnK*>Thmaxz4pLcY?PP2r3AlhJ7jw(TI8V#c}>Ym;$iPaw+83L+* z!_QWpYs{UWYcl0u z(&(bT0Q*S_uUX9$jC;Vk%oUXw=A-1I+!c18ij1CiUlP@pfP9}CHAVm{!P6AEJ(7Dn z?}u#}g`Q?`*|*_0Rrnu8{l4PP?yCI28qC~&zlwgLH2AkfQt1?B#3AOQjW&10%@@)Q zDG?`6$8?Nz(-sChL8mRs#3z^uOA>~G=ZIG*mgUibWmgd{a|Tn4nkRK9O^37E(()Q% zPR0#M4e2Q-)>}RSt1^UOCGuv?dn|IT3#oW_$S(YR+jxAzxCD_L25p_dt|^>g+6Kgj zJhC8n)@wY;Y7JI6?wjU$MQU|_Gw*FIC)x~^Eq1k41BjLmr}U>6#_wxP0-2Ka?uK14u5M-lAFSX$K1K{WH!M1&q}((MWWUp#Uhl#n_yT5dFs4X`>vmM& z*1!p0lACUVqp&sZG1GWATvZEENs^0_7Ymwem~PlFN3hTHVBv(sDuP;+8iH07a)s(# z%a7+p1QM)YkS7>kbo${k2N1&*%jFP*7UABJ2d||c!eSXWM*<4(_uD7;1XFDod@cT$ zP>IC%^fbC${^QrUXy$f)yBwY^g@}}kngZKa1US!lAa+D=G4wklukaY8AEW%GL zh40pnuv*6D>9`_e14@wWD^o#JvxYVG-~P)+<)0fW zP()DuJN?O*3+Ab!CP-tGr8S4;JN-Ye^9D%(%8d{vb_pK#S1z)nZzE^ezD&%L6nYbZ z*62>?u)xQe(Akd=e?vZbyb5)MMNS?RheZDHU?HK<9;PBHdC~r{MvF__%T)-9ifM#cR#2~BjVJYbA>xbPyl9yNX zX)iFVvv-lfm`d?tbfh^j*A|nw)RszyD<#e>llO8X zou=q3$1|M@Ob;F|o4H0554`&y9T&QTa3{yn=w0BLN~l;XhoslF-$4KGNUdRe?-lcV zS4_WmftU*XpP}*wFM^oKT!D%_$HMT#V*j;9weoOq0mjbl1271$F)`Q(C z76*PAw3_TE{vntIkd=|(zw)j^!@j ^tV@s0U~V+mu)vv`xgL$Z9NQLnuRdZ;95D|1)!0Aybwv}XCE#xz1k?ZC zxAU)v@!$Sm*?)t2mWrkevNFbILU9&znoek=d7jn*k+~ptQ)6z`h6e4B&g?Q;IK+aH z)X(BH`n2DOS1#{AJD-a?uL)@Vl+`B=6X3gF(BCm>Q(9+?IMX%?CqgpsvK+b_de%Q> zj-GtHKf!t@p2;Gu*~#}kF@Q2HMevg~?0{^cPxCRh!gdg7MXsS}BLtG_a0IY0G1DVm z2F&O-$Dzzc#M~iN`!j38gAn`6*~h~AP=s_gy2-#LMFoNZ0<3q+=q)a|4}ur7F#><%j1lnr=F42Mbti zi-LYs85K{%NP8wE1*r4Mm+ZuZ8qjovmB;f##!E*M{*A(4^~vg!bblYi1M@7tq^L8- zH7tf_70iWXqcSQgENGdEjvLiSLicUi3l0H*sx=K!!HLxDg^K|s1G}6Tam|KBV>%YeU)Q>zxQe;ddnDTWJZ~^g-kNeycQ?u242mZs`i8cP)9qW`cwqk)Jf?Re0=SD=2z;Gafh(^X-=WJ$i7Z9$Pao56bTwb+?p>L3bi9 zP|qi@;H^1iT+qnNHBp~X>dd=Us6v#FPDTQLb9KTk%z{&OWmkx3uY(c6JYyK3w|z#Q zMY%FPv%ZNg#w^NaW6lZBU+}Znwc|KF(+X0RO~Q6*O{T-P*fi@5cPGLnzWMSyoOPe3 z(J;R#q}3?z5Ve%crTPZQFLTW81cNY-finw!LH9wr$(C)p_@v?(y#b-R^Pv!}_#7t+A?pHEUMY zoQZIwSETTKeS!W{H$lyB1^!jn4gTD{_mgG?#l1Hx2h^HrpCXo95f3utP-b&%w80F} zXFs@Jp$lbIL64@gc?k*gJ;OForPaapOH7zNMB60FdNP<*9<@hEXJk9Rt=XhHR-5_$Ck-R?+1py&J3Y9^sBBZuj?GwSzua;C@9)@JZpaI zE?x6{H8@j9P06%K_m%9#nnp0Li;QAt{jf-7X%Pd2jHoI4As-9!UR=h6Rjc z!3{UPWiSeLG&>1V5RlM@;5HhQW_&-wL2?%k@dvRS<+@B6Yaj*NG>qE5L*w~1ATP$D zmWu6(OE=*EHqy{($~U4zjxAwpPn42_%bdH9dMphiUU|) z*+V@lHaf%*GcXP079>vy5na3h^>X=n;xc;VFx)`AJEk zYZFlS#Nc-GIHc}j06;cOU@ zAD7Egkw<2a8TOcfO9jCp4U4oI*`|jpbqMWo(={gG3BjuM3QTGDG`%y|xithFck}0J zG}N#LyhCr$IYP`#;}tdm-7^9=72+CBfBsOZ0lI=LC_a%U@(t3J_I1t(UdiJ^@NubM zvvA0mGvTC%{fj53M^|Ywv$KbW;n8B-x{9}Z!K6v-tw&Xe_D2{7tX?eVk$sA*0826( zuGz!K7$O#;K;1w<38Tjegl)PmRso`fc&>fAT5s z7hzQe-_`lx`}2=c)jz6;yn(~F6#M@z_7@Z(@GWbIAo6A2&;aFf&>CVHpqoPh5#~=G zav`rZ3mSL2qwNL+Pg>aQv;%V&41e|YU$!fQ9Ksle!XZERpjAowHtX zi#0lnw{(zmk&}t`iFEMmx-y7FWaE*vA{Hh&>ieZg{5u0-3@a8BY)Z47E`j-H$dadu zIP|PXw1gjO@%aSz*O{GqZs_{ke|&S6hV{-dPkl*V|3U4LpqhG0eVdqfeNX28hrafI zE13WOsRE|o?24#`gQJs@v*EwL{@3>Ffa;knvI4@VEG2I>t-L(KRS0ShZ9N!bwXa}e zI0}@2#PwFA&Y9o}>6(ZaSaz>kw{U=@;d{|dYJ~lyjh~@bBL>n}#@KjvXUOhrZ`DbnAtf5bz3LD@0RpmAyC-4cgu<7rZo&C3~A_jA*0)v|Ctcdu} zt@c7nQ6hSDC@76c4hI&*v|5A0Mj4eQ4kVb0$5j^*$@psB zdouR@B?l6E%a-9%i(*YWUAhxTQ(b@z&Z#jmIb9`8bZ3Um3UW!@w4%t0#nxsc;*YrG z@x$D9Yj3EiA(-@|IIzi@!E$N)j?gedGJpW!7wr*7zKZwIFa>j|cy<(1`VV_GzWN=1 zc%OO)o*RRobvTZE<9n1s$#V+~5u8ZwmDaysD^&^cxynksn!_ypmx)Mg^8$jXu5lMo zK3K_8GJh#+7HA1rO2AM8cK(#sXd2e?%3h2D9GD7!hxOEKJZK&T`ZS0e*c9c36Y-6yz2D0>Kvqy(EuiQtUQH^~M*HY!$e z20PGLb2Xq{3Ceg^sn+99K6w)TkprP)YyNU(+^PGU8}4&Vdw*u;(`Bw!Um76gL_aMT z>*82nmA8Tp;~hwi0d3S{vCwD};P(%AVaBr=yJ zqB?DktZ#)_VFh_X69lAHQw(ZNE~ZRo2fZOIP;N6fD)J*3u^YGdgwO(HnI4pb$H#9) zizJ<>qI*a6{+z=j+SibowDLKYI*Je2Y>~=*fL@i*f&8**s~4l&B&}$~nwhtbOTr=G zFx>{y6)dpJPqv={_@*!q0=jgw3^j`qi@!wiWiT_$1`SPUgaG&9z9u9=m5C8`GpMaM zyMRSv2llS4F}L?233!)f?mvcYIZ~U z7mPng^=p)@Z*Fp9owSYA`Fe4OjLiJ`rdM`-U(&z1B1`S`ufK_#T@_BvenxDQU`deH$X5eMVO=;I4EJjh6?kkG2oc6AYF6|(t)L0$ukG}Zn=c+R`Oq;nC)W^ z{ek!A?!nCsfd_5>d&ozG%OJmhmnCOtARwOq&p!FzWl7M))YjqK8|;6sOAc$w2%k|E z`^~kpT!j+Y1lvE0B)mc$Ez_4Rq~df#vC-FmW;n#7E)>@kMA6K30!MdiC19qYFnxQ* z?BKegU_6T37%s`~Gi2^ewVbciy-m5%1P3$88r^`xN-+VdhhyUj4Kzg2 zlKZ|FLUHiJCZL8&<=e=F2A!j@3D@_VN%z?J;uw9MquL`V*f^kYTrpoWZ6iFq00uO+ zD~Zwrs!e4cqGedAtYxZ76Bq3Ur>-h(m1~@{x@^*YExmS*vw9!Suxjlaxyk9P#xaZK z)|opA2v#h=O*T42z>Mub2O3Okd3GL86KZM2zlfbS z{Vps`OO&3efvt->OOSpMx~i7J@GsRtoOfQ%vo&jZ6^?7VhBMbPUo-V^Znt%-4k{I# z8&X)=KY{3lXlQg4^FH^{jw0%t#2%skLNMJ}hvvyd>?_AO#MtdvH;M^Y?OUWU6BdMX zJ(h;PM9mlo@i)lWX&#E@d4h zj4Z0Czj{+ipPeW$Qtz_A52HA<4$F9Qe4CiNQSNE2Q-d1OPObk4?7-&`={{yod5Iy3kB=PK3%0oYSr`Gca120>CHbC#SqE*ivL2R(YmI1A|nAT?JmK*2qj_3p#?0h)$#ixdmP?UejCg9%AS2 z8I(=_QP(a(s)re5bu-kcNQc-&2{QZ%KE*`NBx|v%K2?bK@Ihz_e<5Y(o(gQ-h+s&+ zjpV>uj~?rfJ!UW5Mop~ro^|FP3Z`@B6A=@f{Wn78cm`)3&VJ!QE+P9&$;3SDNH>hI z_88;?|LHr%1kTX0t*xzG-6BU=LRpJFZucRBQ<^zy?O5iH$t>o}C}Fc+kM1EZu$hm% zTTFKrJkXmCylFgrA;QAA(fX5Sia5TNo z?=Ujz7$Q?P%kM$RKqRQisOexvV&L+bolR%`u`k;~!o(HqgzV9I6w9|g*5SVZN6+kT9H$-3@%h%k7BBnB zPn+wmPYNG)V2Jv`&$LoI*6d0EO^&Nh`E* z&1V^!!Szd`8_uf%OK?fuj~! z%p9QLJ?V*T^)72<6p1ONqpmD?Wm((40>W?rhjCDOz?#Ei^sXRt|GM3ULLnoa8cABQ zA)gCqJ%Q5J%D&nJqypG-OX1`JLT+d`R^|0KtfGQU+jw79la&$GHTjKF>*8BI z0}l6TC@XB6`>7<&{6WX2kX4k+0SaI`$I8{{mMHB}tVo*(&H2SmZLmW* z+P8N>(r}tR?f!O)?)df>HIu>$U~e~tflVmwk*+B1;TuqJ+q_^`jwGwCbCgSevBqj$ z<`Fj*izeO)_~fq%wZ0Jfvi6<3v{Afz;l5C^C7!i^(W>%5!R=Ic7nm(0gJ~9NOvHyA zqWH2-6w^YmOy(DY{VrN6ErvZREuUMko@lVbdLDq*{A+_%F>!@6Z)X9kR1VI1+Ler+ zLUPtth=u~23=CqZoAbQ`uGE_91kR(8Ie$mq1p`q|ilkJ`Y-ob_=Nl(RF=o7k{47*I)F%_XMBz9uwRH8q1o$TkV@8Pwl zzi`^7i;K6Ak7o58a_D-V0AWp;H8pSjbEs$4BxoJkkC6UF@QNL)0$NU;Wv0*5 z0Ld;6tm7eR%u=`hnUb)gjHbE2cP?qpo3f4w%5qM0J*W_Kl6&z4YKX?iD@=McR!gTyhpGGYj!ljQm@2GL^J70`q~4CzPv@sz`s80FgiuxjAZ zLq61rHv1O>>w1qOEbVBwGu4%LGS!!muKHJ#JjfT>g`aSn>83Af<9gM3XBdY)Yql|{ zUds}u*;5wuus)D>HmexkC?;R&*Z`yB4;k;4T*(823M&52{pOd1yXvPJ3PPK{Zs>6w zztXy*HSH0scZHn7qIsZ8y-zftJ*uIW;%&-Ka0ExdpijI&xInDg-Bv-Q#Islcbz+R! zq|xz?3}G5W@*7jSd`Hv9q^5N*yN=4?Lh=LXS^5KJC=j|AJ5Y(f_fC-c4YQNtvAvn|(uP9@5Co{dL z?7|=jqTzD8>(6Wr&(XYUEzT~-VVErf@|KeFpKjh=v51iDYN_`Kg&XLOIG;ZI8*U$@ zKig{dy?1H}UbW%3jp@7EVSD>6c%#abQ^YfcO(`)*HuvNc|j( zyUbYozBR15$nNU$0ZAE%ivo4viW?@EprUZr6oX=4Sc!-WvrpJdF`3SwopKPyX~F>L zJ>N>v=_plttTSUq6bYu({&rkq)d94m5n~Sk_MO*gY*tlkPFd2m=Pi>MK)ObVV@Sgs zmXMNMvvcAuz+<$GLR2!j4w&;{)HEkxl{$B^*)lUKIn&p5_huD6+%WDoH4`p}9mkw$ zXCPw6Y7tc%rn$o_vy>%UNBC`0@+Ih-#T05AT)ooKt?94^ROI5;6m2pIM@@tdT=&WP z{u09xEVdD}{(3v}8AYUyT82;LV%P%TaJa%f)c36?=90z>Dzk5mF2}Gs0jYCmufihid8(VFcZWs8#59;JCn{!tHu5kSBbm zL`F{COgE01gg-qcP2Lt~M9}mALg@i?TZp&i9ZM^G<3`WSDh}+Ceb3Q!QecJ|N;Xrs z{wH{D8wQ2+mEfBX#M8)-32+~q4MRVr1UaSPtw}`iwx@x=1Xv-?UT{t}w}W(J&WKAC zrZ%hssvf*T!rs}}#atryn?LB=>0U%PLwA9IQZt$$UYrSw`7++}WR7tfE~*Qg)vRrM zT;(1>Zzka?wIIz8vfrG86oc^rjM@P7^i8D~b(S23AoKYj9HBC(6kq9g`1gN@|9^xO z{~h zbxGMHqGZ@eJ17bgES?HQnwp|G#7I>@p~o2zxWkgZUYSUeB*KT{1Q z*J3xZdWt`eBsA}7(bAHNcMPZf_BZC(WUR5B8wUQa=UV^e21>|yp+uop;$+#JwXD!> zunhJVCIKgaol0AM_AwJNl}_k&q|uD?aTE@{Q*&hxZ=k_>jcwp}KwG6mb5J*pV@K+- zj*`r0WuEU_8O=m&1!|rj9FG7ad<2px63;Gl z9lJrXx$~mPnuiqIH&n$jSt*ReG}1_?r4x&iV#3e_z+B4QbhHwdjiGu^J3vcazPi`| zaty}NFSWe=TDry*a*4XB)F;KDI$5i9!!(5p@5ra4*iW;FlGFV0P;OZXF!HCQ!oLm1 zsK+rY-FnJ?+yTBd0}{*Y6su|hul)wJ>RNQ{eau*;wWM{vWM`d0dTC-}Vwx6@cd#P? zx$Qyk^2*+_ZnMC}q0)+hE-q)PKoox#;pc%DNJ&D5+if6X4j~p$A7-s&AjDkSEV)aM z(<3UOw*&f)+^5F0Mpzw3zB1ZHl*B?C~Cx) zuNg*>5RM9F5{EpU@a2E7hAE`m<89wbQ2Lz&?Egu-^sglNXG5Q;{9n(%&*kEb0vApd zRHrY@22=pkFN81%x)~acZeu`yvK zovAVJNykgxqkEr^hZksHkpxm>2I8FTu2%+XLs@?ym0n;;A~X>i32{g6NOB@o4lk8{ zB}7Z2MNAJi>9u=y%s4QUXaNdt@SlAZr54!S6^ETWoik6gw=k-itu_}Yl_M9!l+Rbv z(S&WD`{_|SE@@(|Wp7bq1Zq}mc4JAG?mr2WN~6}~u`7M_F@J9`sr0frzxfuqSF~mA z$m$(TWAuCIE99yLSwi%R)8geQhs;6VBlRhJb(4Cx zu)QIF%_W9+21xI45U>JknBRaZ9nYkgAcK6~E|Zxo!B&z9zQhjsi^fgwZI%K@rYbMq znWBXg1uCZ+ljGJrsW7@x3h2 z;kn!J!bwCeOrBx;oPkZ}FeP%wExyf4=XMp)N8*lct~SyfK~4^-75EZFpHYO5AnuRM z!>u?>Vj3+j=uiHc<=cD~JWRphDSwxFaINB42-{@ZJTWe85>-RcQ&U%?wK)vjz z5u5fJYkck##j(bP7W0*RdW#BmAIK`D3=(U~?b`cJ&U2jHj}?w6 z_4BM)#EoJ6)2?pcR4AqBd)qAUn@RtNQq})FIQoBK4ie+GB(Vih2D|Ds>RJo2zE~C- z7mI)7p)5(-O6JRh6a@VZ5~piVC+Xv=O-)=0eTMSJsRE^c1@bPQWlr}E31VqO-%739 zdcmE{`1m;5LH8w|7euK>>>U#Iod8l1yivC>;YWsg=z#07E%cU9x1yw#3l6AcIm%79 zGi^zH6rM#CZMow(S(8dcOq#5$kbHnQV6s?MRsU3et!!YK5H?OV9vf2qy-UHCn>}2d zTwI(A_fzmmCtE@10yAGgU7R&|Fl$unZJ_^0BgCEDE6(B*SzfkapE9#0N6adc>}dtH zJ#nt^F~@JMJg4=Pv}OdUHyPt-<<9Z&c0@H@^4U?KwZM&6q0XjXc$>K3c&3iXLD9_%(?)?2kmZ=Ykb;)M`Tw=%_d=e@9eheGG zk0<`4so}r={C{zr|6+_1mA_=a56(XyJq||g6Es1E6%fPg#l{r+vk9;)r6VB7D84nu zE0Z1EIxH{Y@}hT+|#$0xn+CdMy6Uhh80eK~nfMEIpM z`|G1v!USmx81nY8XkhEOSWto}pc#{Ut#`Pqb}9j$FpzkQ7`0<-@5D_!mrLah98Mpr zz(R7;ZcaR-$aKqUaO!j z=7QT;Bu0cvYBi+LDfE_WZ`e@YaE_8CCxoRc?Y_!Xjnz~Gl|aYjN2&NtT5v4#q3od2 zkCQZHe#bn(5P#J**Fj4Py%SaaAKJsmV6}F_6Z7V&n6QAu8UQ#9{gkq+tB=VF_Q6~^ zf(hXvhJ#tC(eYm6g|I>;55Lq-;yY*COpTp4?J}hGQ42MIVI9CgEC{3hYw#CZfFKVG zgD(steIg8veyqX%pYMoulq zMUmbj8I`t>mC`!kZ@A>@PYXy*@NprM@e}W2Q+s?XIRM-U1FHVLM~c60(yz1<46-*j zW*FjTnBh$EzI|B|MRU11^McTPIGVJrzozlv$1nah_|t4~u}Ht^S1@V8r@IXAkN;lH z_s|WHlN90k4X}*#neR5bX%}?;G`X!1#U~@X6bbhgDYKJK17~oFF0&-UB#()c$&V<0 z7o~Pfye$P@$)Lj%T;axz+G1L_YQ*#(qO zQND$QTz(~8EF1c3<%;>dAiD$>8j@7WS$G_+ktE|Z?Cx<}HJb=!aChR&4z ziD&FwsiZ)wxS4k6KTLn>d~!DJ^78yb>?Trmx;GLHrbCBy|Bip<@sWdAfP0I~;(Ybr zoc-@j?wA!$ zIP0m3;LZy+>dl#&Ymws@7|{i1+OFLYf@+8+)w}n?mHUBCqg2=-Hb_sBb?=q))N7Ej zDIL9%@xQFOA!(EQmchHiDN%Omrr;WvlPIN5gW;u#ByV)x2aiOd2smy&;vA2+V!u|D zc~K(OVI8} z0t|e0OQ7h23e01O;%SJ}Q#yeDh`|jZR7j-mL(T4E;{w^}2hzmf_6PF|`gWVj{I?^2T3MBK>{?nMXed4kgNox2DP!jvP9v`;pa6AV)OD zDt*Vd-x7s{-;E?E5}3p-V;Y#dB-@c5vTWfS7<=>E+tN$ME`Z7K$px@!%{5{uV`cH80|IzU! zDs9=$%75P^QKCRQ`mW7$q9U?mU@vrFMvx)NNDrI(uk>xwO;^($EUvqVev#{W&GdtR z0ew;Iwa}(-5D28zABlC{WnN{heSY5Eq5Fc=TN^9X#R}0z53!xP85#@;2E=&oNYHyo z46~#Sf!1M1X!rh}ioe`>G2SkPH{5nCoP`GT@}rH;-LP1Q7U_ypw4+lwsqiBql80aA zJE<(88yw$`xzNiSnU(hsyJqHGac<}{Av)x9lQ=&py9djsh0uc}6QkmKN3{P!TEy;P zzLDVQj4>+0r<9B0owxBt5Uz`!M_VSS|{(?`_e+qD9b=vZHoo6>?u;!IP zM7sqoyP>kWY|=v06gkhaGRUrO8n@zE?Yh8$om@8%=1}*!2wdIWsbrCg@;6HfF?TEN z+B_xtSvT6H3in#8e~jvD7eE|LTQhO_>3b823&O_l$R$CFvP@3~)L7;_A}JpgN@ax{ z2d9Ra)~Yh%75wsmHK8e87yAn-ZMiLo6#=<&PgdFsJw1bby-j&3%&4=9dQFltFR(VB z@=6XmyNN4yr^^o$ON8d{PQ=!OX17^CrdM~7D-;ZrC!||<+FEOxI_WI3 zCA<35va%4v>gcEX-@h8esj=a4szW7x z{0g$hwoWRQG$yK{@3mqd-jYiVofJE!Wok1*nV7Gm&Ssq#hFuvj1sRyHg(6PFA5U*Q z8Rx>-blOs=lb`qa{zFy&n4xY;sd$fE+<3EI##W$P9M{B3c3Si9gw^jlPU-JqD~Cye z;wr=XkV7BSv#6}DrsXWFJ3eUNrc%7{=^sP>rp)BWKA9<}^R9g!0q7yWlh;gr_TEOD|#BmGq<@IV;ue zg+D2}cjpp+dPf&Q(36sFU&K8}hA85U61faW&{lB`9HUl-WWCG|<1XANN3JVAkRYvr5U z4q6;!G*MTdSUt*Mi=z_y3B1A9j-@aK{lNvxK%p23>M&=KTCgR!Ee8c?DAO2_R?Bkaqr6^BSP!8dHXxj%N1l+V$_%vzHjq zvu7p@%Nl6;>y*S}M!B=pz=aqUV#`;h%M0rUHfcog>kv3UZAEB*g7Er@t6CF8kHDmK zTjO@rejA^ULqn!`LwrEwOVmHx^;g|5PHm#B6~YD=gjJ!043F+&#_;D*mz%Q60=L9O zve|$gU&~As5^uz@2-BfQ!bW)Khn}G+Wyjw-19qI#oB(RSNydn0t~;tAmK!P-d{b-@ z@E5|cdgOS#!>%#Rj6ynkMvaW@37E>@hJP^82zk8VXx|3mR^JCcWdA|t{0nPmYFOxN z55#^-rlqobcr==<)bi?E?SPymF*a5oDDeSdO0gx?#KMoOd&G(2O@*W)HgX6y_aa6i zMCl^~`{@UR`nMQE`>n_{_aY5nA}vqU8mt8H`oa=g0SyiLd~BxAj2~l$zRSDHxvDs; zI4>+M$W`HbJ|g&P+$!U7-PHX4RAcR0szJ*(e-417=bO2q{492SWrqDK+L3#ChUHtz z*@MP)e^%@>_&#Yk^1|tv@j4%3T)diEXATx4K*hcO`sY$jk#jN5WD<=C3nvuVs zRh||qDHnc~;Kf59zr0;c7VkVSUPD%NnnJC_l3F^#f_rDu8l}l8qcAz0FFa)EAt32I zUy_JLIhU_J^l~FRH&6-iv zSpG2PRqzDdMWft>Zc(c)#tb%wgmWN%>IOPmZi-noqS!^Ft zb81pRcQi`X#UhWK70hy4tGW1mz|+vI8c*h@fFGJtW3r>qV>1Z0r|L>7I3un^gcep$ zAAWfZHRvB|E*kktY$qQP_$YG60C z@X~tTQjB3%@`uz!qxtxF+LE!+=nrS^07hn`EgAp!h|r03h7B!$#OZW#ACD+M;-5J!W+{h z|6I;5cNnE(Y863%1(oH}_FTW})8zYb$7czPg~Szk1+_NTm6SJ0MS_|oSz%e(S~P-& zSFp;!k?uFayytV$8HPwuyELSXOs^27XvK-DOx-Dl!P|28DK6iX>p#Yb%3`A&CG0X2 zS43FjN%IB}q(!hC$fG}yl1y9W&W&I@KTg6@K^kpH8=yFuP+vI^+59|3%Zqnb5lTDAykf9S#X`3N(X^SpdMyWQGOQRjhiwlj!0W-yD<3aEj^ z&X%=?`6lCy~?`&WSWt?U~EKFcCG_RJ(Qp7j=$I%H8t)Z@6Vj zA#>1f@EYiS8MRHZphpMA_5`znM=pzUpBPO)pXGYpQ6gkine{ z6u_o!P@Q+NKJ}k!_X7u|qfpAyIJb$_#3@wJ<1SE2Edkfk9C!0t%}8Yio09^F`YGzp zaJHGk*-ffsn85@)%4@`;Fv^8q(-Wk7r=Q8pT&hD`5(f?M{gfzGbbwh8(}G#|#fDuk z7v1W)5H9wkorE0ZZjL0Q1=NRGY>zwgfm81DdoaVwNH;or{{e zSyybt)m<=zXoA^RALYG-2touH|L*BLvmm9cdMmn+KGopyR@4*=&0 z&4g|FLoreZOhRmh=)R0bg~T2(8V_q7~42-zvb)+y959OAv!V$u(O z3)%Es0M@CRFmG{5sovIq4%8Ahjk#*5w{+)+MWQoJI_r$HxL5km1#6(e@{lK3Udc~n z0@g`g$s?VrnQJ$!oPnb?IHh-1qA`Rz$)Ai<6w$-MJW-gKNvOhL+XMbE7&mFt`x1KY z>k4(!KbbpZ`>`K@1J<(#vVbjx@Z@(6Q}MF#Mnbr-f55)vXj=^j+#)=s+ThMaV~E`B z8V=|W_fZWDwiso8tNMTNse)RNBGi=gVwgg%bOg8>mbRN%7^Um-7oj4=6`$|(K7!+t^90a{$1 z8Z>}<#!bm%ZEFQ{X(yBZMc>lCz0f1I2w9SquGh<9<=AO&g6BZte6hn>Qmvv;Rt)*c zJfTr2=~EnGD8P$v3R|&1RCl&7)b+`=QGapiPbLg_pxm`+HZurtFZ;wZ=`Vk*do~$wBxoW&=j0OTbQ=Q%S8XJ%~qoa3Ea|au5 zo}_(P;=!y z-AjFrERh%8la!z6Fn@lR?^E~H12D? z8#ht=1F;7@o4$Q8GDj;sSC%Jfn01xgL&%F2wG1|5ikb^qHv&9hT8w83+yv&BQXOQy zMVJSBL(Ky~p)gU3#%|blG?I zR9rP^zUbs7rOA0X52Ao=GRt@C&zlyjNLv-}9?*x{y(`509qhCV*B47f2hLrGl^<@S zuRGR!KwHei?!CM10pBKpDIoBNyRuO*>3FU?HjipIE#B~y3FSfOsMfj~F9PNr*H?0o zHyYB^G(YyNh{SxcE(Y-`x5jFMKb~HO*m+R%rq|ic4fzJ#USpTm;X7K+E%xsT_3VHK ze?*uc4-FsILUH;kL>_okY(w`VU*8+l>o>JmiU#?2^`>arnsl#)*R&nf_%>A+qwl%o z{l(u)M?DK1^mf260_oteV3#E_>6Y4!_hhVDM8AI6MM2V*^_M^sQ0dmHu11fy^kOqX zqzps-c5efIKWG`=Es(9&S@K@)ZjA{lj3ea7_MBPk(|hBFRjHVMN!sNUkrB;(cTP)T97M$ z0Dtc&UXSec<+q?y>5=)}S~{Z@ua;1xt@=T5I7{`Z=z_X*no8s>mY;>BvEXK%b`a6(DTS6t&b!vf_z#HM{Uoy z_5fiB(zpkF{})ruka$iX*~pq1ZxD?q68dIoIZSVls9kFGsTwvr4{T_LidcWtt$u{k zJlW7moRaH6+A5hW&;;2O#$oKyEN8kx z`LmG)Wfq4ykh+q{I3|RfVpkR&QH_x;t41UwxzRFXt^E2B$domKT@|nNW`EHwyj>&< zJatrLQ=_3X%vd%nHh^z@vIk(<5%IRAa&Hjzw`TSyVMLV^L$N5Kk_i3ey6byDt)F^U zuM+Ub4*8+XZpnnPUSBgu^ijLtQD>}K;eDpe1bNOh=fvIfk`&B61+S8ND<(KC%>y&? z>opCnY*r5M+!UrWKxv0_QvTlJc>X#AaI^xoaRXL}t5Ej_Z$y*|w*$6D+A?Lw-CO-$ zitm^{2Ct82-<0IW)0KMNvJHgBrdsIR0v~=H?n6^}l{D``Me90`^o|q!olsF?UX3YS zq^6Vu>Ijm>>PaZI8G@<^NGw{Cx&%|PwYrfwR!gX_%AR=L3BFsf8LxI|K^J}deh0Zd zV?$3r--FEX`#INxsOG6_=!v)DI>0q|BxT)z-G6kzA01M?rba+G_mwNMQD1mbVbNTW zmBi*{s_v_Ft9m2Avg!^78(QFu&n6mbRJ2bAv!b;%yo{g*9l2)>tsZJOOp}U~8VUH`}$8p_}t*XIOehezolNa-a2x0BS})Y9}& z*TPgua{Ewn-=wVrmJUeU39EKx+%w%=ixQWKDLpwaNJs65#6o7Ln7~~X+p_o2BR1g~ zVCfxLzxA{HlWAI6^H;`juI=&r1jQrUv_q0Z1Ja-tjdktrrP>GOC*#p?*xfQU5MqjM zsBe!9lh(u8)w$e@Z|>aUHI5o;MGw*|Myiz3-f0;pHg~Q#%*Kx8MxH%AluVXjG2C$) zWL-K63@Q`#y9_k_+}eR(x4~dp7oV-ek0H>Igy8p#i4GN{>#v=pFYUQT(g&b$OeTy- zX_#FDgNF8XyfGY6R!>inYn8IR2RDa&O!(6NIHrC0H+Qpam1bNa=(`SRKjixBTtm&e z`j9porEci!zdlg1RI0Jw#b(_Tb@RQK1Zxr_%7SUeH6=TrXt3J@js`4iDD0=I zoHhK~I7^W8^Rcp~Yaf>2wVe|Hh1bXa_A{oZ9eG$he;_xYvTbTD#moBy zY57-f2Ef1TP^lBi&p5_s7WGG9|0T}dlfxOxXvScJO1Cnq`c`~{Dp;{;l<-KkCDE+p zmexJkd}zCgE{eF=)K``-qC~IT6GcRog_)!X?fK^F8UDz$(zFUrwuR$qro5>qqn>+Z z%<5>;_*3pZ8QM|yv9CAtrAx;($>4l^_$_-L*&?(77!-=zvnCVW&kUcZMb6;2!83si z518Y%R*A3JZ8Is|kUCMu`!vxDgaWjs7^0j(iTaS4HhQ)ldR=r)_7vYFUr%THE}cPF z{0H45FJ5MQW^+W>P+eEX2kLp3zzFe*-pFVAdDZRybv?H|>`9f$AKVjFWJ=wegO7hO zOIYCtd?Vj{EYLT*^gl35|HbMX|NAEUf2ra9dy1=O;figB>La=~eA^#>O6n4?EMugV zbbt{Dbfef5l^(;}5kZ@!XaWwF8z0vUr6r|+QN*|WpF z^*osUHzOnE$lHuWYO$G7>}Y)bY0^9UY4eDV`E{s+{}Z$O$2*lMEYl zTA`ki(<0(Yrm~}15V-E^e2W6`*`%ydED-3G@$UFm6$ZtLx z+av`BhsHcAWqdxPWfu2*%{}|Sptax4_=NpDMeWy$* zZM6__s`enB$~0aT1BU^2k`J9F%+n+lL_|8JklWOCVYt*0%o*j4w1CsB_H^tVpYT_LLyKuyk=CV6~1M<7~^FylL*+AIFf3h>J=x$ygY-BG}4LJ z8XxYPY!v7dO3PVwEoY=`)6krokmR^|Mg5ztX_^#QR}ibr^X-|_St#rtv3gukh0(#A=};NPlNz57ZDFJ9hf#NP50zS)+Fo=StX)i@ zWS?W}i6LjB>kAB~lupAPyIjFb)izFgRq*iS*(Jt509jNr3r72{Gj`5DGoj;J&k5G@Rm!dJ($ox>SbxR)fc zz|Phug;~A7!p@?|mMva@rWuf2fSDK_ZxN3vVmlYz>rrf?LpiNs)^z!y{As@`55JC~ zS*GD3#N-ptY!2<613UelAJ;M4EEI$dm)`8#n$|o{ce^dlyoUY3bsy2hgnj-;ovubb zg2h1rZA6Ot}K_cpYBpIuF&CyK~5R0Wv;kG|3A^8K3nk{rw$Be8u@aos#qvKQKJyVU$cX6biw&Ep#+q7upFX z%qo&`WZ){<%zh@BTl{MO@v9#;t+cb7so0Uz49Fmo1e4>y!vUyIHadguZS0T7-x#_drMXz*16*c zymR0u^`ZQpXN}2ofegbpSedL%F9aypdQcrzjzPlBW0j zMlPzC&ePZ@Cq!?d%9oQNEg0`rHALm8l#lUdXMVEqDvb(AID~H(?H9z!e9G98fG@IzhajKr)3{L_Clu1(Bwg`RM!-(MOuZi zbeDsj9I3(~EITsE=3Z)a|l_rn8W92U0DB70gF7YYfO0j!)h?QobY1lSR>0 z_TVw@$eP~3k8r9;%g%RlZzCJ2%f}DvY`rsZ$;ak&^~-`i%B%+O!pnADeVyV!dHj|} zzOj#q4eRx9Q8c2Z7vy9L&fGLj+3_?fp}+8o`Xpwyi(81H|7P8#65%FIS*lOi={o&v z4NV$xu7az4Nb50dRGZv<tdZCx4Ek<_o3!mAT} zL5l*|K3Qr-)W8paaG z&R6{ped_4e2cy}ejD0!dt{*PaC*^L@eB%(1Fmc%Y#4)~!jF#lCGfj#E??4LG-T;!M z>Uha}f;W>ib_ZL-I7-v9KZQls^G!-JmL^w;=^}?!RXK;m4$#MwI2AH-l7M2-0 zVMK8k^+4+>2S0k^N_40EDa#`7c;2!&3-o6MHsnBfRnq@>E@)=hDulVq-g5SQWDWbt zj6H5?QS2gRZ^Zvbs~cW|8jagJV|;^zqC0e=D1oUsQPJ3MCb+eRGw(XgIY9y8v_tXq z9$(xWntWpx_Uronmvho{JfyYdV{L1N$^s^|-Nj`Ll`lUsiWTjm&8fadUGMXreJGw$ zQ**m+Tj|(XG}DyUKY~2?&9&n6SJ@9VKa9Hcayv{ar^pNr0WHy zP$bQv&8O!vd;GoT!pLwod-42qB^`m!b7nP@YTX}^+1hzA$}LSLh}Ln|?`%8xGMazw z8WT!LoYJ-Aq3=2p6ZSP~uMgSSWv3f`&-I06tU}WhZsA^6nr&r17hjQIZE>^pk=yZ% z06}dfR$85MjWJPq)T?OO(RxoaF+E#4{Z7)i9}Xsb;Nf+dzig61HO;@JX1Lf9)R5j9)Oi6vPL{H z&UQ9ln=$Q8jnh6-t;`hKM6pHftdd?$=1Aq16jty4-TF~`Gx=C&R242uxP{Y@Q~%O3 z*(16@x+vJsbW@^3tzY=-5MHi#(kB};CU%Ep`mVY1j$MAPpYJBB3x$ue`%t}wZ-@CG z(lBv36{2HMjxT)2$n%(UtHo{iW9>4HX4>)%k8QNnzIQYXrm-^M%#Qk%9odbUrZDz1YPdY`2Z4w~p!5tb^m(mUfk}kZ9+EsmenQ)5iwiaulcy zCJ#2o4Dz?@%)aAKfVXYMF;3t@aqNh2tBBlBkCdj`F31b=h93y(46zQ-YK@+zX5qM9 z&=KkN&3@Ptp*>UD$^q-WpG|9O)HBXz{D>p!`a36aPKkgz7uxEo0J>-o+4HHVD9!Hn z${LD0d{tuGsW*wvZoHc8mJroAs(3!FK@~<}Pz1+vY|Gw}Lwfxp{4DhgiQ_SSlV)E| zZWZxYZLu2EB1=g_y@(ieCQC_1?WNA0J0*}eMZfxCCs>oL;?kHdfMcKB+A)Qull$v( z2x6(38utR^-(?DG>d1GyU()8>ih3ud0@r&I$`ZSS<*1n6(76=OmP>r_JuNCdS|-8U zxGKXL1)Lc2kWY@`_kVBt^%7t9FyLVYX(g%a6>j=yURS1!V<9ieT$$5R+yT!I>}jI5 z?fem|T=Jq;BfZmsvqz_Ud*m5;&xE66*o*S22vf-L+MosmUPPA}~wy`kntf8rIeP-m;;{`xe}9E~G7J!PYoVH_$q~NzQab?F8vWUja5BJ!T5%5IpyqI#Dkps0B;gQ*z?c#N>spFw|wRE$gY?y4wQbJ zku2sVLh({KQz6e0yo+X!rV#8n8<;bHWd{ZLL_(*9Oi)&*`LBdGWz>h zx+p`Wi00u#V$f=CcMmEmgFjw+KnbK3`mbaKfoCsB{;Q^oJgj*LWnd_(dk9Kcssbj` z?*g8l`%{*LuY!Ls*|Tm`1Gv-tRparW8q4AK(5pfJFY5>@qO( zcY>pt*na>LlB^&O@YBDnWLE$x7>pMdSmb-?qMh79eB+Wa{)$%}^kX@Z3g>fytppz! zl%>pMD(Yw+5=!UgYHLD69JiJ;YhiGeEyZM$Au{ff;i zCBbNQfO{d!b7z^F732XX&qhEsJA1UZtJjJEIPyDq+F`LeAUU_4`%2aTX#3NG3%W8u zC!7OvlB?QJ4s2#Ok^_8SKcu&pBd}L?vLRT8Kow#xARt`5&Cg=ygYuz>>c z4)+Vv$;<$l=is&E{k&4Lf-Lzq#BHuWc;wDfm4Fbd5Sr!40s{UpKT$kzmUi{V0t1yp zPOf%H8ynE$x@dQ_!+ISaI}#%72UcYm7~|D*(Fp8xiFAj$CmQ4oH3C+Q8W=Y_9Sp|B z+k<%5=y{eW=YvTivV(*KvC?qxo)xqcEU9(Te=?ITts~;xA0Jph-vpd4@Zw#?r2!`? zB3#XtIY^wxrpjJv&(7Xjvm>$TIg2ZC&+^j(gT0R|&4cb)=92-2Hti1`& z=+M;*O%_j3>9zW|3h{0Tfh5i)Fa;clGNJpPRcUmgErzC{B+zACiPHbff3SmsCZ&X; zp=tgI=zW-t(5sXFL8;ITHw0?5FL3+*z5F-KcLN130l=jAU6%F=DClRPrzO|zY+HD`zlZ-)JT}X?2g!o zxg4Ld-mx6&*-N0-MQ(z+zJo8c`B39gf{-h2vqH<=^T&o1Dgd>4BnVht+JwLcrjJl1 zsP!8`>3-rSls07q2i1hScM&x0lQyBbk(U=#3hI7Bkh*kj6H*&^p+J?OMiT_3*vw5R zEl&p|QQHZq6f~TlAeDGy(^BC0vUK?V&#ezC0*#R-h}_8Cw8-*${mVfHssathC8%VA zUE^Qd!;Rvym%|f@?-!sEj|73Vg8!$$zj_QBZAOraF5HCFKl=(Ac|_p%-P;6z<2WSf zz(9jF2x7ZR{w+p)ETCW06PVt0YnZ>gW9^sr&~`%a_7j-Ful~*4=o|&TM@k@Px2z>^ t{*Ed16F~3V5p+(suF-++X8+nHtT~NSfJ>UC3v)>lEpV}<+rIR_{{yMcG_L>v literal 0 HcmV?d00001 diff --git a/springfox-swagger-common/gradle/wrapper/gradle-wrapper.properties b/springfox-swagger-common/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 00000000000..41dfb87909a --- /dev/null +++ b/springfox-swagger-common/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,5 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-7.4-bin.zip +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/springfox-swagger-common/gradlew b/springfox-swagger-common/gradlew new file mode 100755 index 00000000000..1b6c787337f --- /dev/null +++ b/springfox-swagger-common/gradlew @@ -0,0 +1,234 @@ +#!/bin/sh + +# +# Copyright © 2015-2021 the original authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +############################################################################## +# +# Gradle start up script for POSIX generated by Gradle. +# +# Important for running: +# +# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is +# noncompliant, but you have some other compliant shell such as ksh or +# bash, then to run this script, type that shell name before the whole +# command line, like: +# +# ksh Gradle +# +# Busybox and similar reduced shells will NOT work, because this script +# requires all of these POSIX shell features: +# * functions; +# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», +# «${var#prefix}», «${var%suffix}», and «$( cmd )»; +# * compound commands having a testable exit status, especially «case»; +# * various built-in commands including «command», «set», and «ulimit». +# +# Important for patching: +# +# (2) This script targets any POSIX shell, so it avoids extensions provided +# by Bash, Ksh, etc; in particular arrays are avoided. +# +# The "traditional" practice of packing multiple parameters into a +# space-separated string is a well documented source of bugs and security +# problems, so this is (mostly) avoided, by progressively accumulating +# options in "$@", and eventually passing that to Java. +# +# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, +# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; +# see the in-line comments for details. +# +# There are tweaks for specific operating systems such as AIX, CygWin, +# Darwin, MinGW, and NonStop. +# +# (3) This script is generated from the Groovy template +# https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# within the Gradle project. +# +# You can find Gradle at https://github.com/gradle/gradle/. +# +############################################################################## + +# Attempt to set APP_HOME + +# Resolve links: $0 may be a link +app_path=$0 + +# Need this for daisy-chained symlinks. +while + APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path + [ -h "$app_path" ] +do + ls=$( ls -ld "$app_path" ) + link=${ls#*' -> '} + case $link in #( + /*) app_path=$link ;; #( + *) app_path=$APP_HOME$link ;; + esac +done + +APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit + +APP_NAME="Gradle" +APP_BASE_NAME=${0##*/} + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD=maximum + +warn () { + echo "$*" +} >&2 + +die () { + echo + echo "$*" + echo + exit 1 +} >&2 + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "$( uname )" in #( + CYGWIN* ) cygwin=true ;; #( + Darwin* ) darwin=true ;; #( + MSYS* | MINGW* ) msys=true ;; #( + NONSTOP* ) nonstop=true ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD=$JAVA_HOME/jre/sh/java + else + JAVACMD=$JAVA_HOME/bin/java + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD=java + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then + case $MAX_FD in #( + max*) + MAX_FD=$( ulimit -H -n ) || + warn "Could not query maximum file descriptor limit" + esac + case $MAX_FD in #( + '' | soft) :;; #( + *) + ulimit -n "$MAX_FD" || + warn "Could not set maximum file descriptor limit to $MAX_FD" + esac +fi + +# Collect all arguments for the java command, stacking in reverse order: +# * args from the command line +# * the main class name +# * -classpath +# * -D...appname settings +# * --module-path (only if needed) +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. + +# For Cygwin or MSYS, switch paths to Windows format before running java +if "$cygwin" || "$msys" ; then + APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) + CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) + + JAVACMD=$( cygpath --unix "$JAVACMD" ) + + # Now convert the arguments - kludge to limit ourselves to /bin/sh + for arg do + if + case $arg in #( + -*) false ;; # don't mess with options #( + /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath + [ -e "$t" ] ;; #( + *) false ;; + esac + then + arg=$( cygpath --path --ignore --mixed "$arg" ) + fi + # Roll the args list around exactly as many times as the number of + # args, so each arg winds up back in the position where it started, but + # possibly modified. + # + # NB: a `for` loop captures its iteration list before it begins, so + # changing the positional parameters here affects neither the number of + # iterations, nor the values presented in `arg`. + shift # remove old arg + set -- "$@" "$arg" # push replacement arg + done +fi + +# Collect all arguments for the java command; +# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of +# shell script including quotes and variable substitutions, so put them in +# double quotes to make sure that they get re-expanded; and +# * put everything else in single quotes, so that it's not re-expanded. + +set -- \ + "-Dorg.gradle.appname=$APP_BASE_NAME" \ + -classpath "$CLASSPATH" \ + org.gradle.wrapper.GradleWrapperMain \ + "$@" + +# Use "xargs" to parse quoted args. +# +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# + +eval "set -- $( + printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | + xargs -n1 | + sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | + tr '\n' ' ' + )" '"$@"' + +exec "$JAVACMD" "$@" diff --git a/springfox-swagger-common/gradlew.bat b/springfox-swagger-common/gradlew.bat new file mode 100644 index 00000000000..ac1b06f9382 --- /dev/null +++ b/springfox-swagger-common/gradlew.bat @@ -0,0 +1,89 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto execute + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/springfox-swagger-common/src/test/groovy/springfox/documentation/swagger/annotations/AnnotationsSpec.groovy b/springfox-swagger-common/src/test/groovy/springfox/documentation/swagger/annotations/AnnotationsSpec.groovy deleted file mode 100644 index b27e1e0f7ba..00000000000 --- a/springfox-swagger-common/src/test/groovy/springfox/documentation/swagger/annotations/AnnotationsSpec.groovy +++ /dev/null @@ -1,111 +0,0 @@ -/* - * - * Copyright 2015-2016 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.swagger.annotations - -import com.fasterxml.classmate.TypeResolver -import io.swagger.annotations.ApiOperation -import io.swagger.annotations.ApiResponse -import io.swagger.annotations.ApiResponses -import spock.lang.Shared -import spock.lang.Specification -import springfox.documentation.spring.web.dummy.DummyClass -import springfox.documentation.spring.web.dummy.controllers.ConcreteController - -import java.lang.reflect.AnnotatedElement - -import static springfox.documentation.swagger.annotations.Annotations.* - -class AnnotationsSpec extends Specification { - - @Shared - def resolver = new TypeResolver() - @Shared - def defaultType = resolver.resolve(String) - - def "ApiResponses annotations should be looked up through the entire inheritance hierarchy"() { - given: - AnnotatedElement annotatedElement = ConcreteController.getMethod("get", Object) - - expect: - findApiResponsesAnnotations(annotatedElement).size() == 1 - } - - def "ApiParam annotations should be looked up through the entire inheritance hierarchy"() { - given: - AnnotatedElement annotatedElement = DummyClass.getMethod("annotatedWithApiParam") - - expect: - findApiParamAnnotation(annotatedElement).isPresent() - } - - def "ApiResponses annotations should be looked up when annotated at class level"() { - given: - AnnotatedElement classLevel = DummyClass.class - AnnotatedElement methodLevel = DummyClass.getMethod("methodAnnotatedWithApiResponse") - - expect: - findApiResponsesAnnotations(classLevel).size() == 1 - findApiResponsesAnnotations(methodLevel).size() == 2 - findApiResponsesAnnotations(methodLevel)[0] == methodLevel.getAnnotation(ApiResponses) - findApiResponsesAnnotations(methodLevel)[1] == classLevel.getAnnotation(ApiResponses) - } - - def "Cannot instantiate the annotations helper"() { - when: - new Annotations() - - then: - thrown(UnsupportedOperationException) - } - - def "ResolvedType from ApiOperation annotation"() { - given: - def resolvedType = getResolvedType(apiOperation as ApiOperation, resolver, defaultType) - - expect: - resolvedType == type - - where: - apiOperation | type - null | defaultType - [response: { -> Void }, responseContainer: { -> null }] | defaultType - [response: { -> String }, responseContainer: { -> "List" }] | resolver.resolve(List, String) - [response: { -> String }, responseContainer: { -> "Set" }] | resolver.resolve(Set, String) - [response: { -> String }, responseContainer: { -> "Other" }] | resolver.resolve(String) - [response: { -> String }, responseContainer: { -> "" }] | resolver.resolve(String) - } - - def "ResolvedType from ApiResponse annotation"() { - given: - def resolvedType = getResolvedType(apiOperation as ApiResponse, resolver, defaultType) - - expect: - resolvedType == type - - where: - apiOperation | type - null | defaultType - [response: { -> Void }, responseContainer: { -> null }] | defaultType - [response: { -> String }, responseContainer: { -> "List" }] | resolver.resolve(List, String) - [response: { -> String }, responseContainer: { -> "Set" }] | resolver.resolve(Set, String) - [response: { -> String }, responseContainer: { -> "Other" }] | resolver.resolve(String) - [response: { -> String }, responseContainer: { -> "" }] | resolver.resolve(String) - } -} diff --git a/springfox-swagger-common/src/test/groovy/springfox/documentation/swagger/common/HostNameProviderSpec.groovy b/springfox-swagger-common/src/test/groovy/springfox/documentation/swagger/common/HostNameProviderSpec.groovy deleted file mode 100644 index e6f141f7ce0..00000000000 --- a/springfox-swagger-common/src/test/groovy/springfox/documentation/swagger/common/HostNameProviderSpec.groovy +++ /dev/null @@ -1,77 +0,0 @@ -package springfox.documentation.swagger.common - -import org.springframework.http.HttpHeaders -import spock.lang.Specification - -import jakarta.servlet.http.HttpServletRequest - -import static java.util.Collections.* -import static springfox.documentation.swagger.common.HostNameProvider.* -import static springfox.documentation.swagger.common.XForwardPrefixPathAdjuster.* - -class HostNameProviderSpec extends Specification { - def "should prefix path with x-forwarded-prefix"() { - given: - def request = mockRequest(true) - - when: - def result = componentsFrom(request, "/basePath") - - then: - result.toUriString() == "http://localhost/prefix" - } - - def "should preserve contextPath from request if no x-forwarded-prefix"() { - given: - def request = mockRequest(false) - - when: - def result = componentsFrom(request, "/basePath") - - then: - result.toUriString() == "http://localhost/contextPath" - } - - def "should not be allowed to create object from utility class"() { - when: - new HostNameProvider() - - then: - thrown UnsupportedOperationException - } - - def mockRequest(boolean addXForwardedHeaders) { - def request = Mock(HttpServletRequest.class) - if (addXForwardedHeaders) { - request.getHeader(X_FORWARDED_PREFIX) >> "/prefix" - request.getHeaders(X_FORWARDED_PREFIX) >> headerValues() - } else { - request.getHeaders(X_FORWARDED_PREFIX) >> emptyEnumeration() - } - request.headerNames >> headerNames() - request.requestURL >> new StringBuffer("http://localhost/contextPath") - request.requestURI >> new URI("http://localhost/contextPath") - request.contextPath >> "/contextPath" - request.servletPath >> "" - request - } - - Enumeration headerNames() { - def headers = new ArrayList() - headers.add(X_FORWARDED_PREFIX) - Collections.enumeration(headers) - } - - Enumeration headerValues() { - def headerValues = new ArrayList() - headerValues.add("/prefix") - Collections.enumeration(headerValues) - } - - def headers() { - def headers = new HttpHeaders() - headers.add(X_FORWARDED_PREFIX, "/prefix") - headers - } - -} diff --git a/springfox-swagger-common/src/test/groovy/springfox/documentation/swagger/common/XForwardPrefixPathAdjusterSpec.groovy b/springfox-swagger-common/src/test/groovy/springfox/documentation/swagger/common/XForwardPrefixPathAdjusterSpec.groovy deleted file mode 100644 index e3c481e71e6..00000000000 --- a/springfox-swagger-common/src/test/groovy/springfox/documentation/swagger/common/XForwardPrefixPathAdjusterSpec.groovy +++ /dev/null @@ -1,68 +0,0 @@ -package springfox.documentation.swagger.common - -import spock.lang.Specification -import spock.lang.Unroll -import springfox.documentation.common.SpringVersion -import springfox.documentation.common.Version - -import jakarta.servlet.http.HttpServletRequest - - -class XForwardPrefixPathAdjusterSpec extends Specification { - - def "Returns only prefix in x-forwarded-prefix"() { - given: - def request = Mock(HttpServletRequest.class) - request.getHeader(XForwardPrefixPathAdjuster.X_FORWARDED_PREFIX) >> "/prefix" - def springVersion = Mock(SpringVersion.class) - springVersion.getVersion() >> Version.parse("4.3.15.RELEASE") - - when: - def result = new XForwardPrefixPathAdjuster(request, springVersion).adjustedPath("/basePath") - - then: - result == "/prefix" - } - - def "Returns prefix in x-forwarded-prefix and path"() { - given: - def request = Mock(HttpServletRequest.class) - request.getHeader(XForwardPrefixPathAdjuster.X_FORWARDED_PREFIX) >> "/prefix" - def springVersion = Mock(SpringVersion.class) - springVersion.getVersion() >> Version.parse("4.3.14.RELEASE") - - when: - def result = new XForwardPrefixPathAdjuster(request, springVersion).adjustedPath("/basePath") - - then: - result == "/prefix/basePath" - } - - def "Returns only path"() { - given: - def request = Mock(HttpServletRequest.class) - request.getHeader(XForwardPrefixPathAdjuster.X_FORWARDED_PREFIX) >> null - - when: - def result = new XForwardPrefixPathAdjuster(request).adjustedPath("/basePath") - - then: - result == "/basePath" - } - - @Unroll - def "When prefix is #prefix"() { - given: - def request = Mock(HttpServletRequest.class) - request.getHeader(XForwardPrefixPathAdjuster.X_FORWARDED_PREFIX) >> prefix - - when: - def result = new XForwardPrefixPathAdjuster(request).adjustedPath("/basePath") - - then: - result == "/" - - where: - prefix << ["", "/"] - } -} diff --git a/springfox-swagger-common/src/test/groovy/springfox/documentation/swagger/mixins/SwaggerPluginsSupport.groovy b/springfox-swagger-common/src/test/groovy/springfox/documentation/swagger/mixins/SwaggerPluginsSupport.groovy deleted file mode 100644 index e5a3d6b01ea..00000000000 --- a/springfox-swagger-common/src/test/groovy/springfox/documentation/swagger/mixins/SwaggerPluginsSupport.groovy +++ /dev/null @@ -1,115 +0,0 @@ -/* - * - * Copyright 2015-2019 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.swagger.mixins - -import com.fasterxml.classmate.TypeResolver -import org.springframework.mock.env.MockEnvironment -import org.springframework.plugin.core.PluginRegistry -import springfox.documentation.schema.DefaultTypeNameProvider -import springfox.documentation.schema.JacksonEnumTypeDeterminer -import springfox.documentation.schema.JacksonJsonViewProvider -import springfox.documentation.schema.TypeNameExtractor -import springfox.documentation.schema.plugins.SchemaPluginsManager -import springfox.documentation.schema.property.ModelSpecificationFactory -import springfox.documentation.spi.DocumentationType -import springfox.documentation.spi.schema.ModelBuilderPlugin -import springfox.documentation.spi.schema.ModelPropertyBuilderPlugin -import springfox.documentation.spi.schema.SyntheticModelProviderPlugin -import springfox.documentation.spi.schema.TypeNameProviderPlugin -import springfox.documentation.spi.schema.ViewProviderPlugin -import springfox.documentation.spi.schema.contexts.ModelContext -import springfox.documentation.spi.service.DefaultsProviderPlugin -import springfox.documentation.spring.web.DescriptionResolver -import springfox.documentation.spring.web.plugins.DocumentationPluginsManager -import springfox.documentation.spring.web.readers.operation.OperationModelsProvider -import springfox.documentation.spring.web.readers.parameter.ExpandedParameterBuilder -import springfox.documentation.spring.web.readers.parameter.ParameterNameReader -import springfox.documentation.spring.web.scanners.MediaTypeReader -import springfox.documentation.swagger.readers.operation.SwaggerOperationModelsProvider -import springfox.documentation.swagger.readers.parameter.SwaggerExpandedParameterBuilder -import springfox.documentation.swagger.schema.ApiModelBuilder -import springfox.documentation.swagger.schema.ApiModelPropertyPropertyBuilder - -import springfox.documentation.swagger.web.SwaggerApiListingReader - -import java.util.stream.Stream - -import static java.util.Collections.* -import static java.util.stream.Collectors.* -import static org.springframework.plugin.core.OrderAwarePluginRegistry.* - -@SuppressWarnings("GrMethodMayBeStatic") -trait SwaggerPluginsSupport { - SchemaPluginsManager swaggerSchemaPlugins() { - def resolver = new TypeResolver() - def descriptions = new DescriptionResolver(new MockEnvironment()) - PluginRegistry modelNameRegistry = - of(singletonList(new DefaultTypeNameProvider())) - def enumTypeDeterminer = new JacksonEnumTypeDeterminer() - def typeNameExtractor = new TypeNameExtractor( - resolver, - modelNameRegistry, - enumTypeDeterminer) - PluginRegistry propRegistry = - of(singletonList(new ApiModelPropertyPropertyBuilder( - descriptions, - new ModelSpecificationFactory(typeNameExtractor, enumTypeDeterminer)))) - - PluginRegistry modelRegistry = - of([new ApiModelBuilder( - resolver, - typeNameExtractor, - enumTypeDeterminer, - new ModelSpecificationFactory(typeNameExtractor, enumTypeDeterminer))]) - - PluginRegistry viewProviderRegistry = - of([new JacksonJsonViewProvider(new TypeResolver())]) - - PluginRegistry syntheticModelRegistry = - of(new ArrayList<>()) - - new SchemaPluginsManager(propRegistry, modelRegistry, viewProviderRegistry, syntheticModelRegistry) - } - - DocumentationPluginsManager swaggerServicePlugins(List swaggerDefaultsPlugins) { - def resolver = new TypeResolver() - def plugins = new DocumentationPluginsManager() - plugins.apiListingPlugins = of(Stream.of(new MediaTypeReader(), new SwaggerApiListingReader()).collect(toList())) - plugins.documentationPlugins = of([]) - def descriptions = new DescriptionResolver(new MockEnvironment()) - plugins.parameterExpanderPlugins = - create([ - new ExpandedParameterBuilder( - resolver, - new JacksonEnumTypeDeterminer() - ), - new SwaggerExpandedParameterBuilder(descriptions, new JacksonEnumTypeDeterminer())]) - plugins.parameterPlugins = of([new ParameterNameReader(), - new ParameterNameReader()]) - plugins.operationBuilderPlugins = of([]) - plugins.apiListingScanners = of([]) - plugins.operationModelsProviders = of([ - new OperationModelsProvider(swaggerSchemaPlugins()), - new SwaggerOperationModelsProvider(resolver)]) - plugins.defaultsProviders = of(swaggerDefaultsPlugins) - plugins.apiListingScanners = of([]) - return plugins - } -} diff --git a/springfox-swagger-common/src/test/groovy/springfox/documentation/swagger/readers/operation/OpenApiOperationTagsReaderSpec.groovy b/springfox-swagger-common/src/test/groovy/springfox/documentation/swagger/readers/operation/OpenApiOperationTagsReaderSpec.groovy deleted file mode 100644 index f6c24daee94..00000000000 --- a/springfox-swagger-common/src/test/groovy/springfox/documentation/swagger/readers/operation/OpenApiOperationTagsReaderSpec.groovy +++ /dev/null @@ -1,75 +0,0 @@ -package springfox.documentation.swagger.readers.operation - -import io.swagger.v3.oas.annotations.tags.Tag -import io.swagger.v3.oas.annotations.tags.Tags -import spock.lang.Unroll -import springfox.documentation.spi.service.contexts.OperationContext -import springfox.documentation.spring.web.mixins.RequestMappingSupport -import springfox.documentation.spring.web.plugins.DocumentationContextSpec -import springfox.documentation.spring.web.readers.operation.OperationTagsReader - -class OpenApiOperationTagsReaderSpec extends DocumentationContextSpec implements RequestMappingSupport { - @Unroll - def "finds tags on #controller.#method correctly"() { - given: - OperationContext operationContext = - operationContext(documentationContext(), dummyHandlerMethodIn(controller, method)) - def sut = new OpenApiOperationTagsReader() - - when: - sut.apply(operationContext) - def operation = operationContext.operationBuilder().build() - - then: - operation.tags == tagNames - - where: - controller | method | tagNames - FakeControllerWithNoTags | "method0" | [] as Set - FakeControllerWithNoTags | "method1" | ["tag1"] as Set - FakeControllerWithNoTags | "method2" | ["tag2"] as Set - FakeControllerWithNoTags | "method3" | ["tag3", "tag4"] as Set - FakeController | "method0" | ["tag5", "tag6"] as Set - FakeController | "method1" | ["tag5", "tag6", "tag1"] as Set - FakeController | "method2" | ["tag5", "tag6", "tag2"] as Set - FakeController | "method3" | ["tag5", "tag6", "tag3", "tag4"] as Set - } - - class FakeControllerWithNoTags { - def method0() { - } - - @Tag(name = "tag1") - def method1() { - } - - @Tags(value = [@Tag(name = "tag2")]) - def method2() { - } - - @Tag(name = "tag4") - @Tags(value = [@Tag(name = "tag3")]) - def method3() { - } - } - - @Tag(name = "tag5") - @Tags(value = [@Tag(name = "tag6")]) - class FakeController { - def method0() { - } - - @Tag(name = "tag1") - def method1() { - } - - @Tags(value = [@Tag(name = "tag2")]) - def method2() { - } - - @Tag(name = "tag4") - @Tags(value = [@Tag(name = "tag3")]) - def method3() { - } - } -} diff --git a/springfox-swagger-common/src/test/groovy/springfox/documentation/swagger/readers/operation/OperationAuthReaderSpec.groovy b/springfox-swagger-common/src/test/groovy/springfox/documentation/swagger/readers/operation/OperationAuthReaderSpec.groovy deleted file mode 100644 index 082f162f832..00000000000 --- a/springfox-swagger-common/src/test/groovy/springfox/documentation/swagger/readers/operation/OperationAuthReaderSpec.groovy +++ /dev/null @@ -1,100 +0,0 @@ -/* - * - * Copyright 2015-2016 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.swagger.readers.operation - -import springfox.documentation.builders.PathSelectors -import springfox.documentation.service.AuthorizationScope -import springfox.documentation.spi.DocumentationType -import springfox.documentation.spi.service.contexts.OperationContext -import springfox.documentation.spi.service.contexts.SecurityContext -import springfox.documentation.spring.web.mixins.AuthSupport -import springfox.documentation.spring.web.mixins.RequestMappingSupport -import springfox.documentation.spring.web.plugins.DocumentationContextSpec - -import static java.util.Collections.* - -class OperationAuthReaderSpec - extends DocumentationContextSpec - implements AuthSupport, RequestMappingSupport { - - OperationAuthReader sut = new OperationAuthReader() - - def "should read from annotations"() { - given: - OperationContext operationContext = - operationContext(documentationContext(), dummyHandlerMethod('methodWithAuth')) - - when: - sut.apply(operationContext) - def operation = operationContext.operationBuilder().build() - and: - !sut.supports(DocumentationType.SPRING_WEB) - sut.supports(DocumentationType.SWAGGER_12) - sut.supports(DocumentationType.SWAGGER_2) - - then: - operation.securityReferences.containsKey("oauth2") - AuthorizationScope authorizationScope = operation.securityReferences.get("oauth2")[0] - authorizationScope.getDescription() == "scope description" - authorizationScope.getScope() == "scope" - } - - def "should apply global auth"() { - given: - SecurityContext securityContext = SecurityContext.builder() - .securityReferences(defaultAuth()) - .forPaths(PathSelectors.any()) - .build() - plugin.securityContexts(singletonList(securityContext)) - OperationContext operationContext = - operationContext(documentationContext(), dummyHandlerMethod()) - - when: - sut.apply(operationContext) - def authorizations = operationContext.operationBuilder().build().securityReferences - - then: - def scopes = authorizations.get('oauth2') - AuthorizationScope authorizationScope = scopes[0] - authorizationScope.getDescription() == "accessEverything" - authorizationScope.getScope() == "global" - } - - def "should apply global auth when ApiOperationAnnotation exists without auth values"() { - given: - SecurityContext securityContext = SecurityContext.builder() - .securityReferences(defaultAuth()) - .forPaths(PathSelectors.any()) - .build() - plugin.securityContexts(singletonList(securityContext)) - OperationContext operationContext = - operationContext(documentationContext(), dummyHandlerMethod('methodWithHttpGETMethod')) - - when: - sut.apply(operationContext) - def authorizations = operationContext.operationBuilder().build().securityReferences - - then: - def scopes = authorizations.get("oauth2") - AuthorizationScope authorizationScope = scopes[0] - authorizationScope.getDescription() == "accessEverything" - authorizationScope.getScope() == "global" - } -} diff --git a/springfox-swagger-common/src/test/groovy/springfox/documentation/swagger/readers/operation/OperationCommandReaderSpec.groovy b/springfox-swagger-common/src/test/groovy/springfox/documentation/swagger/readers/operation/OperationCommandReaderSpec.groovy deleted file mode 100644 index 972db015d62..00000000000 --- a/springfox-swagger-common/src/test/groovy/springfox/documentation/swagger/readers/operation/OperationCommandReaderSpec.groovy +++ /dev/null @@ -1,60 +0,0 @@ -/* - * - * Copyright 2015-2016 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.swagger.readers.operation - -import org.springframework.mock.env.MockEnvironment -import spock.lang.Shared -import spock.lang.Unroll -import springfox.documentation.spi.DocumentationType -import springfox.documentation.spi.service.contexts.OperationContext -import springfox.documentation.spring.web.DescriptionResolver -import springfox.documentation.spring.web.mixins.RequestMappingSupport -import springfox.documentation.spring.web.plugins.DocumentationContextSpec - -class OperationCommandReaderSpec extends DocumentationContextSpec implements RequestMappingSupport { - private static final int CURRENT_COUNT = 3 - @Shared - def descriptions = new DescriptionResolver(new MockEnvironment()) - - @Unroll("property #property expected: #expected") - def "should set various properties based on method name or swagger annotation"() { - given: - OperationContext operationContext = - operationContext(documentationContext(), handlerMethod, CURRENT_COUNT) - - when: - sut.apply(operationContext) - def operation = operationContext.operationBuilder().build() - - then: - operation."$property" == expected - and: - !sut.supports(DocumentationType.SPRING_WEB) - sut.supports(DocumentationType.SWAGGER_12) - sut.supports(DocumentationType.SWAGGER_2) - where: - sut | property | handlerMethod | expected - new OperationSummaryReader(descriptions) | 'summary' | dummyHandlerMethod('methodWithSummary') | 'summary' - new OperationHiddenReader() | 'hidden' | dummyHandlerMethod('methodThatIsHidden') | true - new OperationHiddenReader() | 'hidden' | dummyHandlerMethod('dummyMethod') | false - new OperationNotesReader(descriptions) | 'notes' | dummyHandlerMethod('methodWithNotes') | 'some notes' - new OperationPositionReader() | 'position' | dummyHandlerMethod('methodWithPosition') | 5 - } -} diff --git a/springfox-swagger-common/src/test/groovy/springfox/documentation/swagger/readers/operation/OperationHttpMethodReaderSpec.groovy b/springfox-swagger-common/src/test/groovy/springfox/documentation/swagger/readers/operation/OperationHttpMethodReaderSpec.groovy deleted file mode 100644 index d26246360d0..00000000000 --- a/springfox-swagger-common/src/test/groovy/springfox/documentation/swagger/readers/operation/OperationHttpMethodReaderSpec.groovy +++ /dev/null @@ -1,55 +0,0 @@ -/* - * - * Copyright 2015-2016 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.swagger.readers.operation - -import org.springframework.http.HttpMethod -import org.springframework.web.bind.annotation.RequestMethod -import springfox.documentation.spi.DocumentationType -import springfox.documentation.spi.service.contexts.OperationContext -import springfox.documentation.spring.web.mixins.RequestMappingSupport -import springfox.documentation.spring.web.plugins.DocumentationContextSpec - -class OperationHttpMethodReaderSpec extends DocumentationContextSpec implements RequestMappingSupport { - def "should return api method annotation when present"() { - - given: - OperationContext operationContext = - operationContext(documentationContext(), handlerMethod) - - OperationHttpMethodReader sut = new OperationHttpMethodReader(); - when: - sut.apply(operationContext) - and: - def operation = operationContext.operationBuilder().build() - - then: - operation.method == expected - and: - !sut.supports(DocumentationType.SPRING_WEB) - sut.supports(DocumentationType.SWAGGER_12) - sut.supports(DocumentationType.SWAGGER_2) - where: - currentHttpMethod | handlerMethod | expected - RequestMethod.GET | dummyHandlerMethod() | HttpMethod.GET - RequestMethod.PUT | dummyHandlerMethod() | HttpMethod.GET - RequestMethod.POST | dummyHandlerMethod('methodWithHttpGETMethod') | HttpMethod.GET - RequestMethod.POST | dummyHandlerMethod('methodWithInvalidHttpMethod') | HttpMethod.GET - } -} diff --git a/springfox-swagger-common/src/test/groovy/springfox/documentation/swagger/readers/operation/OperationImplicitParameterReaderSpec.groovy b/springfox-swagger-common/src/test/groovy/springfox/documentation/swagger/readers/operation/OperationImplicitParameterReaderSpec.groovy deleted file mode 100644 index 96200695b91..00000000000 --- a/springfox-swagger-common/src/test/groovy/springfox/documentation/swagger/readers/operation/OperationImplicitParameterReaderSpec.groovy +++ /dev/null @@ -1,67 +0,0 @@ -package springfox.documentation.swagger.readers.operation - -import spock.lang.Specification -import spock.lang.Unroll -import springfox.documentation.builders.ModelSpecificationBuilder -import springfox.documentation.builders.ReferenceModelSpecificationBuilder -import springfox.documentation.schema.Example -import springfox.documentation.schema.ScalarType -import springfox.documentation.swagger.readers.parameter.ApiImplicitParamAnnotationSupport - -class OperationImplicitParameterReaderSpec extends Specification implements ApiImplicitParamAnnotationSupport { - @Unroll - def "Implicit params are evaluated correctly"() { - when: - def model = OperationImplicitParameterReader.modelSpecification(implicitParamAnnotation) - - then: - model?.scalar?.orElse(null)?.type == expectedScalar - model?.reference?.orElse(null) == expectedReference - model?.collection - ?.map { c -> c.model } - ?.orElse(null) == collectionItemSpecification(expectedCollectionType) - - where: - implicitParamAnnotation | expectedScalar | expectedCollectionType | expectedReference - apiImplicitParam() | null | null | null - apiImplicitParam("string") | ScalarType.STRING | null | null - apiImplicitParam("string", "byte") | ScalarType.BYTE | null | null - apiImplicitParam("string", "byte", "int") | ScalarType.INTEGER | null | null - apiImplicitParam("string", "byte", "int", Long) | ScalarType.LONG | null | null - apiImplicitParam("string", "byte", "int", Example) | null | null | reference(Example) - collectionApiImplicitParam() | null | null | null - collectionApiImplicitParam("string") | null | ScalarType.STRING | null - collectionApiImplicitParam("string", "byte") | null | ScalarType.BYTE | null - collectionApiImplicitParam("string", "byte", "int") | null | ScalarType.INTEGER | null - collectionApiImplicitParam("string", "byte", "int", Long) | null | ScalarType.LONG | null - collectionApiImplicitParam("string", "byte", "int", Example) | null | reference(Example) | null - - } - - def reference(Class clazz) { - new ReferenceModelSpecificationBuilder() - .key { k -> - k.qualifiedModelName { - q -> - q.name(clazz.simpleName) - .namespace(clazz.packageName) - } - }.build() - } - - def collectionItemSpecification(type) { - if (type == null) { - return null - } - if (type instanceof ScalarType) { - return new ModelSpecificationBuilder() - .scalarModel(type) - .build() - } - return new ModelSpecificationBuilder() - .referenceModel { - r -> - r.copyOf(type) - }.build() - } -} diff --git a/springfox-swagger-common/src/test/groovy/springfox/documentation/swagger/readers/operation/OperationImplicitParamsReaderSpec.groovy b/springfox-swagger-common/src/test/groovy/springfox/documentation/swagger/readers/operation/OperationImplicitParamsReaderSpec.groovy deleted file mode 100644 index 8595d1ed246..00000000000 --- a/springfox-swagger-common/src/test/groovy/springfox/documentation/swagger/readers/operation/OperationImplicitParamsReaderSpec.groovy +++ /dev/null @@ -1,91 +0,0 @@ -/* - * - * Copyright 2015-2017 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.swagger.readers.operation - -import com.fasterxml.classmate.TypeResolver -import org.springframework.mock.env.MockEnvironment -import springfox.documentation.schema.JacksonEnumTypeDeterminer -import springfox.documentation.schema.property.bean.AccessorsProvider -import springfox.documentation.schema.property.field.FieldProvider -import springfox.documentation.spi.DocumentationType -import springfox.documentation.spi.service.contexts.OperationContext -import springfox.documentation.spring.web.DescriptionResolver -import springfox.documentation.spring.web.mixins.RequestMappingSupport -import springfox.documentation.spring.web.plugins.DocumentationContextSpec -import springfox.documentation.spring.web.readers.operation.ContentParameterAggregator -import springfox.documentation.spring.web.readers.operation.OperationParameterReader -import springfox.documentation.spring.web.readers.parameter.ModelAttributeParameterExpander - -class OperationImplicitParamsReaderSpec extends DocumentationContextSpec implements RequestMappingSupport { - - def "Should add implicit parameters"() { - given: - OperationContext operationContext = operationContext(documentationContext(), handlerMethod, 0) - def resolver = new TypeResolver() - def enumTypeDeterminer = new JacksonEnumTypeDeterminer() - def plugins = defaultWebPlugins() - def expander = new ModelAttributeParameterExpander( - new FieldProvider(resolver), - new AccessorsProvider(resolver), - enumTypeDeterminer) - expander.pluginsManager = plugins - OperationParameterReader sut = new OperationParameterReader( - expander, - enumTypeDeterminer, - new ContentParameterAggregator()) - sut.pluginsManager = plugins - def env = new DescriptionResolver(new MockEnvironment()) - OperationImplicitParametersReader operationImplicitParametersReader = new OperationImplicitParametersReader(env) - OperationImplicitParameterReader operationImplicitParameterReader = new OperationImplicitParameterReader( - env - ) - - when: - sut.apply(operationContext) - operationImplicitParametersReader.apply(operationContext) - operationImplicitParameterReader.apply(operationContext) - - and: - def operation = operationContext.operationBuilder().build() - - then: - operation.parameters.size() == expectedSize - - and: - !operationImplicitParametersReader.supports(DocumentationType.SPRING_WEB) - operationImplicitParametersReader.supports(DocumentationType.SWAGGER_12) - operationImplicitParametersReader.supports(DocumentationType.SWAGGER_2) - - and: - !operationImplicitParameterReader.supports(DocumentationType.SPRING_WEB) - operationImplicitParameterReader.supports(DocumentationType.SWAGGER_12) - operationImplicitParameterReader.supports(DocumentationType.SWAGGER_2) - where: - handlerMethod | expectedSize - dummyHandlerMethod('dummyMethod') | 0 - dummyHandlerMethod('methodWithApiImplicitParam') | 1 - dummyHandlerMethod('methodWithApiImplicitParamAndInteger', Integer.class) | 2 - dummyHandlerMethod('methodWithApiImplicitParamAndExample', Integer.class) | 2 - dummyHandlerMethod('methodWithApiImplicitParamAndAllowMultiple', Integer.class) | 2 - dummyHandlerMethod('methodWithApiImplicitParams', Integer.class) | 3 - handlerMethodIn(apiImplicitParamsClass(), 'methodWithApiImplicitParam') | 2 - dummyHandlerMethodIn(apiImplicitParamsAllowMultipleClass(), 'methodWithApiImplicitParam') | 3 - } -} diff --git a/springfox-swagger-common/src/test/groovy/springfox/documentation/swagger/readers/operation/OperationNicknameIntoUniqueIdReaderSpec.groovy b/springfox-swagger-common/src/test/groovy/springfox/documentation/swagger/readers/operation/OperationNicknameIntoUniqueIdReaderSpec.groovy deleted file mode 100644 index a2c08be77e4..00000000000 --- a/springfox-swagger-common/src/test/groovy/springfox/documentation/swagger/readers/operation/OperationNicknameIntoUniqueIdReaderSpec.groovy +++ /dev/null @@ -1,48 +0,0 @@ -/* - * - * Copyright 2016 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ -package springfox.documentation.swagger.readers.operation - -import springfox.documentation.spi.DocumentationType -import springfox.documentation.spi.service.contexts.OperationContext -import springfox.documentation.spring.web.mixins.RequestMappingSupport -import springfox.documentation.spring.web.plugins.DocumentationContextSpec - -class OperationNicknameIntoUniqueIdReaderSpec extends DocumentationContextSpec implements RequestMappingSupport { - def "should set various unique operation id based on swagger annotation"() { - given: - OperationContext operationContext = - operationContext(documentationContext(), handlerMethod) - and: - def sut = new OperationNicknameIntoUniqueIdReader() - when: - sut.apply(operationContext) - def operation = operationContext.operationBuilder().build() - - then: - operation.uniqueId == expected - and: - !sut.supports(DocumentationType.SPRING_WEB) - sut.supports(DocumentationType.SWAGGER_12) - sut.supports(DocumentationType.SWAGGER_2) - where: - handlerMethod | expected - dummyHandlerMethod('methodWithHttpGETMethod') | 'nullUsingGET' - dummyHandlerMethod('methodWithNickName') | 'unique' - } -} diff --git a/springfox-swagger-common/src/test/groovy/springfox/documentation/swagger/readers/operation/OperationPositionReaderSpec.groovy b/springfox-swagger-common/src/test/groovy/springfox/documentation/swagger/readers/operation/OperationPositionReaderSpec.groovy deleted file mode 100644 index 3173bb0af02..00000000000 --- a/springfox-swagger-common/src/test/groovy/springfox/documentation/swagger/readers/operation/OperationPositionReaderSpec.groovy +++ /dev/null @@ -1,44 +0,0 @@ -/* - * - * Copyright 2015-2016 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.swagger.readers.operation - -import springfox.documentation.spi.service.contexts.OperationContext -import springfox.documentation.spring.web.mixins.RequestMappingSupport -import springfox.documentation.spring.web.plugins.DocumentationContextSpec - -class OperationPositionReaderSpec extends DocumentationContextSpec implements RequestMappingSupport { - - def "should have correct api position using swagger reader"() { - given: - OperationContext operationContext = - operationContext(documentationContext(), handlerMethod, contextCount) - OperationPositionReader operationPositionReader = new OperationPositionReader(); - - when: - operationPositionReader.apply(operationContext) - def operation = operationContext.operationBuilder().build() - then: - operation.position == expectedCount - where: - handlerMethod | contextCount | expectedCount - dummyHandlerMethod() | 2 | 0 - dummyHandlerMethod('methodWithPosition') | 3 | 5 - } -} diff --git a/springfox-swagger-common/src/test/groovy/springfox/documentation/swagger/readers/operation/SwaggerOperationModelsProviderSpec.groovy b/springfox-swagger-common/src/test/groovy/springfox/documentation/swagger/readers/operation/SwaggerOperationModelsProviderSpec.groovy deleted file mode 100644 index 49cb503e64f..00000000000 --- a/springfox-swagger-common/src/test/groovy/springfox/documentation/swagger/readers/operation/SwaggerOperationModelsProviderSpec.groovy +++ /dev/null @@ -1,65 +0,0 @@ -/* - * - * Copyright 2016-2019 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ -package springfox.documentation.swagger.readers.operation - -import com.fasterxml.classmate.TypeResolver -import org.springframework.web.servlet.mvc.method.RequestMappingInfo -import springfox.documentation.spi.DocumentationType -import springfox.documentation.spi.service.contexts.RequestMappingContext -import springfox.documentation.spring.web.WebMvcRequestHandler -import springfox.documentation.spring.web.mixins.RequestMappingSupport -import springfox.documentation.spring.web.paths.Paths -import springfox.documentation.spring.web.plugins.DocumentationContextSpec -import springfox.documentation.spring.web.readers.operation.HandlerMethodResolver - -class SwaggerOperationModelsProviderSpec extends DocumentationContextSpec implements RequestMappingSupport { - def "should read from annotations"() { - given: - def methodResolver = new HandlerMethodResolver(new TypeResolver()) - RequestMappingInfo requestMappingInfo = requestMappingInfo("/doesNotMatterForThisTest", - [patternsRequestCondition: patternsRequestCondition('/somePath/{businessId}', '/somePath/{businessId:\\d+}')] - ) - RequestMappingContext requestContext = new RequestMappingContext( - "0", - documentationContext(), - new WebMvcRequestHandler( - Paths.ROOT, - methodResolver, - requestMappingInfo, - dummyHandlerMethod(operationName))) - SwaggerOperationModelsProvider sut = new SwaggerOperationModelsProvider(new TypeResolver()) - when: - sut.apply(requestContext) - def models = requestContext.operationModelsBuilder().build() - - then: - models.size() == modelCount - and: - !sut.supports(DocumentationType.SPRING_WEB) - sut.supports(DocumentationType.SWAGGER_12) - sut.supports(DocumentationType.SWAGGER_2) - where: - operationName | modelCount - 'dummyMethod' | 1 - 'methodWithPosition' | 1 - 'methodApiResponseClass' | 2 - 'methodAnnotatedWithApiResponse' | 2 - } - -} diff --git a/springfox-swagger-common/src/test/groovy/springfox/documentation/swagger/readers/operation/SwaggerOperationResponseClassReaderSpec.groovy b/springfox-swagger-common/src/test/groovy/springfox/documentation/swagger/readers/operation/SwaggerOperationResponseClassReaderSpec.groovy deleted file mode 100644 index 7fd6afcacd0..00000000000 --- a/springfox-swagger-common/src/test/groovy/springfox/documentation/swagger/readers/operation/SwaggerOperationResponseClassReaderSpec.groovy +++ /dev/null @@ -1,92 +0,0 @@ -/* - * - * Copyright 2015-2016 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.swagger.readers.operation - -import com.fasterxml.classmate.TypeResolver -import org.springframework.plugin.core.OrderAwarePluginRegistry -import org.springframework.plugin.core.PluginRegistry -import spock.lang.Unroll -import springfox.documentation.schema.DefaultTypeNameProvider -import springfox.documentation.schema.JacksonEnumTypeDeterminer -import springfox.documentation.schema.TypeNameExtractor -import springfox.documentation.spi.DocumentationType -import springfox.documentation.spi.schema.TypeNameProviderPlugin -import springfox.documentation.spi.service.contexts.OperationContext -import springfox.documentation.spring.web.mixins.RequestMappingSupport -import springfox.documentation.spring.web.plugins.DocumentationContextSpec -import springfox.documentation.swagger.mixins.SwaggerPluginsSupport - -class SwaggerOperationResponseClassReaderSpec - extends DocumentationContextSpec - implements SwaggerPluginsSupport, - RequestMappingSupport { - - @Unroll - def "should have correct response class"() { - given: - PluginRegistry modelNameRegistry = - OrderAwarePluginRegistry.create([new DefaultTypeNameProvider()]) - def typeNameExtractor = new TypeNameExtractor( - new TypeResolver(), - modelNameRegistry, - new JacksonEnumTypeDeterminer()) - OperationContext operationContext = - operationContext(documentationContext(), handlerMethod) - - SwaggerOperationResponseClassReader sut = - new SwaggerOperationResponseClassReader( - new TypeResolver(), - new JacksonEnumTypeDeterminer(), - typeNameExtractor) - - when: - sut.apply(operationContext) - def operation = operationContext.operationBuilder().build() - - then: - if (operation.responseModel.collection) { - assert expectedClass == String.format("%s[%s]", operation.responseModel.type, operation.responseModel.itemType) - } else { - assert expectedClass == operation.responseModel.type - } - - if (allowableValues == null) { - assert operation.responseModel.allowableValues == null - } else { - assert allowableValues == operation.responseModel.allowableValues.values - } - - and: - !sut.supports(DocumentationType.SPRING_WEB) - sut.supports(DocumentationType.SWAGGER_12) - sut.supports(DocumentationType.SWAGGER_2) - - where: - handlerMethod | expectedClass | allowableValues - dummyHandlerMethod('methodWithConcreteResponseBody') | 'BusinessModel' | null - dummyHandlerMethod('methodWithAPiAnnotationButWithoutResponseClass') | 'FunkyBusiness' | null - dummyHandlerMethod('methodWithGenericType') | 'Paginated«string»' | null - dummyHandlerMethod('methodApiResponseClass') | 'FunkyBusiness' | null - dummyHandlerMethod('methodWithGenericPrimitiveArray') | 'Array[byte]' | null - dummyHandlerMethod('methodWithGenericComplexArray') | 'Array[DummyClass]' | null - dummyHandlerMethod('methodWithEnumResponse') | 'string' | ['ONE', 'TWO'] - } - -} diff --git a/springfox-swagger-common/src/test/groovy/springfox/documentation/swagger/readers/operation/SwaggerOperationTagsReaderSpec.groovy b/springfox-swagger-common/src/test/groovy/springfox/documentation/swagger/readers/operation/SwaggerOperationTagsReaderSpec.groovy deleted file mode 100644 index d3cbc9ee7be..00000000000 --- a/springfox-swagger-common/src/test/groovy/springfox/documentation/swagger/readers/operation/SwaggerOperationTagsReaderSpec.groovy +++ /dev/null @@ -1,45 +0,0 @@ -/* - * - * Copyright 2016 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ -package springfox.documentation.swagger.readers.operation - -import springfox.documentation.spi.service.contexts.OperationContext -import springfox.documentation.spring.web.mixins.RequestMappingSupport -import springfox.documentation.spring.web.plugins.DocumentationContextSpec - -class SwaggerOperationTagsReaderSpec extends DocumentationContextSpec implements RequestMappingSupport { - def "should have correct tags"() { - given: - OperationContext operationContext = - operationContext(documentationContext(), handlerMethod) - and: - SwaggerOperationTagsReader sut = new SwaggerOperationTagsReader() - - when: - sut.apply(operationContext) - def operation = operationContext.operationBuilder().build() - then: - operation.tags.containsAll(tags) - - where: - handlerMethod | tags - dummyHandlerMethod('methodWithConcreteResponseBody') | [] - dummyControllerHandlerMethod() | [] - dummyOperationWithTags() | ["Tag1", "Tag2", "Tag3", "Tag4"] - } -} diff --git a/springfox-swagger-common/src/test/groovy/springfox/documentation/swagger/readers/operation/SwaggerRepresentationReaderSpec.groovy b/springfox-swagger-common/src/test/groovy/springfox/documentation/swagger/readers/operation/SwaggerRepresentationReaderSpec.groovy deleted file mode 100644 index 77a498d1aa0..00000000000 --- a/springfox-swagger-common/src/test/groovy/springfox/documentation/swagger/readers/operation/SwaggerRepresentationReaderSpec.groovy +++ /dev/null @@ -1,72 +0,0 @@ -/* - * - * Copyright 2015-2019 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.swagger.readers.operation - -import org.springframework.http.HttpMethod -import org.springframework.web.bind.annotation.RequestMethod -import org.springframework.web.multipart.MultipartFile -import org.springframework.web.servlet.mvc.method.RequestMappingInfo -import springfox.documentation.spi.DocumentationType -import springfox.documentation.spi.service.contexts.OperationContext -import springfox.documentation.spring.web.mixins.RequestMappingSupport -import springfox.documentation.spring.web.plugins.DocumentationContextSpec - -import java.util.stream.Stream - -import static java.util.Collections.* -import static java.util.stream.Collectors.* - -class SwaggerRepresentationReaderSpec extends DocumentationContextSpec implements RequestMappingSupport { - def "handler method should override spring media types"() { - RequestMappingInfo requestMappingInfo = - requestMappingInfo('/somePath', - [ - 'consumesRequestCondition': consumesRequestCondition(['application/json'] as String[]), - 'producesRequestCondition': producesRequestCondition(['application/json'] as String[]) - ] - ) - OperationContext operationContext = - operationContext(documentationContext(), handlerMethod, 0, requestMappingInfo, RequestMethod.POST) - operationContext.operationBuilder().method(HttpMethod.POST) - - when: - def sut = new SwaggerMediaTypeReader() - sut.apply(operationContext) - def operation = operationContext.operationBuilder().build() - - then: - operation.consumes == expectedConsumes - operation.produces == expectedProduces - - and: - !sut.supports(DocumentationType.SPRING_WEB) - sut.supports(DocumentationType.SWAGGER_12) - sut.supports(DocumentationType.SWAGGER_2) - - where: - expectedConsumes | expectedProduces | handlerMethod - singleton('application/xml') | new HashSet<>() | dummyHandlerMethod('methodWithXmlConsumes') - new HashSet<>() | singleton('application/xml') | dummyHandlerMethod('methodWithXmlProduces') - singleton('application/xml') | singleton('application/json') | dummyHandlerMethod('methodWithMediaTypeAndFile', MultipartFile) - singleton('application/xml') | singleton('application/xml') | dummyHandlerMethod('methodWithBothXmlMediaTypes') - Stream.of('application/xml', 'application/json').collect(toSet()) | Stream.of('application/xml', 'application/json').collect(toSet()) | dummyHandlerMethod('methodWithMultipleMediaTypes') - - } -} diff --git a/springfox-swagger-common/src/test/groovy/springfox/documentation/swagger/readers/operation/SwaggerResponseMessageReaderSpec.groovy b/springfox-swagger-common/src/test/groovy/springfox/documentation/swagger/readers/operation/SwaggerResponseMessageReaderSpec.groovy deleted file mode 100644 index be4d5b046f9..00000000000 --- a/springfox-swagger-common/src/test/groovy/springfox/documentation/swagger/readers/operation/SwaggerResponseMessageReaderSpec.groovy +++ /dev/null @@ -1,297 +0,0 @@ -/* - * - * Copyright 2015-2016 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.swagger.readers.operation - -import com.fasterxml.classmate.TypeResolver -import org.springframework.plugin.core.OrderAwarePluginRegistry -import org.springframework.plugin.core.PluginRegistry -import spock.lang.Unroll -import springfox.documentation.schema.DefaultTypeNameProvider -import springfox.documentation.schema.Example -import springfox.documentation.schema.JacksonEnumTypeDeterminer -import springfox.documentation.schema.ModelRef -import springfox.documentation.schema.ModelReference -import springfox.documentation.schema.TypeNameExtractor -import springfox.documentation.schema.property.ModelSpecificationFactory -import springfox.documentation.service.Header -import springfox.documentation.spi.DocumentationType -import springfox.documentation.spi.schema.EnumTypeDeterminer -import springfox.documentation.spi.schema.TypeNameProviderPlugin -import springfox.documentation.spi.service.contexts.OperationContext -import springfox.documentation.spring.web.dummy.ResponseExampleTestController -import springfox.documentation.spring.web.dummy.ResponseHeaderTestController -import springfox.documentation.spring.web.mixins.RequestMappingSupport -import springfox.documentation.spring.web.plugins.DocumentationContextSpec - -class SwaggerResponseMessageReaderSpec extends DocumentationContextSpec implements RequestMappingSupport { - - def "ApiResponse annotation should override when using swagger reader"() { - given: - OperationContext operationContext = - operationContext(documentationContext(), dummyHandlerMethod('methodWithApiResponses')) - - PluginRegistry modelNameRegistry = - OrderAwarePluginRegistry.of([new DefaultTypeNameProvider()]) - - def resolver = new TypeResolver() - def enumTypeDeterminer = new JacksonEnumTypeDeterminer() - def typeNameExtractor = new TypeNameExtractor( - resolver, - modelNameRegistry, - enumTypeDeterminer) - - when: - new SwaggerResponseMessageReader( - enumTypeDeterminer, - typeNameExtractor, - resolver, - new ModelSpecificationFactory(typeNameExtractor, enumTypeDeterminer), defaultWebPlugins()) - .apply(operationContext) - - and: - def operation = operationContext.operationBuilder().build() - def responseMessages = operation.responseMessages - def responses = operation.responses - - then: - responseMessages.size() == 2 - def annotatedResponseMessage = responseMessages.find { it.code == 413 } - annotatedResponseMessage != null - annotatedResponseMessage.message == "a message" - - def classLevelResponseMessage = responseMessages.find { it.code == 404 } - classLevelResponseMessage != null - classLevelResponseMessage.message == "Not Found" - - and: - responses.size() == 2 - def annotatedResponse = responses.find { it.code == "413" } - annotatedResponse != null - annotatedResponse.description == "a message" - - def classLevelResponse = responses.find { it.code == "404" } - classLevelResponse != null - classLevelResponse.description == "Not Found" - - } - - def "ApiOperation annotation should provide response"() { - given: - OperationContext operationContext = - operationContext(documentationContext(), dummyHandlerMethod('methodApiResponseClass')) - - PluginRegistry modelNameRegistry = - OrderAwarePluginRegistry.of([new DefaultTypeNameProvider()]) - - def resolver = new TypeResolver() - def enumTypeDeterminer = new JacksonEnumTypeDeterminer() - def typeNameExtractor = new TypeNameExtractor( - resolver, - modelNameRegistry, - enumTypeDeterminer) - - when: - new SwaggerResponseMessageReader( - enumTypeDeterminer, - typeNameExtractor, - resolver, - new ModelSpecificationFactory(typeNameExtractor, enumTypeDeterminer), defaultWebPlugins()) - .apply(operationContext) - - and: - def operation = operationContext.operationBuilder().build() - def responseMessages = operation.responseMessages - def responses = operation.responses - - then: - responseMessages.size() == 2 - def annotatedResponseMessage = responseMessages.find { it.code == 200 } - annotatedResponseMessage != null - annotatedResponseMessage.message == "OK" - - def classLevelResponseMessage = responseMessages.find { it.code == 404 } - classLevelResponseMessage != null - classLevelResponseMessage.message == "Not Found" - - and: - responses.size() == 2 - def annotatedResponse = responses.find { it.code == "200" } - annotatedResponse != null - annotatedResponse.description == "OK" - - def classLevelResponse = responses.find { it.code == "404" } - classLevelResponse != null - classLevelResponse.description == "Not Found" - } - - @Unroll - def "ApiOperation.responseHeaders and ApiResponse.responseHeader are merged for method #methodName"() { - given: - OperationContext operationContext = - operationContext(documentationContext(), handlerMethodIn(ResponseHeaderTestController, methodName)) - - PluginRegistry modelNameRegistry = - OrderAwarePluginRegistry.of([new DefaultTypeNameProvider()]) - - def resolver = new TypeResolver() - def enumTypeDeterminer = new JacksonEnumTypeDeterminer() - def typeNameExtractor = new TypeNameExtractor( - resolver, - modelNameRegistry, - enumTypeDeterminer) - - when: - new SwaggerResponseMessageReader(enumTypeDeterminer, - typeNameExtractor, - resolver, - new ModelSpecificationFactory(typeNameExtractor, enumTypeDeterminer), defaultWebPlugins()) - .apply(operationContext) - - and: - def operation = operationContext.operationBuilder().build() - def responseMessages = operation.responseMessages - def responses = operation.responses - - then: - responseMessages.size() == 0 || responseMessages.inject(true) { - soFar, r -> - soFar && - r.headers.size() == headers.size() && - headersMatch(r.headers, headers) - } - - where: - methodName | headers - "noAnnotationHeaders" | [] - "defaultWithBoth" | [] - "operationHeadersOnly" | [["name": "header1", "type": new ModelRef("string")]] - "operationHeadersOnly" | [["name": "header1", "type": new ModelRef("List", new ModelRef("string"))]] - "responseHeadersOnly" | [["name": "header1", "type": new ModelRef("string")]] - "bothWithOverride" | [["name": "header1", "type": new ModelRef("int")]] - "bothWithoutOverride" | [["name": "header1", "type": new ModelRef("string")], ["name": "header2", "type": new ModelRef("int")]] - } - - boolean headersMatch(Map headers, List
expectedHeaders) { - if (headers.size() == expectedHeaders.size()) { - def retValue = true - headers.eachWithIndex { Map.Entry entry, int i -> - if (entry.key != expectedHeaders.get(i).name || - entry.value.modelReference.type != expectedHeaders.get(i).type.type || - entry.value.modelReference.itemType != expectedHeaders.get(i).type.itemType) { - retValue &= false - } - } - return retValue - } - return false - } - - def "Successful status series is inferred"() { - expect: - SwaggerResponseMessageReader.isSuccessful(status) - where: - status << [200, 204] - } - - def "Unknown integers are treated as failures"() { - expect: - !SwaggerResponseMessageReader.isSuccessful(1001) - } - - def "Supports all documentation types"() { - given: - PluginRegistry modelNameRegistry = - OrderAwarePluginRegistry.of([new DefaultTypeNameProvider()]) - - def resolver = new TypeResolver() - JacksonEnumTypeDeterminer enumTypeDeterminer = new JacksonEnumTypeDeterminer() - def typeNameExtractor = new TypeNameExtractor( - resolver, - modelNameRegistry, - new JacksonEnumTypeDeterminer()) - - when: - def sut = new SwaggerResponseMessageReader( - new JacksonEnumTypeDeterminer(), - typeNameExtractor, - resolver, - new ModelSpecificationFactory(typeNameExtractor, enumTypeDeterminer), defaultWebPlugins()) - - then: - !sut.supports(DocumentationType.SPRING_WEB) - sut.supports(DocumentationType.SWAGGER_12) - sut.supports(DocumentationType.SWAGGER_2) - sut.supports(DocumentationType.OAS_30) - } - - @Unroll - def "Supports examples"() { - given: - OperationContext operationContext = - operationContext(documentationContext(), handlerMethodIn(ResponseExampleTestController, methodName)) - - PluginRegistry modelNameRegistry = - OrderAwarePluginRegistry.of([new DefaultTypeNameProvider()]) - - def resolver = new TypeResolver() - def typeNameExtractor = new TypeNameExtractor( - resolver, - modelNameRegistry, - new JacksonEnumTypeDeterminer()) - - when: - new SwaggerResponseMessageReader( - Mock(EnumTypeDeterminer), - typeNameExtractor, - resolver, - new ModelSpecificationFactory(typeNameExtractor, Mock(EnumTypeDeterminer)), - defaultWebPlugins()) - .apply(operationContext) - - and: - def operation = operationContext.operationBuilder().build() - def responseMessages = operation.responseMessages - def responses = operation.responses - - then: - examplesMatch(responseMessages[0].examples, examples) - examplesMatch(responses[0].examples, examples) - - where: - methodName | examples - "operationWithNoExamples" | [] - "operationWithOneExample" | [new Example("mediaType", "value")] - "operationWithTwoExamples" | [new Example("mediaType1", "value1"), new Example("mediaType2", "value2")] - "operationWithEmptyExample" | [new Example("mediaType1", "value1")] - } - - boolean examplesMatch(List examples, List expectedExamples) { - if (examples.size() != expectedExamples.size()) { - return false - } - for (def i = 0; i < examples.size(); i++) { - if (examples[i].mediaType != expectedExamples[i].mediaType - || examples[i].value != expectedExamples[i].value) { - return false - } - } - return true - } -} diff --git a/springfox-swagger-common/src/test/groovy/springfox/documentation/swagger/readers/operation/VendorExtensionsReaderSpec.groovy b/springfox-swagger-common/src/test/groovy/springfox/documentation/swagger/readers/operation/VendorExtensionsReaderSpec.groovy deleted file mode 100644 index 8e2dbf6ce53..00000000000 --- a/springfox-swagger-common/src/test/groovy/springfox/documentation/swagger/readers/operation/VendorExtensionsReaderSpec.groovy +++ /dev/null @@ -1,62 +0,0 @@ -/* - * - * Copyright 2016 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ -package springfox.documentation.swagger.readers.operation - -import springfox.documentation.service.ObjectVendorExtension -import springfox.documentation.service.StringVendorExtension -import springfox.documentation.spi.DocumentationType -import springfox.documentation.spi.service.contexts.OperationContext -import springfox.documentation.spring.web.mixins.RequestMappingSupport -import springfox.documentation.spring.web.plugins.DocumentationContextSpec - -class VendorExtensionsReaderSpec extends DocumentationContextSpec implements RequestMappingSupport { - def "should read from annotations"() { - given: - OperationContext operationContext = - operationContext(documentationContext(), dummyHandlerMethod('methodWithExtensions')) - VendorExtensionsReader sut = new VendorExtensionsReader() - when: - sut.apply(operationContext) - def operation = operationContext.operationBuilder().build() - and: - !sut.supports(DocumentationType.SPRING_WEB) - sut.supports(DocumentationType.SWAGGER_12) - sut.supports(DocumentationType.SWAGGER_2) - then: - operation.vendorExtensions.size() == 2 - operation.vendorExtensions.first().equals(first()) - operation.vendorExtensions.subList(1, 2).first().equals(second()) - } - - def second() { - def second = new ObjectVendorExtension("x-test2") - second.with { - addProperty(new StringVendorExtension("name2", "value2")) - } - second - } - - def first() { - def first = new ObjectVendorExtension("") - first.with { - addProperty(new StringVendorExtension("x-test1", "value1")) - } - first - } -} diff --git a/springfox-swagger-common/src/test/groovy/springfox/documentation/swagger/readers/parameter/ApiImplicitParamAnnotationSupport.groovy b/springfox-swagger-common/src/test/groovy/springfox/documentation/swagger/readers/parameter/ApiImplicitParamAnnotationSupport.groovy deleted file mode 100644 index b0132343911..00000000000 --- a/springfox-swagger-common/src/test/groovy/springfox/documentation/swagger/readers/parameter/ApiImplicitParamAnnotationSupport.groovy +++ /dev/null @@ -1,46 +0,0 @@ -package springfox.documentation.swagger.readers.parameter - -import io.swagger.annotations.ApiImplicitParam - -trait ApiImplicitParamAnnotationSupport { - ApiImplicitParam apiParamWithType(type, format) { - apiImplicitParam(type, format) - } - - ApiImplicitParam apiParamWithDataType(dataType) { - apiImplicitParam("", "", dataType) - } - - ApiImplicitParam apiParamWithDataTypeClass(dataTypeClass) { - apiImplicitParam("", "", "", dataTypeClass) - } - - ApiImplicitParam collectionApiImplicitParam( - type = "", - format = "", - dataType = "", - dataTypeClass = Void.class) { - [name : { -> "test" }, - type : { -> type }, - format : { -> format }, - dataType : { -> dataType }, - dataTypeClass: { -> dataTypeClass }, - allowMultiple: { -> true } - ] as ApiImplicitParam - } - - ApiImplicitParam apiImplicitParam( - type = "", - format = "", - dataType = "", - dataTypeClass = Void.class) { - [name : { -> "test" }, - type : { -> type }, - format : { -> format }, - dataType : { -> dataType }, - dataTypeClass: { -> dataTypeClass }, - allowMultiple: { -> false } - ] as ApiImplicitParam - } - -} diff --git a/springfox-swagger-common/src/test/groovy/springfox/documentation/swagger/readers/parameter/ApiParamAnnotationSupport.groovy b/springfox-swagger-common/src/test/groovy/springfox/documentation/swagger/readers/parameter/ApiParamAnnotationSupport.groovy deleted file mode 100644 index 13018a9bb10..00000000000 --- a/springfox-swagger-common/src/test/groovy/springfox/documentation/swagger/readers/parameter/ApiParamAnnotationSupport.groovy +++ /dev/null @@ -1,157 +0,0 @@ -package springfox.documentation.swagger.readers.parameter - -import io.swagger.annotations.ApiParam -import io.swagger.annotations.Example -import io.swagger.annotations.ExampleProperty - -trait ApiParamAnnotationSupport { - ApiParam apiParamWithType(type, format) { - [allowableValues : { -> "" }, - name : { -> "" }, - value : { -> "" }, - type : { -> type }, - format : { -> format }, - access : { -> "" }, - defaultValue : { -> "" }, - allowMultiple : { -> true }, - allowEmptyValue : { -> false }, - required : { -> true }, - collectionFormat: { -> "" }, - example : { -> "" }, - examples : { -> examples() }, - hidden : { -> false }] as ApiParam - } - - ApiParam apiParamWithAllowableValues(allowableValues) { - [allowableValues : { -> allowableValues }, - name : { -> "" }, - value : { -> "" }, - type : { -> "" }, - format : { -> "" }, - access : { -> "" }, - defaultValue : { -> "" }, - allowMultiple : { -> true }, - allowEmptyValue : { -> false }, - required : { -> true }, - collectionFormat: { -> "" }, - example : { -> "" }, - examples : { -> examples() }, - hidden : { -> false }] as ApiParam - } - - ApiParam apiParamWithAllowMultiple(allowableMultiple) { - [allowableValues : { -> "" }, - name : { -> "" }, - value : { -> "" }, - type : { -> "" }, - format : { -> "" }, - access : { -> "" }, - defaultValue : { -> "" }, - allowMultiple : { -> allowableMultiple }, - allowEmptyValue : { -> false }, - required : { -> true }, - collectionFormat: { -> "" }, - example : { -> "" }, - examples : { -> examples() }, - hidden : { -> false }] as ApiParam - } - - ApiParam apiParamWithRequired(required) { - [allowableValues : { -> "" }, - name : { -> "" }, - value : { -> "" }, - type : { -> "" }, - format : { -> "" }, - access : { -> "" }, - defaultValue : { -> "" }, - allowMultiple : { -> false }, - allowEmptyValue : { -> false }, - required : { -> required }, - collectionFormat: { -> "" }, - example : { -> "" }, - examples : { -> examples() }, - hidden : { -> false }] as ApiParam - } - - ApiParam apiParamWithNameAndValue(name, value) { - [allowableValues : { -> "" }, - name : { -> name }, - value : { -> value }, - type : { -> "" }, - format : { -> "" }, - access : { -> "" }, - defaultValue : { -> "" }, - allowMultiple : { -> false }, - allowEmptyValue : { -> false }, - required : { -> false }, - collectionFormat: { -> "" }, - example : { -> "" }, - examples : { -> examples() }, - hidden : { -> false }] as ApiParam - } - - ApiParam apiParamWithDefault(defaultValue) { - [allowableValues : { -> "" }, - name : { -> "" }, - value : { -> "" }, - type : { -> "" }, - format : { -> "" }, - access : { -> "" }, - defaultValue : { -> defaultValue }, - allowMultiple : { -> false }, - allowEmptyValue : { -> false }, - required : { -> false }, - collectionFormat: { -> "" }, - example : { -> "" }, - examples : { -> examples() }, - hidden : { -> false }] as ApiParam - } - - ApiParam apiParamWithAccess(access) { - [allowableValues : { -> "" }, - name : { -> "" }, - value : { -> "" }, - type : { -> "" }, - format : { -> "" }, - access : { -> access }, - defaultValue : { -> "" }, - allowMultiple : { -> false }, - allowEmptyValue : { -> false }, - required : { -> false }, - collectionFormat: { -> "" }, - example : { -> "" }, - examples : { -> examples() }, - hidden : { -> false }] as ApiParam - } - - ApiParam apiParamWithHidden(hidden) { - [allowableValues : { -> "" }, - name : { -> "" }, - value : { -> "" }, - type : { -> "" }, - format : { -> "" }, - access : { -> "" }, - defaultValue : { -> "" }, - allowMultiple : { -> false }, - allowEmptyValue : { -> false }, - required : { -> false }, - collectionFormat: { -> "" }, - example : { -> "" }, - examples : { -> examples() }, - hidden : { -> hidden }] as ApiParam - } - - Example examples() { - [ - value: { -> - [ - [ - mediaType: { -> "application/json" }, - value : { -> "{'hello': 'world'}" } - ] - ] as ExampleProperty[] - } - ] as Example - } - -} diff --git a/springfox-swagger-common/src/test/groovy/springfox/documentation/swagger/readers/parameter/ApiParamParameterBuilderSpec.groovy b/springfox-swagger-common/src/test/groovy/springfox/documentation/swagger/readers/parameter/ApiParamParameterBuilderSpec.groovy deleted file mode 100644 index 4f67bfae2df..00000000000 --- a/springfox-swagger-common/src/test/groovy/springfox/documentation/swagger/readers/parameter/ApiParamParameterBuilderSpec.groovy +++ /dev/null @@ -1,269 +0,0 @@ -/* - * - * Copyright 2015-2019 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.swagger.readers.parameter - - -import com.fasterxml.classmate.ResolvedType -import com.fasterxml.classmate.TypeResolver -import org.springframework.core.MethodParameter -import org.springframework.mock.env.MockEnvironment -import spock.lang.Unroll -import springfox.documentation.schema.DefaultGenericTypeNamingStrategy -import springfox.documentation.schema.EnumerationFacet -import springfox.documentation.schema.JacksonEnumTypeDeterminer -import springfox.documentation.schema.ModelSpecification -import springfox.documentation.schema.NumericElementFacet -import springfox.documentation.schema.ScalarType -import springfox.documentation.service.AllowableListValues -import springfox.documentation.service.AllowableRangeValues -import springfox.documentation.service.ParameterType -import springfox.documentation.service.ResolvedMethodParameter -import springfox.documentation.spi.DocumentationType -import springfox.documentation.spi.service.contexts.OperationContext -import springfox.documentation.spi.service.contexts.ParameterContext -import springfox.documentation.spring.web.DescriptionResolver -import springfox.documentation.spring.web.dummy.DummyClass -import springfox.documentation.spring.web.mixins.ModelProviderForServiceSupport -import springfox.documentation.spring.web.mixins.RequestMappingSupport -import springfox.documentation.spring.web.plugins.DocumentationContextSpec - -class ApiParamParameterBuilderSpec - extends DocumentationContextSpec - implements ApiParamAnnotationSupport, - RequestMappingSupport, - ModelProviderForServiceSupport { - - def descriptions = new DescriptionResolver(new MockEnvironment()) - - def "enum types"() { - given: - MethodParameter methodParameter = new MethodParameter(handlerMethod.getMethod(), 0) - def resolvedMethodParameter = new ResolvedMethodParameter("default", methodParameter, - new TypeResolver().resolve(handlerMethod.methodParameters[0].getParameterType())) - def genericNamingStrategy = new DefaultGenericTypeNamingStrategy() - ParameterContext parameterContext = new ParameterContext( - resolvedMethodParameter, - documentationContext(), - genericNamingStrategy, - Mock(OperationContext), 0) - - when: - ApiParamParameterBuilder operationCommand = - new ApiParamParameterBuilder( - descriptions, - new JacksonEnumTypeDeterminer()) - operationCommand.apply(parameterContext) - AllowableListValues allowableValues = parameterContext.parameterBuilder().build() - .allowableValues as AllowableListValues - EnumerationFacet facet = parameterContext.requestParameterBuilder() - .name("test") - .in(ParameterType.QUERY) - .query { q -> q.model { it.scalarModel(ScalarType.STRING) } } - .build() - .parameterSpecification - .query - .orElse(null) - ?.facetOfType(EnumerationFacet) - ?.orElse(null) - - - then: - allowableValues != null - allowableValues.getValueType() == "LIST" - allowableValues.getValues() == ["PRODUCT", "SERVICE"] - - and: - facet != null - facet.allowedValues == ["PRODUCT", "SERVICE"] - - where: - handlerMethod | expected - dummyHandlerMethod('methodWithSingleEnum', DummyClass.BusinessType.class) | AllowableListValues - dummyHandlerMethod('methodWithSingleEnumArray', DummyClass.BusinessType[].class) | AllowableListValues - } - - @Unroll - def "Api annotation with list type"() { - given: - def resolvedMethodParameter = new ResolvedMethodParameter(0, "", [apiParamAnnotation], stubbedResolvedType()) - def genericNamingStrategy = new DefaultGenericTypeNamingStrategy() - ParameterContext parameterContext = - new ParameterContext( - resolvedMethodParameter, - documentationContext(), - genericNamingStrategy, - Mock(OperationContext), 0) - - when: - ApiParamParameterBuilder operationCommand = stubbedParamBuilder() - operationCommand.apply(parameterContext) - - AllowableListValues allowableValues = parameterContext.parameterBuilder().build().allowableValues as AllowableListValues - EnumerationFacet facet = parameterContext.requestParameterBuilder() - .name("test") - .in(ParameterType.QUERY) - .query { q -> q.model { it.scalarModel(ScalarType.STRING) } } - .build() - .parameterSpecification - .query - .orElse(null) - ?.facetOfType(EnumerationFacet) - ?.orElse(null) - - then: - allowableValues.getValueType() == "LIST" - allowableValues.getValues() == expected - - and: - facet?.allowedValues == expected - - where: - apiParamAnnotation | expected - apiParamWithAllowableValues("1, 2") | ['1', '2'] - apiParamWithAllowableValues("1,2,3,4") | ['1', '2', '3', '4'] - apiParamWithAllowableValues("1,2, ,4") | ['1', '2', '4'] - apiParamWithAllowableValues("1") | ['1'] - } - - @Unroll - def "Api annotation with type and format"() { - given: - def resolvedMethodParameter = new ResolvedMethodParameter( - 0, - "", - [apiParamAnnotation], - stubbedResolvedType()) - - def genericNamingStrategy = new DefaultGenericTypeNamingStrategy() - ParameterContext parameterContext = - new ParameterContext( - resolvedMethodParameter, - documentationContext(), - genericNamingStrategy, - Mock(OperationContext), 0) - - when: - ApiParamParameterBuilder operationCommand = stubbedParamBuilder() - parameterContext.requestParameterBuilder() - .query { q -> q.model { it.scalarModel(ScalarType.BIGDECIMAL) } } - operationCommand.apply(parameterContext) - - ModelSpecification model = parameterContext.requestParameterBuilder() - .name("test") - .in(ParameterType.QUERY) - .build() - .parameterSpecification - .query - .orElse(null) - ?.model - - then: - model.scalar.get().type == expected - - where: - apiParamAnnotation | expected - apiParamWithType("string", "") | ScalarType.STRING - apiParamWithType("integer", "int64") | ScalarType.LONG - apiParamWithType("string", "password") | ScalarType.PASSWORD - apiParamWithType("", "") | ScalarType.BIGDECIMAL //Default value - } - - @Unroll("Range: #min | #max") - def "Api annotation with ranges"() { - given: - def resolvedMethodParameter = new ResolvedMethodParameter(0, "", [apiParamAnnotation], stubbedResolvedType()) - def genericNamingStrategy = new DefaultGenericTypeNamingStrategy() - ParameterContext parameterContext = new ParameterContext( - resolvedMethodParameter, - documentationContext(), - genericNamingStrategy, - Mock(OperationContext), 0) - - when: - ApiParamParameterBuilder operationCommand = stubbedParamBuilder() - operationCommand.apply(parameterContext) - AllowableRangeValues allowableValues = parameterContext.parameterBuilder().build().allowableValues as AllowableRangeValues - NumericElementFacet facet = parameterContext.requestParameterBuilder() - .name("test") - .in(ParameterType.QUERY) - .query { q -> q.model { it.scalarModel(ScalarType.STRING) } } - .build() - .parameterSpecification - .query - .orElse(null) - ?.facetOfType(NumericElementFacet) - ?.orElse(null) - - then: - allowableValues.min == min as String - allowableValues.max == max as String - allowableValues.exclusiveMax == exclusiveMax - allowableValues.exclusiveMin == exclusiveMin - - and: - facet?.minimum == (min != null ? BigDecimal.valueOf(min) : null) - facet?.maximum == (max != null ? BigDecimal.valueOf(max) : null) - facet?.exclusiveMaximum == exclusiveMax - facet?.exclusiveMinimum == exclusiveMin - - where: - apiParamAnnotation | min | max | exclusiveMin | exclusiveMax - apiParamWithAllowableValues("range[1,5]") | 1 | 5 | false | false - apiParamWithAllowableValues("range[ 1, 5 ]") | 1 | 5 | false | false - apiParamWithAllowableValues("range [ 1, 5 ]") | 1 | 5 | false | false - apiParamWithAllowableValues("range[1, 1]") | 1 | 1 | false | false - apiParamWithAllowableValues(" range(1,2)") | 1 | 2 | true | true - apiParamWithAllowableValues("range[1,2) ") | 1 | 2 | false | true - apiParamWithAllowableValues("range(1,2]") | 1 | 2 | true | false - apiParamWithAllowableValues(" range( -infinity, infinity ) ") | null | null | true | true - apiParamWithAllowableValues("range[-infinity,infinity]") | null | null | false | false - apiParamWithAllowableValues("range(infinity,-infinity)") | null | null | true | true - apiParamWithAllowableValues("range[infinity,-infinity]") | null | null | false | false - apiParamWithAllowableValues("range[2," + Integer.MAX_VALUE + "]") | 2 | Integer.MAX_VALUE | false | false - } - - def "supports all swagger types"() { - given: - ApiParamParameterBuilder sut = - new ApiParamParameterBuilder( - descriptions, - new JacksonEnumTypeDeterminer() - ) - - expect: - sut.supports(documentationType) - - where: - documentationType << [DocumentationType.SWAGGER_12, DocumentationType.SWAGGER_2] - } - - def stubbedParamBuilder() { - new ApiParamParameterBuilder( - descriptions, - new JacksonEnumTypeDeterminer() - ) - } - - def stubbedResolvedType() { - def resolvedType = Mock(ResolvedType) - resolvedType.getErasedType() >> Object.class - return resolvedType - } -} diff --git a/springfox-swagger-common/src/test/groovy/springfox/documentation/swagger/readers/parameter/ExamplesSpec.groovy b/springfox-swagger-common/src/test/groovy/springfox/documentation/swagger/readers/parameter/ExamplesSpec.groovy deleted file mode 100644 index d5f09419c71..00000000000 --- a/springfox-swagger-common/src/test/groovy/springfox/documentation/swagger/readers/parameter/ExamplesSpec.groovy +++ /dev/null @@ -1,129 +0,0 @@ -/* - * - * Copyright 2017-2019 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ -package springfox.documentation.swagger.readers.parameter - -import io.swagger.annotations.Example -import io.swagger.annotations.ExampleProperty -import spock.lang.Specification - - -class ExamplesSpec extends Specification { - def "cannot instantiate"() { - when: - new Examples() - - then: - thrown(UnsupportedOperationException) - } - - def "renders examples annotations"() { - when: - def examples = Examples.examples(examples()) - - then: - examples.size() == 1 - examples.containsKey("application/json") - examples.get("application/json").size() == 1 - - } - - def "when example is blank it is ignored"() { - when: - def examples = Examples.examples(examplesWithBlankValue()) - - then: - examples.size() == 0 - } - - def "renders examples annotations with blank media type"() { - when: - def examples = Examples.examples(examplesWithBlankMediaType()) - - then: - examples.size() == 1 - examples.containsKey("") - examples.get("").size() == 1 - !examples.get("").first().mediaType.isPresent() - examples.get("").first().value == "{'hello': 'world'}" - } - - def "renders examples annotations with null media type"() { - when: - def examples = Examples.examples(examplesWithNullMediaType()) - - then: - examples.size() == 1 - examples.containsKey(null) - examples.get(null).size() == 1 - !examples.get(null).first().mediaType.isPresent() - examples.get(null).first().value == "{'hello': 'world'}" - } - - Example examples() { - [ - value: { -> - [ - [ - mediaType: { -> "application/json" }, - value : { -> "{'hello': 'world'}" } - ] - ] as ExampleProperty[] - } - ] as Example - } - - Example examplesWithBlankValue() { - [ - value: { -> - [ - [ - mediaType: { -> "application/json" }, - value : { -> "" } - ] - ] as ExampleProperty[] - } - ] as Example - } - - Example examplesWithBlankMediaType() { - [ - value: { -> - [ - [ - mediaType: { -> "" }, - value : { -> "{'hello': 'world'}" } - ] - ] as ExampleProperty[] - } - ] as Example - } - - Example examplesWithNullMediaType() { - [ - value: { -> - [ - [ - mediaType: { -> null }, - value : { -> "{'hello': 'world'}" } - ] - ] as ExampleProperty[] - } - ] as Example - } -} diff --git a/springfox-swagger-common/src/test/groovy/springfox/documentation/swagger/readers/parameter/ModelAttributeParameterExpanderSpec.groovy b/springfox-swagger-common/src/test/groovy/springfox/documentation/swagger/readers/parameter/ModelAttributeParameterExpanderSpec.groovy deleted file mode 100644 index 59518a63df6..00000000000 --- a/springfox-swagger-common/src/test/groovy/springfox/documentation/swagger/readers/parameter/ModelAttributeParameterExpanderSpec.groovy +++ /dev/null @@ -1,125 +0,0 @@ -/* - * - * Copyright 2015-2019 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License") - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.swagger.readers.parameter - -import com.fasterxml.classmate.TypeResolver -import org.joda.time.LocalDateTime -import org.springframework.beans.factory.annotation.Autowired -import springfox.documentation.schema.AlternateTypeRule -import springfox.documentation.schema.JacksonEnumTypeDeterminer -import springfox.documentation.schema.WildcardType -import springfox.documentation.schema.property.bean.AccessorsProvider -import springfox.documentation.schema.property.field.FieldProvider -import springfox.documentation.spi.DocumentationType -import springfox.documentation.spi.service.DefaultsProviderPlugin -import springfox.documentation.spi.service.contexts.Defaults -import springfox.documentation.spi.service.contexts.DocumentationContextBuilder -import springfox.documentation.spring.web.dummy.models.ModelAttributeWithHiddenParametersExample -import springfox.documentation.spring.web.paths.DefaultPathProvider -import springfox.documentation.spring.web.plugins.DefaultConfiguration -import springfox.documentation.spring.web.plugins.DocumentationContextSpec -import springfox.documentation.spring.web.readers.parameter.ExpansionContext -import springfox.documentation.spring.web.readers.parameter.ModelAttributeParameterExpander -import springfox.documentation.swagger.mixins.SwaggerPluginsSupport - -import static springfox.documentation.schema.AlternateTypeRules.* - -class ModelAttributeParameterExpanderSpec extends DocumentationContextSpec implements SwaggerPluginsSupport { - TypeResolver typeResolver - ModelAttributeParameterExpander sut - - def setup() { - typeResolver = new TypeResolver() - plugin.alternateTypeRules( - newRule( - typeResolver.resolve(LocalDateTime), - typeResolver.resolve(String))) - - sut = new ModelAttributeParameterExpander( - new FieldProvider(typeResolver), - new AccessorsProvider(typeResolver), - new JacksonEnumTypeDeterminer()) - - sut.pluginsManager = swaggerServicePlugins([ - new SwaggerDefaults( - new Defaults(), - new TypeResolver() - )]) - } - - def "shouldn't expand hidden parameters"() { - when: - def parameters = sut.expand( - new ExpansionContext( - "", - typeResolver.resolve(ModelAttributeWithHiddenParametersExample), - context())) - .collect { it -> it.legacy.get() } - - then: - parameters.size() == 7 - parameters.find { it.name == 'modelAttributeProperty' } - parameters.find { it.name == 'stringProp' } - parameters.find { it.name == 'intProp' } - parameters.find { it.name == 'listProp' } - parameters.find { it.name == 'arrayProp' } - parameters.find { it.name == 'complexProp.name' } - parameters.find { it.name == 'accountTypes' } - } - - class SwaggerDefaults implements DefaultsProviderPlugin { - private final DefaultConfiguration defaultConfiguration - private TypeResolver typeResolver - - @Autowired - SwaggerDefaults(Defaults defaults, TypeResolver typeResolver) { - this.typeResolver = typeResolver - defaultConfiguration = new DefaultConfiguration( - defaults, - typeResolver, - new DefaultPathProvider()) - } - - @Override - DocumentationContextBuilder create(DocumentationType documentationType) { - List rules = new ArrayList<>() - rules.add(newRule(typeResolver.resolve(Map.class, String.class, String.class), - typeResolver.resolve(Object.class))) - rules.add(newMapRule(WildcardType.class, WildcardType.class)) - return defaultConfiguration - .create(documentationType) - .rules(rules) - } - - @Override - DocumentationContextBuilder apply(DocumentationContextBuilder builder) { - List rules = new ArrayList<>() - rules.add(newRule(typeResolver.resolve(Map.class, String.class, String.class), - typeResolver.resolve(Object.class))) - rules.add(newMapRule(WildcardType.class, WildcardType.class)) - return builder.rules(rules) - } - - @Override - boolean supports(DocumentationType delimiter) { - return true - } - } -} diff --git a/springfox-swagger-common/src/test/groovy/springfox/documentation/swagger/readers/parameter/ParameterAnnotationReaderSpec.groovy b/springfox-swagger-common/src/test/groovy/springfox/documentation/swagger/readers/parameter/ParameterAnnotationReaderSpec.groovy deleted file mode 100644 index 106421366e3..00000000000 --- a/springfox-swagger-common/src/test/groovy/springfox/documentation/swagger/readers/parameter/ParameterAnnotationReaderSpec.groovy +++ /dev/null @@ -1,76 +0,0 @@ -/* - * - * Copyright 2015-2019 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.swagger.readers.parameter - -import io.swagger.annotations.ApiParam -import org.springframework.core.MethodParameter -import spock.lang.Specification - -import java.lang.reflect.Method - -import static org.springframework.util.StringUtils.* - -class ParameterAnnotationReaderSpec extends Specification { - - class A implements B, D { - - void method1(param) {} - void method2(@ApiParam("param2") param) {} - void method3(param) {} - void method4(param) {} - void method5(param) { } - } - - interface B extends C{ - void method1(@ApiParam(name = "param1") param); - } - - interface C { - void method3(@ApiParam(name = "param3") param); - } - - interface D extends E { - void method4(@ApiParam(name = "param4")param); - } - - interface E { - void method5(param); - } - - def "Parameter annotations walk up the object interface hierarchy" () { - given: - Method method = A.class.methods.find { it.name.equals(methodName)} - MethodParameter methodParameter = Stub(MethodParameter) - methodParameter.getMethod() >> method - methodParameter.getParameterIndex() >> 0 - when: - Optional annotation = ParameterAnnotationReader.fromHierarchy(methodParameter, ApiParam.class) - then: - annotation.isPresent() == hasLength(expected) - !annotation.isPresent() || annotation.get().name() == expected - where: - methodName | expected - "method1" | "param1" - "method2" | "" - "method3" | "param3" - "method4" | "param4" - "method5" | "" - } -} diff --git a/springfox-swagger-common/src/test/groovy/springfox/documentation/swagger/readers/parameter/ParameterMultiplesReaderSpec.groovy b/springfox-swagger-common/src/test/groovy/springfox/documentation/swagger/readers/parameter/ParameterMultiplesReaderSpec.groovy deleted file mode 100644 index 3ed8474562c..00000000000 --- a/springfox-swagger-common/src/test/groovy/springfox/documentation/swagger/readers/parameter/ParameterMultiplesReaderSpec.groovy +++ /dev/null @@ -1,87 +0,0 @@ -/* - * - * Copyright 2015-2017 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.swagger.readers.parameter - -import com.fasterxml.classmate.ResolvedType -import com.fasterxml.classmate.TypeResolver -import io.swagger.annotations.ApiParam -import org.springframework.core.MethodParameter -import org.springframework.mock.env.MockEnvironment -import spock.lang.Unroll -import springfox.documentation.schema.DefaultGenericTypeNamingStrategy -import springfox.documentation.schema.JacksonEnumTypeDeterminer -import springfox.documentation.service.ResolvedMethodParameter -import springfox.documentation.spi.service.contexts.OperationContext -import springfox.documentation.spi.service.contexts.ParameterContext -import springfox.documentation.spring.web.DescriptionResolver -import springfox.documentation.spring.web.dummy.DummyClass -import springfox.documentation.spring.web.mixins.ModelProviderForServiceSupport -import springfox.documentation.spring.web.mixins.RequestMappingSupport -import springfox.documentation.spring.web.plugins.DocumentationContextSpec - -class ParameterMultiplesReaderSpec - extends DocumentationContextSpec - implements RequestMappingSupport, - ApiParamAnnotationSupport, - ModelProviderForServiceSupport { - - def descriptions = new DescriptionResolver(new MockEnvironment()) - - @Unroll - def "param multiples for swagger reader"() { - given: - MethodParameter methodParameter = Stub(MethodParameter) - methodParameter.getParameterAnnotation(ApiParam.class) >> apiParamAnnotation - methodParameter.getParameterType() >> paramType - ResolvedType resolvedType = paramType != null ? new TypeResolver().resolve(paramType) : null - ResolvedMethodParameter resolvedMethodParameter = new ResolvedMethodParameter("", methodParameter, resolvedType) - def genericNamingStrategy = new DefaultGenericTypeNamingStrategy() - ParameterContext parameterContext = new ParameterContext(resolvedMethodParameter, - documentationContext(), genericNamingStrategy, Mock(OperationContext), 0) - - when: - def operationCommand = stubbedParamBuilder(); - operationCommand.apply(parameterContext) - - then: - parameterContext.parameterBuilder().build().isAllowMultiple() == expected - (parameterContext.requestParameterBuilder().build() - ?.parameterSpecification - ?.query - ?.orElse(null) - ?.collectionFormat != null) == expected - where: - apiParamAnnotation | paramType | expected - apiParamWithAllowMultiple(false) | String[].class | false - apiParamWithAllowMultiple(false) | DummyClass.BusinessType[].class | false - null | String[].class | false - null | List.class | false - null | Collection.class | false - null | Set.class | false - null | Vector.class | false - null | Object[].class | false - null | Integer.class | false - null | Iterable.class | false - } - - def stubbedParamBuilder() { - new ApiParamParameterBuilder(descriptions, new JacksonEnumTypeDeterminer()) - } -} diff --git a/springfox-swagger-common/src/test/groovy/springfox/documentation/swagger/readers/parameter/ParameterNameReaderSpec.groovy b/springfox-swagger-common/src/test/groovy/springfox/documentation/swagger/readers/parameter/ParameterNameReaderSpec.groovy deleted file mode 100644 index 4127405cead..00000000000 --- a/springfox-swagger-common/src/test/groovy/springfox/documentation/swagger/readers/parameter/ParameterNameReaderSpec.groovy +++ /dev/null @@ -1,89 +0,0 @@ -/* - * - * Copyright 2015-2017 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.swagger.readers.parameter - -import com.fasterxml.classmate.TypeResolver -import org.springframework.mock.env.MockEnvironment -import spock.lang.Unroll -import springfox.documentation.schema.DefaultGenericTypeNamingStrategy -import springfox.documentation.schema.JacksonEnumTypeDeterminer -import springfox.documentation.service.ParameterType -import springfox.documentation.service.ResolvedMethodParameter -import springfox.documentation.spi.DocumentationType -import springfox.documentation.spi.service.contexts.OperationContext -import springfox.documentation.spi.service.contexts.ParameterContext -import springfox.documentation.spring.web.DescriptionResolver -import springfox.documentation.spring.web.mixins.ModelProviderForServiceSupport -import springfox.documentation.spring.web.mixins.RequestMappingSupport -import springfox.documentation.spring.web.plugins.DocumentationContextSpec - -class ParameterNameReaderSpec - extends DocumentationContextSpec - implements RequestMappingSupport, - ApiParamAnnotationSupport, - ModelProviderForServiceSupport { - - def descriptions = new DescriptionResolver(new MockEnvironment()) - def enumTypeDeterminer = new JacksonEnumTypeDeterminer() - - def "Should all swagger documentation types"() { - given: - def sut = new ApiParamParameterBuilder( - descriptions, - enumTypeDeterminer) - - expect: - !sut.supports(DocumentationType.SPRING_WEB) - sut.supports(DocumentationType.SWAGGER_12) - sut.supports(DocumentationType.SWAGGER_2) - } - - @Unroll - def "param required"() { - given: - def resolvedMethodParameter = - new ResolvedMethodParameter(0, "someName", [apiParam], new TypeResolver().resolve(Object.class)) - def genericNamingStrategy = new DefaultGenericTypeNamingStrategy() - ParameterContext parameterContext = new ParameterContext( - resolvedMethodParameter, - documentationContext(), - genericNamingStrategy, - Mock(OperationContext), 0) - - when: - def sut = nameReader() - sut.apply(parameterContext) - - then: - parameterContext.parameterBuilder().build().name == expectedName - parameterContext.requestParameterBuilder() - .in(ParameterType.QUERY) - .build()?.name == expectedName - - where: - apiParam | paramType | expectedName - apiParamWithNameAndValue("bodyParam", "body Param") | "body" | "bodyParam" - null | "body" | null - } - - def nameReader() { - new ApiParamParameterBuilder(descriptions, enumTypeDeterminer) - } -} diff --git a/springfox-swagger-common/src/test/groovy/springfox/documentation/swagger/readers/parameter/ParameterReaderSpec.groovy b/springfox-swagger-common/src/test/groovy/springfox/documentation/swagger/readers/parameter/ParameterReaderSpec.groovy deleted file mode 100644 index 75f06433483..00000000000 --- a/springfox-swagger-common/src/test/groovy/springfox/documentation/swagger/readers/parameter/ParameterReaderSpec.groovy +++ /dev/null @@ -1,99 +0,0 @@ -/* - * - * Copyright 2015-2017 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.swagger.readers.parameter - -import com.fasterxml.classmate.TypeResolver -import org.springframework.mock.env.MockEnvironment -import spock.lang.Unroll -import springfox.documentation.schema.DefaultGenericTypeNamingStrategy -import springfox.documentation.schema.JacksonEnumTypeDeterminer -import springfox.documentation.service.ParameterType -import springfox.documentation.service.ResolvedMethodParameter -import springfox.documentation.spi.DocumentationType -import springfox.documentation.spi.service.contexts.OperationContext -import springfox.documentation.spi.service.contexts.ParameterContext -import springfox.documentation.spring.web.DescriptionResolver -import springfox.documentation.spring.web.mixins.ModelProviderForServiceSupport -import springfox.documentation.spring.web.mixins.RequestMappingSupport -import springfox.documentation.spring.web.plugins.DocumentationContextSpec - -class ParameterReaderSpec - extends DocumentationContextSpec - implements RequestMappingSupport, - ApiParamAnnotationSupport, - ModelProviderForServiceSupport { - def descriptions = new DescriptionResolver(new MockEnvironment()) - def enumTypeDeterminer = new JacksonEnumTypeDeterminer() - - @Unroll("property #resultProperty expected: #expected") - def "should set basic properties based on ApiParam annotation or a sensible default"() { - given: - def nonNullAnnotations = [apiParamAnnotation, reqParamAnnot].findAll { it != null } - def resolvedMethodParameter = - new ResolvedMethodParameter( - 0, - "default", - nonNullAnnotations, - new TypeResolver().resolve(Object.class)) - def genericNamingStrategy = new DefaultGenericTypeNamingStrategy() - ParameterContext parameterContext = new ParameterContext(resolvedMethodParameter, - documentationContext(), genericNamingStrategy, Mock(OperationContext), 0) - def sut = stubbedParamBuilder() - - when: - sut.apply(parameterContext) - - then: - parameterContext.parameterBuilder().build()."$resultProperty" == expected - if (nestedSimpleProperty) { - parameterContext.requestParameterBuilder() - .name("test") - .in(ParameterType.QUERY) - .build() - .parameterSpecification - .query - ?.orElse(null) - ?."$resultProperty" == expected - } else if (!nestedSimpleProperty) { - def built = parameterContext.requestParameterBuilder().build() - if (built.hasProperty("$resultProperty")) { - built."$resultProperty" == expected - } - } - - and: - !sut.supports(DocumentationType.SPRING_WEB) - sut.supports(DocumentationType.SWAGGER_12) - sut.supports(DocumentationType.SWAGGER_2) - sut.supports(DocumentationType.OAS_30) - - where: - resultProperty | nestedSimpleProperty | apiParamAnnotation | reqParamAnnot | expected - 'description' | false | null | null | null - 'name' | false | apiParamWithNameAndValue("AnDesc", "") | null | 'AnDesc' - 'description' | false | apiParamWithNameAndValue("", "AnDesc") | null | 'AnDesc' - 'defaultValue' | true | apiParamWithDefault('defl') | null | 'defl' - 'paramAccess' | null | apiParamWithAccess('myAccess') | null | 'myAccess' - } - - def stubbedParamBuilder() { - new ApiParamParameterBuilder(descriptions, enumTypeDeterminer) - } -} diff --git a/springfox-swagger-common/src/test/groovy/springfox/documentation/swagger/readers/parameter/ParameterRequiredReaderSpec.groovy b/springfox-swagger-common/src/test/groovy/springfox/documentation/swagger/readers/parameter/ParameterRequiredReaderSpec.groovy deleted file mode 100644 index 47f2fb576ee..00000000000 --- a/springfox-swagger-common/src/test/groovy/springfox/documentation/swagger/readers/parameter/ParameterRequiredReaderSpec.groovy +++ /dev/null @@ -1,105 +0,0 @@ -/* - * - * Copyright 2015-2017 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.swagger.readers.parameter - -import com.fasterxml.classmate.TypeResolver -import org.springframework.mock.env.MockEnvironment -import spock.lang.Unroll -import springfox.documentation.schema.DefaultGenericTypeNamingStrategy -import springfox.documentation.schema.JacksonEnumTypeDeterminer -import springfox.documentation.service.ParameterType -import springfox.documentation.service.ResolvedMethodParameter -import springfox.documentation.spi.service.contexts.OperationContext -import springfox.documentation.spi.service.contexts.ParameterContext -import springfox.documentation.spring.web.DescriptionResolver -import springfox.documentation.spring.web.mixins.RequestMappingSupport -import springfox.documentation.spring.web.plugins.DocumentationContextSpec - -class ParameterRequiredReaderSpec - extends DocumentationContextSpec - implements RequestMappingSupport, - ApiParamAnnotationSupport { - def descriptions = new DescriptionResolver(new MockEnvironment()) - def enumTypeDeterminer = new JacksonEnumTypeDeterminer() - - def "parameters required using default reader"() { - given: - def parameterContext = setupParameterContext(paramAnnotation) - - when: - def operationCommand = stubbedParamBuilder() - operationCommand.apply(parameterContext) - - then: - parameterContext.parameterBuilder().build().isRequired() == expected - parameterContext.requestParameterBuilder() - .name("test") - .in(ParameterType.QUERY) - .build().required == expected - - where: - paramAnnotation | expected - apiParamWithRequired(false) | false - apiParamWithRequired(true) | true - null | false - } - - @Unroll - def "parameters hidden using default reader"() { - given: - def parameterContext = setupParameterContext(paramAnnotation) - - when: - def operationCommand = stubbedParamBuilder() - operationCommand.apply(parameterContext) - - then: - parameterContext.parameterBuilder().build().isHidden() == expected - parameterContext.requestParameterBuilder() - .name("test") - .in(ParameterType.QUERY) - .build().hidden == expected - - where: - paramAnnotation | expected - apiParamWithHidden(false) | false - apiParamWithHidden(true) | true - null | false - } - - def setupParameterContext(paramAnnotation) { - def resolvedMethodParameter = new ResolvedMethodParameter( - 0, - "", - [paramAnnotation], - new TypeResolver().resolve(Object.class)) - def genericNamingStrategy = new DefaultGenericTypeNamingStrategy() - new ParameterContext( - resolvedMethodParameter - , - documentationContext(), - genericNamingStrategy, - Mock(OperationContext), 0) - } - - def stubbedParamBuilder() { - new ApiParamParameterBuilder(descriptions, enumTypeDeterminer) - } -} diff --git a/springfox-swagger-common/src/test/groovy/springfox/documentation/swagger/readers/parameter/SwaggerExpandedParameterBuilderSpec.groovy b/springfox-swagger-common/src/test/groovy/springfox/documentation/swagger/readers/parameter/SwaggerExpandedParameterBuilderSpec.groovy deleted file mode 100644 index 92105b0403c..00000000000 --- a/springfox-swagger-common/src/test/groovy/springfox/documentation/swagger/readers/parameter/SwaggerExpandedParameterBuilderSpec.groovy +++ /dev/null @@ -1,117 +0,0 @@ -/* - * - * Copyright 2015-2017 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ -package springfox.documentation.swagger.readers.parameter - -import com.fasterxml.classmate.TypeResolver -import com.fasterxml.classmate.members.ResolvedField -import io.swagger.annotations.ApiModelProperty -import io.swagger.annotations.ApiParam -import org.springframework.mock.env.MockEnvironment -import spock.lang.Shared -import spock.lang.Specification -import spock.lang.Unroll -import springfox.documentation.builders.ParameterBuilder -import springfox.documentation.builders.RequestParameterBuilder -import springfox.documentation.schema.ExampleEnum -import springfox.documentation.schema.JacksonEnumTypeDeterminer -import springfox.documentation.schema.property.field.FieldProvider -import springfox.documentation.spi.DocumentationType -import springfox.documentation.spi.service.contexts.ParameterExpansionContext -import springfox.documentation.spring.web.DescriptionResolver -import springfox.documentation.spring.web.readers.parameter.ModelAttributeParameterMetadataAccessor - -class SwaggerExpandedParameterBuilderSpec extends Specification { - @Shared - def resolver = new TypeResolver() - - @Unroll - def "Swagger parameter expander reads field #field.name as #expectedName "() { - given: - def env = new DescriptionResolver(new MockEnvironment()) - SwaggerExpandedParameterBuilder sut = new SwaggerExpandedParameterBuilder(env, new JacksonEnumTypeDeterminer()) - - and: - def builderWithDefaultName = new ParameterBuilder().name(field.name) - - and: - ParameterExpansionContext context = new ParameterExpansionContext( - "Test", - "", - "", - new ModelAttributeParameterMetadataAccessor( - [field.rawMember], - field.type, - field.name), - DocumentationType.SWAGGER_12, - builderWithDefaultName, - new RequestParameterBuilder()) - - when: - sut.apply(context) - def param = context.parameterBuilder.build() - - then: - param != null - param.name == expectedName - - and: - sut.supports(DocumentationType.SWAGGER_12) - sut.supports(DocumentationType.SWAGGER_2) - !sut.supports(DocumentationType.SPRING_WEB) - - where: - field | expectedName - named("a") | "a" - named("b") | "b1" - named("c") | "c2" - named("d") | "d3" - named("f") | "f4" - } - - def named(String name) { - def resolver = new TypeResolver() - FieldProvider fieldProvider = new FieldProvider(resolver) - for (ResolvedField field : fieldProvider.in(resolver.resolve(A))) { - if (field.name == name) { - return field - } - } - } - - class A { - public String a; - - @ApiModelProperty(name = "b1") - public String b; - - @ApiParam(name = "c2", allowableValues = "a, b, c") - public String c; - - @ApiModelProperty(name = "d3") - public D d; - - @ApiModelProperty(name = "f4") - public ExampleEnum f; - } - - class D { - @ApiModelProperty(name = "e") - public String e; - } -} diff --git a/springfox-swagger-common/src/test/groovy/springfox/documentation/swagger/schema/ApiModelBuilderSpec.groovy b/springfox-swagger-common/src/test/groovy/springfox/documentation/swagger/schema/ApiModelBuilderSpec.groovy deleted file mode 100644 index 12aa4bce03c..00000000000 --- a/springfox-swagger-common/src/test/groovy/springfox/documentation/swagger/schema/ApiModelBuilderSpec.groovy +++ /dev/null @@ -1,83 +0,0 @@ -/* - * - * Copyright 2016-2019 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ -package springfox.documentation.swagger.schema - -import com.fasterxml.classmate.TypeResolver -import io.swagger.annotations.ApiModel -import spock.lang.Shared -import spock.lang.Specification -import springfox.documentation.schema.TypeNameExtractor; -import springfox.documentation.schema.DefaultGenericTypeNamingStrategy -import springfox.documentation.schema.property.ModelSpecificationFactory -import springfox.documentation.spi.DocumentationType -import springfox.documentation.spi.schema.AlternateTypeProvider -import springfox.documentation.spi.schema.contexts.ModelContext -import springfox.documentation.spi.schema.EnumTypeDeterminer; - -import static java.util.Collections.* - -class ApiModelBuilderSpec extends Specification { - @Shared def resolver = new TypeResolver() - - def "Should all swagger documentation types"() { - given: - def sut = new ApiModelBuilder( - resolver, - Mock(TypeNameExtractor), - Mock(EnumTypeDeterminer), - Mock(ModelSpecificationFactory)) - expect: - !sut.supports(DocumentationType.SPRING_WEB) - sut.supports(DocumentationType.SWAGGER_12) - sut.supports(DocumentationType.SWAGGER_2) - } - - def "Api model builder parses ApiModel annotation as expected" () { - given: - ApiModelBuilder sut = new ApiModelBuilder( - resolver, - Mock(TypeNameExtractor), - Mock(EnumTypeDeterminer), - Mock(ModelSpecificationFactory)) - ModelContext context = ModelContext.inputParam( - "0", - "group", - resolver.resolve(type), - Optional.empty(), - new HashSet<>(), - DocumentationType.SWAGGER_12, - new AlternateTypeProvider([]), - new DefaultGenericTypeNamingStrategy(), - emptySet()) - when: - sut.apply(context) - then: - context.builder.build().description == expected - where: - type | expected - String | null - AnnotatedTest | "description" - - } - - @ApiModel(description = "description") - class AnnotatedTest { - - } -} diff --git a/springfox-swagger-common/src/test/groovy/springfox/documentation/swagger/schema/ApiModelPropertyPropertyBuilderSpec.groovy b/springfox-swagger-common/src/test/groovy/springfox/documentation/swagger/schema/ApiModelPropertyPropertyBuilderSpec.groovy deleted file mode 100644 index 477c7213bab..00000000000 --- a/springfox-swagger-common/src/test/groovy/springfox/documentation/swagger/schema/ApiModelPropertyPropertyBuilderSpec.groovy +++ /dev/null @@ -1,300 +0,0 @@ -/* - * - * Copyright 2015-2019 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.swagger.schema - -import com.fasterxml.classmate.TypeResolver -import com.fasterxml.jackson.databind.BeanDescription -import com.fasterxml.jackson.databind.ObjectMapper -import com.fasterxml.jackson.databind.type.TypeFactory -import org.joda.time.LocalDate -import org.springframework.mock.env.MockEnvironment -import org.springframework.plugin.core.OrderAwarePluginRegistry -import org.springframework.plugin.core.PluginRegistry -import spock.lang.Specification -import springfox.documentation.builders.ModelPropertyBuilder -import springfox.documentation.builders.PropertySpecificationBuilder -import springfox.documentation.schema.AlternateTypesSupport -import springfox.documentation.schema.DefaultGenericTypeNamingStrategy -import springfox.documentation.schema.DefaultTypeNameProvider -import springfox.documentation.schema.JacksonEnumTypeDeterminer -import springfox.documentation.schema.TypeNameExtractor -import springfox.documentation.schema.TypeWithAnnotatedGettersAndSetters -import springfox.documentation.schema.mixins.ConfiguredObjectMapperSupport -import springfox.documentation.schema.property.ModelSpecificationFactory -import springfox.documentation.spi.DocumentationType -import springfox.documentation.spi.schema.TypeNameProviderPlugin -import springfox.documentation.spi.schema.contexts.ModelContext -import springfox.documentation.spi.schema.contexts.ModelPropertyContext -import springfox.documentation.spring.web.DescriptionResolver -import springfox.documentation.spring.web.mixins.ServicePluginsSupport - -import static java.util.Collections.* -import static springfox.documentation.schema.ResolvedTypes.* -import static springfox.documentation.spi.DocumentationType.* -import static springfox.documentation.spi.schema.contexts.ModelContext.* - -class ApiModelPropertyPropertyBuilderSpec - extends Specification - implements ServicePluginsSupport, - AlternateTypesSupport, - ConfiguredObjectMapperSupport { - BeanDescription beanDescription - def descriptions = new DescriptionResolver(new MockEnvironment()) - - def setup() { - beanDescription = beanDescription(TypeWithAnnotatedGettersAndSetters) - } - - def "Should all swagger documentation types"() { - given: - def sut = new ApiModelPropertyPropertyBuilder(descriptions, Mock(ModelSpecificationFactory)) - - expect: - !sut.supports(SPRING_WEB) - sut.supports(SWAGGER_12) - sut.supports(SWAGGER_2) - } - - def "ApiModelProperty annotated models get enriched with additional info given a bean property"() { - given: - def modelContext= Mock(ModelContext) - ApiModelPropertyPropertyBuilder sut = new ApiModelPropertyPropertyBuilder( - descriptions, - new ModelSpecificationFactory(Mock(TypeNameExtractor), new JacksonEnumTypeDeterminer())) - def properties = beanDescription.findProperties() - def context = new ModelPropertyContext( - new ModelPropertyBuilder(), - properties.find { it.name == property }, - new TypeResolver(), - modelContext, - new PropertySpecificationBuilder(property)) - - when: - modelContext.view >> Optional.empty() - modelContext.validationGroups >> [] - sut.apply(context) - - and: - def enriched = context.getBuilder().build() - - then: - enriched.allowableValues?.values == allowableValues - enriched.isRequired() == required - enriched.description == description - enriched.readOnly == readOnly - !enriched.isHidden() - - where: - property | required | description | allowableValues | readOnly - "intProp" | true | "int Property Field" | null | false - "boolProp" | false | "bool Property Getter" | null | false - "enumProp" | true | "enum Prop Getter value" | ["ONE"] | false - "readOnlyProp" | false | "readOnly property getter" | null | true - "listOfStrings" | false | "Some description" | null | false - "interfaceProp" | true | "interface Property Field" | null | false - } - - def "ApiModelProperty annotated models get enriched with additional info given an annotated element"() { - given: - def modelContext = Mock(ModelContext) - ApiModelPropertyPropertyBuilder sut = new ApiModelPropertyPropertyBuilder( - descriptions, - Mock(ModelSpecificationFactory)) - def properties = beanDescription.findProperties() - def context = new ModelPropertyContext( - new ModelPropertyBuilder(), new PropertySpecificationBuilder(property), - properties.find { it.name == property }.getter.annotated, - new TypeResolver(), - modelContext) - - when: - modelContext.getDocumentationType() >> SPRING_WEB - sut.apply(context) - - and: - def enriched = context.getBuilder().build() - - then: - enriched.allowableValues?.values == allowableValues - enriched.isRequired() == (required == null ? false : required) - enriched.description == description - enriched.readOnly == (readOnly == null ? false : readOnly) - !enriched.isHidden() - - where: - property | required | description | allowableValues | readOnly - "intProp" | null | null | null | null - "boolProp" | false | "bool Property Getter" | null | false - "enumProp" | true | "enum Prop Getter value" | ["ONE"] | false - "readOnlyProp" | false | "readOnly property getter" | null | true - "listOfStrings" | false | "Some description" | null | false - "interfaceProp" | true | "interface Property Field" | null | false - } - - def "ApiModelProperties marked as hidden properties are respected"() { - given: - ApiModelPropertyPropertyBuilder sut = new ApiModelPropertyPropertyBuilder( - descriptions, - Mock(ModelSpecificationFactory)) - def properties = beanDescription.findProperties() - def context = new ModelPropertyContext( - new ModelPropertyBuilder(), new PropertySpecificationBuilder(property), - properties.find { it.name == property }.getter.annotated, - new TypeResolver(), - Mock(ModelContext)) - - when: - sut.apply(context) - - and: - def enriched = context.getBuilder().build() - - then: - enriched.allowableValues?.values == allowableValues - enriched.isRequired() == required - enriched.description == description - enriched.isHidden() - - where: - property | required | description | allowableValues - "hiddenProp" | false | "" | null - } - - def "Supports ApiModelProperty annotated models with dataType overrides"() { - given: - ApiModelPropertyPropertyBuilder sut = new ApiModelPropertyPropertyBuilder( - descriptions, - Mock(ModelSpecificationFactory)) - def properties = beanDescription.findProperties() - - def resolver = new TypeResolver() - ModelContext modelContext = inputParam( - "0_0", - "group", - resolver.resolve(TypeWithAnnotatedGettersAndSetters), - Optional.empty(), - new HashSet<>(), - SWAGGER_12, - alternateTypeProvider(), - new DefaultGenericTypeNamingStrategy(), - emptySet()) - PluginRegistry modelNameRegistry = - OrderAwarePluginRegistry.of([new DefaultTypeNameProvider()]) - def typeNameExtractor = new TypeNameExtractor( - resolver, - modelNameRegistry, - new JacksonEnumTypeDeterminer()) - def context = new ModelPropertyContext( - new ModelPropertyBuilder(), - new PropertySpecificationBuilder(property), - properties.find { it.name == property }.getter.annotated, - resolver, - Mock(ModelContext)) - - when: - sut.apply(context) - - and: - def enriched = context.getBuilder().build() - enriched.updateModelRef( - modelRefFactory( - modelContext, - new JacksonEnumTypeDeterminer(), - typeNameExtractor)) - - then: - enriched.allowableValues?.values == null - !enriched.isRequired() - enriched.description == "" - !enriched.isHidden() - enriched.type.getErasedType() == dataType - enriched.modelRef.type == modelRef - - where: - property | dataType | modelRef - "validOverride" | String | "string" - "invalidOverride" | Object | "object" - } - - def "Supports ApiModelProperty annotated models with dataType overrides but protects specific types"() { - given: - ApiModelPropertyPropertyBuilder sut = new ApiModelPropertyPropertyBuilder( - descriptions, - Mock(ModelSpecificationFactory)) - def properties = beanDescription.findProperties() - - def resolver = new TypeResolver() - ModelContext modelContext = inputParam( - "0_0", - "group", - resolver.resolve(TypeWithAnnotatedGettersAndSetters), - Optional.empty(), - new HashSet<>(), - SWAGGER_12, - alternateTypeProvider(), - new DefaultGenericTypeNamingStrategy(), - emptySet()) - PluginRegistry modelNameRegistry = - OrderAwarePluginRegistry.of([new DefaultTypeNameProvider()]) - def typeNameExtractor = new TypeNameExtractor( - resolver, - modelNameRegistry, - new JacksonEnumTypeDeterminer()) - def context = new ModelPropertyContext( - new ModelPropertyBuilder(), - new PropertySpecificationBuilder(property), - properties.find { it.name == property }.getter.annotated, - resolver, - Mock(ModelContext)) - - when: - context.builder.type(resolver.resolve(dataType)) - - and: - sut.apply(context) - - and: - def enriched = context.getBuilder().build() - enriched.updateModelRef( - modelRefFactory( - modelContext, - new JacksonEnumTypeDeterminer(), - typeNameExtractor)) - - then: - enriched.allowableValues?.values == null - !enriched.isRequired() - enriched.description == "" - !enriched.isHidden() - enriched.type.getErasedType() == dataType - enriched.modelRef.type == modelRef - - where: - property | dataType | modelRef - "validOverride" | String | "string" - "invalidOverride" | LocalDate | "LocalDate" - } - - BeanDescription beanDescription(Class clazz) { - def objectMapper = new ObjectMapper() - objectMapper.getDeserializationConfig() - .introspect(TypeFactory.defaultInstance().constructType(clazz)) - } -} diff --git a/springfox-swagger-common/src/test/groovy/springfox/documentation/swagger/schema/ApiModelTypeNameProviderSpec.groovy b/springfox-swagger-common/src/test/groovy/springfox/documentation/swagger/schema/ApiModelTypeNameProviderSpec.groovy deleted file mode 100644 index 6ed6e57dd57..00000000000 --- a/springfox-swagger-common/src/test/groovy/springfox/documentation/swagger/schema/ApiModelTypeNameProviderSpec.groovy +++ /dev/null @@ -1,46 +0,0 @@ -/* - * - * Copyright 2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.swagger.schema -import spock.lang.Specification -import springfox.documentation.schema.ExampleWithEnums -import springfox.documentation.schema.TypeWithApiModelAnnotation -import springfox.documentation.schema.TypeWithEmptyApiModelAnnotation -import springfox.documentation.spi.DocumentationType - -class ApiModelTypeNameProviderSpec extends Specification { - def "renders the type names correctly" () { - given: - def sut = new ApiModelTypeNameProvider() - when: - def name = sut.nameFor(clazz) - then: - name == expectedName - and: - !sut.supports(DocumentationType.SPRING_WEB) - sut.supports(DocumentationType.SWAGGER_12) - sut.supports(DocumentationType.SWAGGER_2) - - where: - clazz | expectedName - ExampleWithEnums | "ExampleWithEnums" - TypeWithApiModelAnnotation | "ApiModelTest" - TypeWithEmptyApiModelAnnotation | "TypeWithEmptyApiModelAnnotation" - } -} diff --git a/springfox-swagger-common/src/test/groovy/springfox/documentation/swagger/web/ApiResourceControllerSpec.groovy b/springfox-swagger-common/src/test/groovy/springfox/documentation/swagger/web/ApiResourceControllerSpec.groovy deleted file mode 100644 index 1c886e85285..00000000000 --- a/springfox-swagger-common/src/test/groovy/springfox/documentation/swagger/web/ApiResourceControllerSpec.groovy +++ /dev/null @@ -1,191 +0,0 @@ -/* - * - * Copyright 2017-2019 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ -package springfox.documentation.swagger.web - -import com.fasterxml.jackson.databind.ObjectMapper -import com.fasterxml.jackson.databind.PropertyNamingStrategy -import org.skyscreamer.jsonassert.JSONAssert -import org.skyscreamer.jsonassert.JSONCompareMode -import org.springframework.http.MediaType -import org.springframework.mock.env.MockEnvironment -import org.springframework.test.web.servlet.setup.MockMvcBuilders -import spock.lang.Specification -import springfox.documentation.builders.DocumentationBuilder -import springfox.documentation.service.ApiInfo -import springfox.documentation.spi.DocumentationType -import springfox.documentation.spring.web.DocumentationCache -import springfox.documentation.spring.web.plugins.Docket -import springfox.documentation.spring.web.plugins.DocumentationPluginsManager - -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.* -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.* - -class ApiResourceControllerSpec extends Specification { - def mockMvc - def security = """{ - "clientId": "client", - "clientSecret": "client-secret", - "realm": "real", - "appName": "test", - "scopeSeparator": ",", - "additionalQueryStringParams": {"string":"value","boolean":true,"int":1}, - "useBasicAuthenticationWithAccessCodeGrant": false, - "enableCsrfSupport": true -}""" - def ui = """{ - "deepLinking": true, - "displayOperationId": false, - "defaultModelsExpandDepth": 1, - "defaultModelExpandDepth": 1, - "defaultModelRendering": "example", - "displayRequestDuration": false, - "docExpansion": "none", - "filter": false, - "maxDisplayedTags": 1000, - "operationsSorter": "alpha", - "showExtensions": false, - "showCommonExtensions": false, - "tagsSorter": "alpha", - "supportedSubmitMethods":["get","put","post","delete","options","head","patch","trace"], - "validatorUrl": "/validate" -}""" - def resources = """[ - { - "name": "test", - "url": "/v1?group=test", - "location": "/v1?group=test", - "swaggerVersion": "1.2" - }, - { - "name": "test", - "url": "/v2?group=test", - "location": "/v2?group=test", - "swaggerVersion": "2.0" - } - ]""" - - def sut - - def setup() { - sut = new ApiResourceController(inMemorySwaggerResources(), "/") - sut.with { - securityConfiguration = SecurityConfigurationBuilder.builder() - .clientId("client") - .clientSecret("client-secret") - .realm("real") - .appName("test") - .scopeSeparator(",") - .additionalQueryStringParams(['string': 'value', 'boolean': true, 'int': 1]) - .useBasicAuthenticationWithAccessCodeGrant(false) - .enableCsrfSupport(true) - .build() - uiConfiguration = UiConfigurationBuilder.builder() - .deepLinking(true) - .displayOperationId(false) - .defaultModelsExpandDepth(1) - .defaultModelExpandDepth(1) - .defaultModelRendering(ModelRendering.EXAMPLE) - .displayRequestDuration(false) - .docExpansion(DocExpansion.NONE) - .filter(false) - .maxDisplayedTags(1000) - .operationsSorter(OperationsSorter.ALPHA) - .showExtensions(false) - .showCommonExtensions(false) - .tagsSorter(TagsSorter.ALPHA) - .supportedSubmitMethods(UiConfiguration.Constants.DEFAULT_SUBMIT_METHODS) - .validatorUrl("/validate") - .build() - } - mockMvc = MockMvcBuilders.standaloneSetup(sut).build() - } - - def inMemorySwaggerResources() { - def pluginsManager = Mock(DocumentationPluginsManager) - pluginsManager.documentationPlugins() >> [new Docket(DocumentationType.SWAGGER_2)] - def resources = new InMemorySwaggerResourcesProvider( - mockEnvironment(), - documentationCache(), - pluginsManager) - resources.swagger1Available = true - resources.swagger2Available = true - resources - } - - def mockEnvironment() { - def environment = new MockEnvironment() - environment.withProperty("springfox.documentation.swagger.v1.path", "/v1") - environment.withProperty("springfox.documentation.swagger.v2.path", "/v2") - environment - } - - def documentationCache() { - def cache = new DocumentationCache() - cache.addDocumentation(new DocumentationBuilder() - .name("test") - .basePath("/base") - .resourceListing { - it.apiVersion("1.0") - .info(ApiInfo.DEFAULT) - }.build()) - cache - } - - def "security Configuration is available"() { - expect: - mockMvc.perform(get("/swagger-resources/configuration/security") - .accept(MediaType.APPLICATION_JSON)) - .andExpect(content().json(security)) - } - - def "UI Configuration is available"() { - expect: - mockMvc.perform(get("/swagger-resources/configuration/ui") - .accept(MediaType.APPLICATION_JSON)) - .andExpect(content().json(ui)) - } - - def "Cache is available"() { - expect: - mockMvc.perform(get("/swagger-resources") - .accept(MediaType.APPLICATION_JSON)) - .andExpect(content().json(resources)) - } - - def "Verify that the property naming strategy does not affect output"() { - given: - ObjectMapper mapper = new ObjectMapper() - when: - mapper.setPropertyNamingStrategy(PropertyNamingStrategy.SNAKE_CASE) - - then: - JSONAssert.assertEquals( - security, - mapper.writer().writeValueAsString(sut.securityConfiguration), - JSONCompareMode.NON_EXTENSIBLE) - JSONAssert.assertEquals( - ui, - mapper.writer().writeValueAsString(sut.uiConfiguration), - JSONCompareMode.NON_EXTENSIBLE) - JSONAssert.assertEquals( - resources, - mapper.writer().writeValueAsString(sut.swaggerResources().body), - JSONCompareMode.NON_EXTENSIBLE) - } -} diff --git a/springfox-swagger-common/src/test/groovy/springfox/documentation/swagger/web/InMemorySwaggerResourcesProviderSpec.groovy b/springfox-swagger-common/src/test/groovy/springfox/documentation/swagger/web/InMemorySwaggerResourcesProviderSpec.groovy deleted file mode 100644 index a4331804d08..00000000000 --- a/springfox-swagger-common/src/test/groovy/springfox/documentation/swagger/web/InMemorySwaggerResourcesProviderSpec.groovy +++ /dev/null @@ -1,56 +0,0 @@ -package springfox.documentation.swagger.web - -import org.springframework.mock.env.MockEnvironment -import spock.lang.Specification -import spock.lang.Unroll -import springfox.documentation.spi.DocumentationType -import springfox.documentation.spring.web.DocumentationCache -import springfox.documentation.spring.web.plugins.Docket -import springfox.documentation.spring.web.plugins.DocumentationPluginsManager - -class InMemorySwaggerResourcesProviderSpec extends Specification { - - @Unroll - def "OpenAPI url when base url is #baseUrl, oasPath is #oasPath"() { - given: - def cache = new DocumentationCache() - - when: - def sut = new InMemorySwaggerResourcesProvider(mockEnv(baseUrl, oasPath), cache, plugins()) - - then: - sut.oas3Url == expected - - where: - baseUrl | oasPath | expected - null | null | "/v3/api-docs" - null | "" | "/" - null | "/" | "/" - null | "/path" | "/path" - "/" | null | "/v3/api-docs" - "/" | "" | "/" - "/" | "/" | "/" - "/" | "/path" | "/path" - "/path" | null | "/v3/api-docs" - "/path" | "" | "/" - "/path" | "/" | "/" - "/path" | "/path" | "/path" - } - - def mockEnv(baseUrl, oasPath) { - MockEnvironment env = new MockEnvironment() - if (baseUrl != null) { - env.withProperty("springfox.documentation.swagger-ui.base-url", baseUrl) - } - if (oasPath != null) { - env.withProperty("springfox.documentation.open-api.v3.path", oasPath) - } - env - } - - DocumentationPluginsManager plugins() { - def plugins = Mock(DocumentationPluginsManager) - plugins.documentationPlugins() >> [new Docket(DocumentationType.OAS_30)] - plugins - } -} diff --git a/springfox-swagger-common/src/test/groovy/springfox/documentation/swagger/web/SecurityConfigurationBuilderSpec.groovy b/springfox-swagger-common/src/test/groovy/springfox/documentation/swagger/web/SecurityConfigurationBuilderSpec.groovy deleted file mode 100644 index 98e317e7428..00000000000 --- a/springfox-swagger-common/src/test/groovy/springfox/documentation/swagger/web/SecurityConfigurationBuilderSpec.groovy +++ /dev/null @@ -1,54 +0,0 @@ -/* - * - * Copyright 2018 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ -package springfox.documentation.swagger.web - -import com.fasterxml.jackson.annotation.JsonInclude -import com.fasterxml.jackson.databind.ObjectMapper -import org.skyscreamer.jsonassert.JSONAssert -import org.skyscreamer.jsonassert.JSONCompareMode -import spock.lang.Specification - -class SecurityConfigurationBuilderSpec extends Specification { - def securityConfig = SecurityConfigurationBuilder.builder().build() - def expected = "{\n" + - "}" - - def "Renders non-null values using default ObjectMapper"() { - given: - ObjectMapper mapper = new ObjectMapper() - - when: - def actual = mapper.writer().writeValueAsString(securityConfig) - - then: - JSONAssert.assertEquals(expected, actual, JSONCompareMode.NON_EXTENSIBLE) - } - - def "Renders non-null values using configured ObjectMapper"() { - given: - ObjectMapper mapper = new ObjectMapper() - mapper.setSerializationInclusion(JsonInclude.Include.NON_EMPTY) - - when: - def actual = mapper.writer().writeValueAsString(securityConfig) - - then: - JSONAssert.assertEquals(expected, actual, JSONCompareMode.NON_EXTENSIBLE) - } -} diff --git a/springfox-swagger-common/src/test/groovy/springfox/documentation/swagger/web/SecurityConfigurationSpec.groovy b/springfox-swagger-common/src/test/groovy/springfox/documentation/swagger/web/SecurityConfigurationSpec.groovy deleted file mode 100644 index da51ce0655e..00000000000 --- a/springfox-swagger-common/src/test/groovy/springfox/documentation/swagger/web/SecurityConfigurationSpec.groovy +++ /dev/null @@ -1,57 +0,0 @@ -/* - * - * Copyright 2018 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ -package springfox.documentation.swagger.web - -import com.fasterxml.jackson.annotation.JsonInclude -import com.fasterxml.jackson.databind.ObjectMapper -import org.skyscreamer.jsonassert.JSONAssert -import org.skyscreamer.jsonassert.JSONCompareMode -import spock.lang.Specification - -class SecurityConfigurationSpec extends Specification { - def securityConfig = SecurityConfiguration.DEFAULT - def expected = "{\n" + - " \"apiKeyVehicle\":\"header\"," + - " \"apiKeyName\":\"api_key\"," + - " \"scopeSeparator\": \",\"" + - "}" - - def "Renders non-null values using default ObjectMapper"() { - given: - ObjectMapper mapper = new ObjectMapper() - - when: - def actual = mapper.writer().writeValueAsString(securityConfig) - - then: - JSONAssert.assertEquals(expected, actual, JSONCompareMode.NON_EXTENSIBLE) - } - - def "Renders non-null values using configured ObjectMapper"() { - given: - ObjectMapper mapper = new ObjectMapper() - mapper.setSerializationInclusion(JsonInclude.Include.NON_EMPTY) - - when: - def actual = mapper.writer().writeValueAsString(securityConfig) - - then: - JSONAssert.assertEquals(expected, actual, JSONCompareMode.NON_EXTENSIBLE) - } -} diff --git a/springfox-swagger-common/src/test/groovy/springfox/documentation/swagger/web/SwaggerApiListingReaderSpec.groovy b/springfox-swagger-common/src/test/groovy/springfox/documentation/swagger/web/SwaggerApiListingReaderSpec.groovy deleted file mode 100644 index 022794aff58..00000000000 --- a/springfox-swagger-common/src/test/groovy/springfox/documentation/swagger/web/SwaggerApiListingReaderSpec.groovy +++ /dev/null @@ -1,39 +0,0 @@ -package springfox.documentation.swagger.web -import spock.lang.Specification -import springfox.documentation.builders.ApiListingBuilder -import springfox.documentation.service.ResourceGroup -import springfox.documentation.spi.DocumentationType -import springfox.documentation.spi.service.contexts.ApiListingContext -import springfox.documentation.spi.service.contexts.Orderings -import springfox.documentation.spring.web.dummy.DummyController -import springfox.documentation.spring.web.dummy.DummyControllerWithTags - -class SwaggerApiListingReaderSpec extends Specification { - def "ApiListingTagReaderSpec supports all documentation types" () { - given: - SwaggerApiListingReader sut = new SwaggerApiListingReader() - expect: - sut.supports(DocumentationType.SWAGGER_12) - sut.supports(DocumentationType.SWAGGER_2) - } - - def "ApiListingTagReaderSpec extracts tags" () { - given: - SwaggerApiListingReader sut = new SwaggerApiListingReader() - and: - ApiListingContext context = Mock(ApiListingContext) - when: - context.resourceGroup >> new ResourceGroup("test", clazz) - and: - context.apiListingBuilder() >> new ApiListingBuilder(Orderings.apiPathCompatator()) - then: - sut.apply(context) - where: - clazz | tags - String | ["String"] - DummyController | ["Dummy Controller"] - DummyControllerWithTags | ["Tag1", "Tag2"] - - - } -} diff --git a/springfox-swagger-common/src/test/groovy/springfox/documentation/swagger/web/UiConfigurationBuilderSpec.groovy b/springfox-swagger-common/src/test/groovy/springfox/documentation/swagger/web/UiConfigurationBuilderSpec.groovy deleted file mode 100644 index 87da07854c2..00000000000 --- a/springfox-swagger-common/src/test/groovy/springfox/documentation/swagger/web/UiConfigurationBuilderSpec.groovy +++ /dev/null @@ -1,67 +0,0 @@ -/* - * - * Copyright 2018 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ -package springfox.documentation.swagger.web - -import com.fasterxml.jackson.annotation.JsonInclude -import com.fasterxml.jackson.databind.ObjectMapper -import org.skyscreamer.jsonassert.JSONAssert -import org.skyscreamer.jsonassert.JSONCompareMode -import spock.lang.Specification - -class UiConfigurationBuilderSpec extends Specification { - def uiConfig = UiConfigurationBuilder.builder().build() - def expected = "{" + - "\"deepLinking\":true," + - "\"displayOperationId\":false," + - "\"defaultModelsExpandDepth\":1," + - "\"defaultModelExpandDepth\":1," + - "\"defaultModelRendering\":\"example\"," + - "\"displayRequestDuration\":false," + - "\"docExpansion\":\"none\"," + - "\"filter\":false," + - "\"operationsSorter\":\"alpha\"," + - "\"showExtensions\":false," + - "\"showCommonExtensions\":false," + - "\"tagsSorter\":\"alpha\"," + - "\"validatorUrl\":\"\"," + - "\"supportedSubmitMethods\":[\"get\",\"put\",\"post\",\"delete\",\"options\",\"head\",\"patch\",\"trace\"]}" - - def "Renders non-null values using default ObjectMapper"() { - given: - ObjectMapper mapper = new ObjectMapper() - - when: - def actual = mapper.writer().writeValueAsString(uiConfig) - - then: - JSONAssert.assertEquals(expected, actual, JSONCompareMode.NON_EXTENSIBLE) - } - - def "Renders non-null values using configured ObjectMapper"() { - given: - ObjectMapper mapper = new ObjectMapper() - mapper.setSerializationInclusion(JsonInclude.Include.NON_EMPTY) - - when: - def actual = mapper.writer().writeValueAsString(uiConfig) - - then: - JSONAssert.assertEquals(expected, actual, JSONCompareMode.NON_EXTENSIBLE) - } -} diff --git a/springfox-swagger-common/src/test/groovy/springfox/documentation/swagger/web/UiConfigurationSpec.groovy b/springfox-swagger-common/src/test/groovy/springfox/documentation/swagger/web/UiConfigurationSpec.groovy deleted file mode 100644 index efe1783ebf5..00000000000 --- a/springfox-swagger-common/src/test/groovy/springfox/documentation/swagger/web/UiConfigurationSpec.groovy +++ /dev/null @@ -1,103 +0,0 @@ -/* - * - * Copyright 2017-2019 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ -package springfox.documentation.swagger.web - -import com.fasterxml.jackson.annotation.JsonInclude -import com.fasterxml.jackson.databind.ObjectMapper -import org.skyscreamer.jsonassert.JSONAssert -import org.skyscreamer.jsonassert.JSONCompareMode -import spock.lang.Specification - -class UiConfigurationSpec extends Specification { - def uiConfig = UiConfigurationBuilder.builder() - .validatorUrl("validator:urn") - .supportedSubmitMethods(UiConfiguration.Constants.NO_SUBMIT_METHODS) - .docExpansion(DocExpansion.NONE) - .operationsSorter(OperationsSorter.ALPHA) - .defaultModelRendering(ModelRendering.MODEL) - .build() - def expected = "{" + - "\"deepLinking\":true," + - "\"displayOperationId\":false," + - "\"defaultModelsExpandDepth\":1," + - "\"defaultModelExpandDepth\":1," + - "\"defaultModelRendering\":\"model\"," + - "\"displayRequestDuration\":false," + - "\"docExpansion\":\"none\"," + - "\"filter\":false," + - "\"operationsSorter\":" + - "\"alpha\"," + - "\"showExtensions\":false," + - "\"showCommonExtensions\":false," + - "\"tagsSorter\":\"alpha\"," + - "\"validatorUrl\":\"validator:urn\"," + - "\"supportedSubmitMethods\":[]" + - "}" - - def uiConfigWithoutValidatorUrl = UiConfigurationBuilder.builder() - .supportedSubmitMethods(UiConfiguration.Constants.NO_SUBMIT_METHODS) - .docExpansion(DocExpansion.NONE) - .operationsSorter(OperationsSorter.ALPHA) - .defaultModelRendering(ModelRendering.MODEL) - .build() - def expectedWithoutValidatorUrl = "{" + - "\"deepLinking\":true," + - "\"displayOperationId\":false," + - "\"defaultModelsExpandDepth\":1," + - "\"defaultModelExpandDepth\":1," + - "\"defaultModelRendering\":\"model\"," + - "\"displayRequestDuration\":false," + - "\"docExpansion\":\"none\"," + - "\"filter\":false," + - "\"operationsSorter\":" + - "\"alpha\"," + - "\"showExtensions\":false," + - "\"showCommonExtensions\":false," + - "\"tagsSorter\":\"alpha\"," + - "\"validatorUrl\":\"\"," + - "\"supportedSubmitMethods\":[]" + - "}" - - def "Renders non-null values using default ObjectMapper"() { - given: - ObjectMapper mapper = new ObjectMapper() - - when: - def actual = mapper.writer().writeValueAsString(uiConfig) - def actualWithoutValidatorUrl = mapper.writer().writeValueAsString(uiConfigWithoutValidatorUrl) - - then: - JSONAssert.assertEquals(expected, actual, JSONCompareMode.NON_EXTENSIBLE) - JSONAssert.assertEquals(expectedWithoutValidatorUrl, actualWithoutValidatorUrl, JSONCompareMode.NON_EXTENSIBLE) - } - - def "Renders non-null values using configured ObjectMapper"() { - given: - ObjectMapper mapper = new ObjectMapper() - mapper.setSerializationInclusion(JsonInclude.Include.NON_EMPTY) - - when: - def actual = mapper.writer().writeValueAsString(uiConfig) - def actualWithoutValidatorUrl = mapper.writer().writeValueAsString(uiConfigWithoutValidatorUrl) - - then: - JSONAssert.assertEquals(expected, actual, JSONCompareMode.NON_EXTENSIBLE) - JSONAssert.assertEquals(expectedWithoutValidatorUrl, actualWithoutValidatorUrl, JSONCompareMode.NON_EXTENSIBLE) - } -} diff --git a/springfox-swagger-common/src/test/java/springfox/documentation/.gitkeep b/springfox-swagger-common/src/test/java/springfox/documentation/.gitkeep deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/springfox-swagger-common/src/test/java/springfox/documentation/schema/TypeWithAnnotatedGettersAndSetters.java b/springfox-swagger-common/src/test/java/springfox/documentation/schema/TypeWithAnnotatedGettersAndSetters.java deleted file mode 100644 index 029a280c762..00000000000 --- a/springfox-swagger-common/src/test/java/springfox/documentation/schema/TypeWithAnnotatedGettersAndSetters.java +++ /dev/null @@ -1,135 +0,0 @@ -/* - * - * Copyright 2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.schema; - -import io.swagger.annotations.ApiModelProperty; -import org.joda.time.LocalDate; - -import java.util.List; -import java.util.Map; - -public class TypeWithAnnotatedGettersAndSetters implements TypeWithAnnotatedGettersAndSettersInterface { - @ApiModelProperty(notes = "int Property Field", required = true) - private int intProp; - private boolean boolProp; - private ExampleEnum enumProp; - private GenericType genericProp; - private int hiddenProp; - private LocalDate validOverride; - private LocalDate invalidOverride; - private int readOnlyProp; - @ApiModelProperty(value = "Some description") - private List listOfStrings; - private Map> mapOfMaps; - private int interfaceProp; - - public int getIntProp() { - return intProp; - } - - public void setIntProp(int intProp) { - this.intProp = intProp; - } - - @ApiModelProperty(notes = "bool Property Getter", required = false) - public boolean isBoolProp() { - return boolProp; - } - - public void setBoolProp(boolean boolProp) { - this.boolProp = boolProp; - } - - public void getVoid() { - } - - public int isNotGetter() { - return 0; - } - - public int getWithParam(int param) { - return 0; - } - - public int setNotASetter() { - return 0; - } - - @ApiModelProperty(value = "enum Prop Getter value", notes = "enum note", allowableValues = "ONE", required = true, - readOnly = false) - public ExampleEnum getEnumProp() { - return enumProp; - } - - public void setEnumProp(ExampleEnum enumProp) { - this.enumProp = enumProp; - } - - @ApiModelProperty(hidden = true) - public int getHiddenProp() { - return hiddenProp; - } - - @ApiModelProperty(value = "readOnly property getter", readOnly = true) - public int getReadOnlyProp() { - return readOnlyProp; - } - - @ApiModelProperty(dataType = "UnknownType") - public LocalDate getInvalidOverride() { - return invalidOverride; - } - - @ApiModelProperty(dataType = "java.lang.String") - public LocalDate getValidOverride() { - return validOverride; - } - - @ApiModelProperty - public Map> getMapOfMaps() { - return mapOfMaps; - } - - public void setMapOfMaps(Map> mapOfMaps) { - this.mapOfMaps = mapOfMaps; - } - - @ApiModelProperty(value = "Some description") - public List getListOfStrings() { - return listOfStrings; - } - - public void setListOfStrings(List listOfStrings) { - this.listOfStrings = listOfStrings; - } - - public int getInterfaceProp() { - return interfaceProp; - } - - public void setInterfaceProp(int interfaceProp) { - this.interfaceProp = interfaceProp; - } - - @SuppressWarnings("VisibilityModifier") - class Foo { - public Integer fooInt; - } -} diff --git a/springfox-swagger-common/src/test/java/springfox/documentation/schema/TypeWithAnnotatedGettersAndSettersInterface.java b/springfox-swagger-common/src/test/java/springfox/documentation/schema/TypeWithAnnotatedGettersAndSettersInterface.java deleted file mode 100644 index dd308c0e5ee..00000000000 --- a/springfox-swagger-common/src/test/java/springfox/documentation/schema/TypeWithAnnotatedGettersAndSettersInterface.java +++ /dev/null @@ -1,27 +0,0 @@ -/* - * - * Copyright 2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.schema; - -import io.swagger.annotations.ApiModelProperty; - -public interface TypeWithAnnotatedGettersAndSettersInterface { - @ApiModelProperty(notes = "interface Property Field", required = true) - int getInterfaceProp(); -} diff --git a/springfox-swagger-common/src/test/java/springfox/documentation/schema/TypeWithApiModelAnnotation.java b/springfox-swagger-common/src/test/java/springfox/documentation/schema/TypeWithApiModelAnnotation.java deleted file mode 100644 index 3af63d145df..00000000000 --- a/springfox-swagger-common/src/test/java/springfox/documentation/schema/TypeWithApiModelAnnotation.java +++ /dev/null @@ -1,26 +0,0 @@ -/* - * - * Copyright 2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.schema; - -import io.swagger.annotations.ApiModel; - -@ApiModel(value = "ApiModelTest") -public class TypeWithApiModelAnnotation { -} diff --git a/springfox-swagger-common/src/test/java/springfox/documentation/schema/TypeWithEmptyApiModelAnnotation.java b/springfox-swagger-common/src/test/java/springfox/documentation/schema/TypeWithEmptyApiModelAnnotation.java deleted file mode 100644 index aa8f6c98fd7..00000000000 --- a/springfox-swagger-common/src/test/java/springfox/documentation/schema/TypeWithEmptyApiModelAnnotation.java +++ /dev/null @@ -1,26 +0,0 @@ -/* - * - * Copyright 2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.schema; - -import io.swagger.annotations.ApiModel; - -@ApiModel -public class TypeWithEmptyApiModelAnnotation { -} diff --git a/springfox-swagger-common/src/test/java/springfox/documentation/schema/TypeWithGettersAndSetters.java b/springfox-swagger-common/src/test/java/springfox/documentation/schema/TypeWithGettersAndSetters.java deleted file mode 100644 index 75fb9e416f5..00000000000 --- a/springfox-swagger-common/src/test/java/springfox/documentation/schema/TypeWithGettersAndSetters.java +++ /dev/null @@ -1,80 +0,0 @@ -/* - * - * Copyright 2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.schema; - -import io.swagger.annotations.ApiModelProperty; - -public class TypeWithGettersAndSetters { - @ApiModelProperty(notes = "int Property Field", required = true) - private int intProp; - private boolean boolProp; - private ExampleEnum enumProp; - private GenericType genericProp; - private GenericType genericByteArray; - private GenericType genericCategoryArray; - - public int getIntProp() { - return intProp; - } - - public void setIntProp(int intProp) { - this.intProp = intProp; - } - - @ApiModelProperty(notes = "bool Property Getter", required = false) - public boolean isBoolProp() { - return boolProp; - } - - public void setBoolProp(boolean boolProp) { - this.boolProp = boolProp; - } - - public void getVoid() { - } - - public int isNotGetter() { - return 0; - } - - public int getWithParam(int param) { - return 0; - } - - public int setNotASetter() { - return 0; - } - - public GenericType getGenericByteArray() { - return genericByteArray; - } - - public void setGenericByteArray(GenericType genericByteArray) { - this.genericByteArray = genericByteArray; - } - - public GenericType getGenericCategoryArray() { - return genericCategoryArray; - } - - public void setGenericCategoryArray(GenericType genericCategoryArray) { - this.genericCategoryArray = genericCategoryArray; - } -} diff --git a/springfox-swagger-common/src/test/resources/.gitkeep b/springfox-swagger-common/src/test/resources/.gitkeep deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/springfox-swagger-ui/build.gradle b/springfox-swagger-ui/build.gradle index 29cad9524ce..86ad11cbfe6 100644 --- a/springfox-swagger-ui/build.gradle +++ b/springfox-swagger-ui/build.gradle @@ -31,7 +31,6 @@ ext { } dependencies { - implementation project(':springfox-spring-webmvc') testImplementation libs.test } @@ -39,7 +38,7 @@ node { version = '12.16.2' // LTS npmVersion = '6.4.1' distBaseUrl = 'https://nodejs.org/dist' - download = true +// download = true workDir = file("${project.buildDir}/nodejs") npmWorkDir = file("${project.buildDir}/npm") nodeModulesDir = file("${project.projectDir}/src/web") diff --git a/springfox-swagger-ui/gradle/wrapper/gradle-wrapper.jar b/springfox-swagger-ui/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..41d9927a4d4fb3f96a785543079b8df6723c946b GIT binary patch literal 59821 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 literal 0 HcmV?d00001 diff --git a/springfox-swagger-ui/gradle/wrapper/gradle-wrapper.properties b/springfox-swagger-ui/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 00000000000..41dfb87909a --- /dev/null +++ b/springfox-swagger-ui/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,5 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-7.4-bin.zip +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/springfox-swagger-ui/gradlew b/springfox-swagger-ui/gradlew new file mode 100755 index 00000000000..1b6c787337f --- /dev/null +++ b/springfox-swagger-ui/gradlew @@ -0,0 +1,234 @@ +#!/bin/sh + +# +# Copyright © 2015-2021 the original authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +############################################################################## +# +# Gradle start up script for POSIX generated by Gradle. +# +# Important for running: +# +# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is +# noncompliant, but you have some other compliant shell such as ksh or +# bash, then to run this script, type that shell name before the whole +# command line, like: +# +# ksh Gradle +# +# Busybox and similar reduced shells will NOT work, because this script +# requires all of these POSIX shell features: +# * functions; +# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», +# «${var#prefix}», «${var%suffix}», and «$( cmd )»; +# * compound commands having a testable exit status, especially «case»; +# * various built-in commands including «command», «set», and «ulimit». +# +# Important for patching: +# +# (2) This script targets any POSIX shell, so it avoids extensions provided +# by Bash, Ksh, etc; in particular arrays are avoided. +# +# The "traditional" practice of packing multiple parameters into a +# space-separated string is a well documented source of bugs and security +# problems, so this is (mostly) avoided, by progressively accumulating +# options in "$@", and eventually passing that to Java. +# +# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, +# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; +# see the in-line comments for details. +# +# There are tweaks for specific operating systems such as AIX, CygWin, +# Darwin, MinGW, and NonStop. +# +# (3) This script is generated from the Groovy template +# https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# within the Gradle project. +# +# You can find Gradle at https://github.com/gradle/gradle/. +# +############################################################################## + +# Attempt to set APP_HOME + +# Resolve links: $0 may be a link +app_path=$0 + +# Need this for daisy-chained symlinks. +while + APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path + [ -h "$app_path" ] +do + ls=$( ls -ld "$app_path" ) + link=${ls#*' -> '} + case $link in #( + /*) app_path=$link ;; #( + *) app_path=$APP_HOME$link ;; + esac +done + +APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit + +APP_NAME="Gradle" +APP_BASE_NAME=${0##*/} + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD=maximum + +warn () { + echo "$*" +} >&2 + +die () { + echo + echo "$*" + echo + exit 1 +} >&2 + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "$( uname )" in #( + CYGWIN* ) cygwin=true ;; #( + Darwin* ) darwin=true ;; #( + MSYS* | MINGW* ) msys=true ;; #( + NONSTOP* ) nonstop=true ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD=$JAVA_HOME/jre/sh/java + else + JAVACMD=$JAVA_HOME/bin/java + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD=java + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then + case $MAX_FD in #( + max*) + MAX_FD=$( ulimit -H -n ) || + warn "Could not query maximum file descriptor limit" + esac + case $MAX_FD in #( + '' | soft) :;; #( + *) + ulimit -n "$MAX_FD" || + warn "Could not set maximum file descriptor limit to $MAX_FD" + esac +fi + +# Collect all arguments for the java command, stacking in reverse order: +# * args from the command line +# * the main class name +# * -classpath +# * -D...appname settings +# * --module-path (only if needed) +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. + +# For Cygwin or MSYS, switch paths to Windows format before running java +if "$cygwin" || "$msys" ; then + APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) + CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) + + JAVACMD=$( cygpath --unix "$JAVACMD" ) + + # Now convert the arguments - kludge to limit ourselves to /bin/sh + for arg do + if + case $arg in #( + -*) false ;; # don't mess with options #( + /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath + [ -e "$t" ] ;; #( + *) false ;; + esac + then + arg=$( cygpath --path --ignore --mixed "$arg" ) + fi + # Roll the args list around exactly as many times as the number of + # args, so each arg winds up back in the position where it started, but + # possibly modified. + # + # NB: a `for` loop captures its iteration list before it begins, so + # changing the positional parameters here affects neither the number of + # iterations, nor the values presented in `arg`. + shift # remove old arg + set -- "$@" "$arg" # push replacement arg + done +fi + +# Collect all arguments for the java command; +# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of +# shell script including quotes and variable substitutions, so put them in +# double quotes to make sure that they get re-expanded; and +# * put everything else in single quotes, so that it's not re-expanded. + +set -- \ + "-Dorg.gradle.appname=$APP_BASE_NAME" \ + -classpath "$CLASSPATH" \ + org.gradle.wrapper.GradleWrapperMain \ + "$@" + +# Use "xargs" to parse quoted args. +# +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# + +eval "set -- $( + printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | + xargs -n1 | + sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | + tr '\n' ' ' + )" '"$@"' + +exec "$JAVACMD" "$@" diff --git a/springfox-swagger-ui/gradlew.bat b/springfox-swagger-ui/gradlew.bat new file mode 100644 index 00000000000..ac1b06f9382 --- /dev/null +++ b/springfox-swagger-ui/gradlew.bat @@ -0,0 +1,89 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto execute + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/springfox-swagger1/build.gradle b/springfox-swagger1/build.gradle deleted file mode 100644 index 66895da3abc..00000000000 --- a/springfox-swagger1/build.gradle +++ /dev/null @@ -1,71 +0,0 @@ -//plugins { -// id "net.ltgt.apt-idea" version "0.21" -//} - -ext { - limits = [ - 'instruction': 97, - 'branch' : 95, - 'line' : 97, - 'complexity' : 94, - 'method' : 94, - 'class' : 95.5 - ] -} - -sourceSets { - integrationTest { sourceSet -> - ["java", "groovy", "scala", "resources"].each { - if (!sourceSet.hasProperty(it)) return - sourceSet."$it".srcDir file("src/integration-test/${it}") - } - } -} - - -// Define integration test task -task integrationTest(type: Test) { - testClassesDirs = sourceSets.integrationTest.output.classesDirs - classpath = sourceSets.integrationTest.runtimeClasspath -} - -dependencies { - api project(':springfox-spi') - api project(':springfox-schema') - api project(':springfox-core') - api project(':springfox-spring-web') - api project(':springfox-spring-webmvc') - api project(':springfox-swagger-common') - - api libs.core - api libs.spring - api libs.swagger2Core - compileOnly libs.springProvidedWithMvc - compileOnly libs.clientProvided - compileOnly "jakarta.servlet:jakarta.servlet-api:$servlet" - - implementation "org.mapstruct:mapstruct:$mapstruct" - annotationProcessor "org.mapstruct:mapstruct-processor:$mapstruct" - - testImplementation project(':springfox-core').sourceSets.test.output - testImplementation project(':springfox-schema').sourceSets.test.output - testImplementation project(':springfox-swagger-common').sourceSets.test.output - testImplementation project(':springfox-spring-web').sourceSets.test.output - testImplementation project(':springfox-spring-webmvc').sourceSets.test.output - testImplementation libs.test - testImplementation libs.springProvidedWithMvc - testImplementation libs.clientProvided - testImplementation "jakarta.servlet:jakarta.servlet-api:$servlet" - - integrationTestImplementation sourceSets.main.output - integrationTestImplementation sourceSets.test.output -// integrationTestImplementation configurations.testImplementation -// integrationTestImplementation configurations.testRuntime -} - -compileJava { - options.compilerArgs += [ - "-Amapstruct.defaultComponentModel=spring", - "-Amapstruct.unmappedTargetPolicy=ERROR" - ] -} \ No newline at end of file diff --git a/springfox-swagger1/src/integration-test/groovy/CustomJavaPluginStartupSpec.groovy b/springfox-swagger1/src/integration-test/groovy/CustomJavaPluginStartupSpec.groovy deleted file mode 100644 index 0adba3730ac..00000000000 --- a/springfox-swagger1/src/integration-test/groovy/CustomJavaPluginStartupSpec.groovy +++ /dev/null @@ -1,51 +0,0 @@ -/* - * - * Copyright 2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.swagger1.integration - -import org.springframework.beans.factory.annotation.Autowired -import org.springframework.test.context.ContextConfiguration -import org.springframework.test.context.web.WebAppConfiguration -import org.springframework.test.web.servlet.MockMvc -import org.springframework.test.web.servlet.MvcResult -import org.springframework.test.web.servlet.setup.MockMvcBuilders -import org.springframework.web.context.WebApplicationContext -import spock.lang.Specification -import springfox.documentation.spring.web.mixins.JsonSupport -import springfox.documentation.swagger1.configuration.CustomJavaPluginConfig - -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.* - -@WebAppConfiguration -@ContextConfiguration(classes = CustomJavaPluginConfig.class) -class CustomJavaPluginStartupSpec extends Specification implements JsonSupport { - - @Autowired - WebApplicationContext context - - def "Should start app with custom java config"() { - when: - MockMvc mockMvc = MockMvcBuilders.webAppContextSetup(context).build() - MvcResult petApi = mockMvc.perform(get('/api-docs?group=customPlugin')).andReturn() - MvcResult demoApi = mockMvc.perform(get('/api-docs?group=secondCustomPlugin')).andReturn() - then: - jsonBodyResponse(petApi).apis.size() == 4 - jsonBodyResponse(demoApi).apis.size() == 1 - } -} diff --git a/springfox-swagger1/src/integration-test/groovy/CustomXmlPluginStartupSpec.groovy b/springfox-swagger1/src/integration-test/groovy/CustomXmlPluginStartupSpec.groovy deleted file mode 100644 index c3769927e5e..00000000000 --- a/springfox-swagger1/src/integration-test/groovy/CustomXmlPluginStartupSpec.groovy +++ /dev/null @@ -1,50 +0,0 @@ -/* - * - * Copyright 2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.swagger1.integration - -import org.springframework.beans.factory.annotation.Autowired -import org.springframework.test.context.ContextConfiguration -import org.springframework.test.context.web.WebAppConfiguration -import org.springframework.test.web.servlet.MockMvc -import org.springframework.test.web.servlet.MvcResult -import org.springframework.test.web.servlet.request.MockMvcRequestBuilders -import org.springframework.test.web.servlet.setup.MockMvcBuilders -import org.springframework.web.context.WebApplicationContext -import spock.lang.Specification -import springfox.documentation.spring.web.mixins.JsonSupport - -@WebAppConfiguration -@ContextConfiguration("classpath:custom-plugin-context.xml") -class CustomXmlPluginStartupSpec extends Specification implements JsonSupport { - - @Autowired - WebApplicationContext context - - def "Should start app with custom xml config"() { - when: - MockMvc mockMvc = MockMvcBuilders.webAppContextSetup(context).build() - MvcResult petApi = mockMvc.perform(MockMvcRequestBuilders.get('/api-docs?group=customPlugin')).andReturn() - MvcResult demoApi = mockMvc.perform(MockMvcRequestBuilders.get('/api-docs?group=secondCustomPlugin')) - .andReturn() - then: - jsonBodyResponse(petApi).apis.size() == 4 - jsonBodyResponse(demoApi).apis.size() == 1 - } -} diff --git a/springfox-swagger1/src/integration-test/groovy/DefaultJavaPluginStartupSpec.groovy b/springfox-swagger1/src/integration-test/groovy/DefaultJavaPluginStartupSpec.groovy deleted file mode 100644 index c27296bdd5b..00000000000 --- a/springfox-swagger1/src/integration-test/groovy/DefaultJavaPluginStartupSpec.groovy +++ /dev/null @@ -1,49 +0,0 @@ -/* - * - * Copyright 2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.swagger1.integration - -import org.springframework.beans.factory.annotation.Autowired -import org.springframework.test.context.ContextConfiguration -import org.springframework.test.context.web.WebAppConfiguration -import org.springframework.test.web.servlet.MockMvc -import org.springframework.test.web.servlet.MvcResult -import org.springframework.test.web.servlet.request.MockMvcRequestBuilders -import org.springframework.test.web.servlet.setup.MockMvcBuilders -import org.springframework.web.context.WebApplicationContext -import spock.lang.Specification -import springfox.documentation.spring.web.mixins.JsonSupport -import springfox.documentation.swagger1.configuration.DefaultJavaPluginConfig - -@WebAppConfiguration -@ContextConfiguration(classes = DefaultJavaPluginConfig.class) -class DefaultJavaPluginStartupSpec extends Specification implements JsonSupport { - - @Autowired - WebApplicationContext context - - def "Should start app with default java config"() { - when: - MockMvc mockMvc = MockMvcBuilders.webAppContextSetup(context).build() - MvcResult petApi = mockMvc.perform(MockMvcRequestBuilders.get('/api-docs')).andReturn() - then: - jsonBodyResponse(petApi).apis.size() == 12 - } - -} diff --git a/springfox-swagger1/src/integration-test/groovy/DefaultXmlPluginStartupSpec.groovy b/springfox-swagger1/src/integration-test/groovy/DefaultXmlPluginStartupSpec.groovy deleted file mode 100644 index 4df06091732..00000000000 --- a/springfox-swagger1/src/integration-test/groovy/DefaultXmlPluginStartupSpec.groovy +++ /dev/null @@ -1,51 +0,0 @@ -/* - * - * Copyright 2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.swagger1.integration - -import com.fasterxml.jackson.databind.ObjectMapper -import org.springframework.beans.factory.annotation.Autowired -import org.springframework.test.context.ContextConfiguration -import org.springframework.test.context.web.WebAppConfiguration -import org.springframework.test.web.servlet.MockMvc -import org.springframework.test.web.servlet.MvcResult -import org.springframework.test.web.servlet.request.MockMvcRequestBuilders -import org.springframework.test.web.servlet.setup.MockMvcBuilders -import org.springframework.web.context.WebApplicationContext -import spock.lang.Specification -import springfox.documentation.schema.configuration.ObjectMapperConfigured -import springfox.documentation.spring.web.mixins.JsonSupport - -@WebAppConfiguration -@ContextConfiguration("classpath:default-plugin-context.xml") -class DefaultXmlPluginStartupSpec extends Specification implements JsonSupport { - - @Autowired - WebApplicationContext context - - def "Should start app with default xml config"() { - when: - MockMvc mockMvc = MockMvcBuilders.webAppContextSetup(context).build() - context.publishEvent(new ObjectMapperConfigured(this, new ObjectMapper())) - MvcResult petApi = mockMvc.perform(MockMvcRequestBuilders.get('/api-docs?group=default')).andReturn() - then: - jsonBodyResponse(petApi).apis.size() == 12 - } - -} diff --git a/springfox-swagger1/src/integration-test/groovy/MultiplePropertyPlaceholderSpec.groovy b/springfox-swagger1/src/integration-test/groovy/MultiplePropertyPlaceholderSpec.groovy deleted file mode 100644 index cbf645c52f8..00000000000 --- a/springfox-swagger1/src/integration-test/groovy/MultiplePropertyPlaceholderSpec.groovy +++ /dev/null @@ -1,47 +0,0 @@ -/* - * - * - * - * - * Copyright 2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.swagger1.integration - -import org.springframework.beans.factory.annotation.Autowired -import org.springframework.test.context.ContextConfiguration -import org.springframework.test.context.web.WebAppConfiguration -import org.springframework.web.context.WebApplicationContext -import spock.lang.Specification -import springfox.documentation.swagger1.configuration.SimpleBean - -@WebAppConfiguration -@ContextConfiguration("classpath:placeholders-adapter-context.xml") -class MultiplePropertyPlaceholderSpec extends Specification { - - @Autowired - WebApplicationContext context - - @Autowired - SimpleBean simpleBean - - def "should ignore when a property placeholder cannot be resolved"() { - expect: - simpleBean.aValue == 'Some Value' - simpleBean.anotherValue == '${com.yourapp.missingValue}' - } -} \ No newline at end of file diff --git a/springfox-swagger1/src/integration-test/groovy/MultipleRequestMappingHandlerAdaptersSpec.groovy b/springfox-swagger1/src/integration-test/groovy/MultipleRequestMappingHandlerAdaptersSpec.groovy deleted file mode 100644 index 5023ab4c34e..00000000000 --- a/springfox-swagger1/src/integration-test/groovy/MultipleRequestMappingHandlerAdaptersSpec.groovy +++ /dev/null @@ -1,39 +0,0 @@ -/* - * - * Copyright 2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.swagger1.integration - -import org.springframework.beans.factory.annotation.Autowired -import org.springframework.test.context.ContextConfiguration -import org.springframework.test.context.web.WebAppConfiguration -import org.springframework.web.context.WebApplicationContext -import spock.lang.Specification - -@WebAppConfiguration -@ContextConfiguration("classpath:handler-adapter-context.xml") -class MultipleRequestMappingHandlerAdaptersSpec extends Specification { - - @Autowired - WebApplicationContext context; - - def "should survive multiple MultipleRequestMappingHandlerAdapters"() { - expect: - true - } -} diff --git a/springfox-swagger1/src/main/java/springfox/documentation/swagger1/annotations/EnableSwagger.java b/springfox-swagger1/src/main/java/springfox/documentation/swagger1/annotations/EnableSwagger.java deleted file mode 100644 index cf203bceb3d..00000000000 --- a/springfox-swagger1/src/main/java/springfox/documentation/swagger1/annotations/EnableSwagger.java +++ /dev/null @@ -1,43 +0,0 @@ -/* - * - * Copyright 2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.swagger1.annotations; - -import org.springframework.context.annotation.Import; -import springfox.documentation.swagger1.configuration.Swagger1DocumentationConfiguration; - -import java.lang.annotation.Documented; -import java.lang.annotation.Retention; -import java.lang.annotation.Target; - -/** - * Indicates that Swagger support should be enabled. - * - * This should be applied to a Spring java config and should have an accompanying '@Configuration' annotation. - * - * Loads all required beans defined in @see SpringSwaggerConfig - * - * @see springfox.documentation.spring.web.plugins.Docket - */ -@Retention(value = java.lang.annotation.RetentionPolicy.RUNTIME) -@Target(value = {java.lang.annotation.ElementType.TYPE}) -@Documented -@Import(Swagger1DocumentationConfiguration.class) -public @interface EnableSwagger { -} diff --git a/springfox-swagger1/src/main/java/springfox/documentation/swagger1/configuration/Swagger1DocumentationConfiguration.java b/springfox-swagger1/src/main/java/springfox/documentation/swagger1/configuration/Swagger1DocumentationConfiguration.java deleted file mode 100644 index d5625777cbe..00000000000 --- a/springfox-swagger1/src/main/java/springfox/documentation/swagger1/configuration/Swagger1DocumentationConfiguration.java +++ /dev/null @@ -1,67 +0,0 @@ -/* - * - * Copyright 2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.swagger1.configuration; - -import com.fasterxml.classmate.TypeResolver; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.ComponentScan; -import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.Import; -import springfox.documentation.PathProvider; -import springfox.documentation.spi.service.contexts.Defaults; -import springfox.documentation.spring.web.DocumentationCache; -import springfox.documentation.spring.web.SpringfoxWebConfiguration; -import springfox.documentation.spring.web.SpringfoxWebMvcConfiguration; -import springfox.documentation.spring.web.json.JacksonModuleRegistrar; -import springfox.documentation.spring.web.json.JsonSerializer; -import springfox.documentation.swagger.configuration.SwaggerCommonConfiguration; -import springfox.documentation.swagger1.mappers.ServiceModelToSwaggerMapper; -import springfox.documentation.swagger1.web.Swagger1Controller; -import springfox.documentation.swagger1.web.SwaggerDefaultConfiguration; - -@Configuration -@Import({SpringfoxWebConfiguration.class, SpringfoxWebMvcConfiguration.class, SwaggerCommonConfiguration.class}) -@ComponentScan(basePackages = { - "springfox.documentation.swagger1.readers.parameter", - "springfox.documentation.swagger1.mappers" -}) -public class Swagger1DocumentationConfiguration { - - @Bean - public JacksonModuleRegistrar swagger1Module() { - return new SwaggerJacksonModule(); - } - - @Bean - public Swagger1Controller swagger1ControllerMapping( - DocumentationCache documentationCache, - ServiceModelToSwaggerMapper mapper, - JsonSerializer jsonSerializer) { - return new Swagger1Controller(documentationCache, mapper, jsonSerializer); - } - - @Bean - public SwaggerDefaultConfiguration swaggerDefaults( - PathProvider pathProvider, - TypeResolver type, - Defaults defaults) { - return new SwaggerDefaultConfiguration(defaults, type, pathProvider); - } -} diff --git a/springfox-swagger1/src/main/java/springfox/documentation/swagger1/configuration/SwaggerJacksonModule.java b/springfox-swagger1/src/main/java/springfox/documentation/swagger1/configuration/SwaggerJacksonModule.java deleted file mode 100644 index f4ec45919e0..00000000000 --- a/springfox-swagger1/src/main/java/springfox/documentation/swagger1/configuration/SwaggerJacksonModule.java +++ /dev/null @@ -1,111 +0,0 @@ -/* - * - * Copyright 2015-2019 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.swagger1.configuration; - -import com.fasterxml.jackson.annotation.JsonAutoDetect; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonPropertyOrder; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.SerializationFeature; -import com.fasterxml.jackson.databind.module.SimpleModule; -import springfox.documentation.spring.web.json.JacksonModuleRegistrar; -import springfox.documentation.swagger1.dto.AllowableListValues; -import springfox.documentation.swagger1.dto.AllowableRangeValues; -import springfox.documentation.swagger1.dto.ApiDescription; -import springfox.documentation.swagger1.dto.ApiInfo; -import springfox.documentation.swagger1.dto.ApiKey; -import springfox.documentation.swagger1.dto.ApiListing; -import springfox.documentation.swagger1.dto.ApiListingReference; -import springfox.documentation.swagger1.dto.Authorization; -import springfox.documentation.swagger1.dto.AuthorizationCodeGrant; -import springfox.documentation.swagger1.dto.AuthorizationScope; -import springfox.documentation.swagger1.dto.BasicAuth; -import springfox.documentation.swagger1.dto.ContainerDataType; -import springfox.documentation.swagger1.dto.DataType; -import springfox.documentation.swagger1.dto.ImplicitGrant; -import springfox.documentation.swagger1.dto.LoginEndpoint; -import springfox.documentation.swagger1.dto.ModelDto; -import springfox.documentation.swagger1.dto.ModelPropertyDto; -import springfox.documentation.swagger1.dto.OAuth; -import springfox.documentation.swagger1.dto.Parameter; -import springfox.documentation.swagger1.dto.PrimitiveDataType; -import springfox.documentation.swagger1.dto.PrimitiveFormatDataType; -import springfox.documentation.swagger1.dto.ReferenceDataType; -import springfox.documentation.swagger1.dto.ResourceListing; -import springfox.documentation.swagger1.dto.ResponseMessage; -import springfox.documentation.swagger1.dto.TokenEndpoint; -import springfox.documentation.swagger1.dto.TokenRequestEndpoint; - -public class SwaggerJacksonModule extends SimpleModule implements JacksonModuleRegistrar { - - public void maybeRegisterModule(ObjectMapper objectMapper) { - if (isModuleSetup(objectMapper)) { - objectMapper.registerModule(this); - objectMapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false); - } - } - - private static boolean isModuleSetup(ObjectMapper objectMapper) { - return objectMapper.findMixInClassFor(ApiListing.class) == null; - } - - @Override - public void setupModule(SetupContext module) { - super.setupModule(module); - module.setMixInAnnotations(ApiListing.class, CustomizedSwaggerSerializer.class); - module.setMixInAnnotations(ResourceListing.class, CustomizedSwaggerSerializer.class); - module.setMixInAnnotations(AllowableListValues.class, CustomizedSwaggerSerializer.class); - module.setMixInAnnotations(AllowableRangeValues.class, CustomizedSwaggerSerializer.class); - module.setMixInAnnotations(ApiDescription.class, CustomizedSwaggerSerializer.class); - module.setMixInAnnotations(ApiInfo.class, CustomizedSwaggerSerializer.class); - module.setMixInAnnotations(ApiKey.class, CustomizedSwaggerSerializer.class); - module.setMixInAnnotations(ApiListingReference.class, CustomizedSwaggerSerializer.class); - module.setMixInAnnotations(Authorization.class, CustomizedSwaggerSerializer.class); - module.setMixInAnnotations(AuthorizationCodeGrant.class, CustomizedSwaggerSerializer.class); - module.setMixInAnnotations(AuthorizationScope.class, CustomizedSwaggerSerializer.class); - module.setMixInAnnotations(BasicAuth.class, CustomizedSwaggerSerializer.class); - module.setMixInAnnotations(OAuth.class, CustomizedSwaggerSerializer.class); - module.setMixInAnnotations(ImplicitGrant.class, CustomizedSwaggerSerializer.class); - module.setMixInAnnotations(LoginEndpoint.class, CustomizedSwaggerSerializer.class); - module.setMixInAnnotations(ModelDto.class, CustomizedSwaggerSerializer.class); - module.setMixInAnnotations(ModelPropertyDto.class, CustomizedSwaggerSerializer.class); - module.setMixInAnnotations(DataType.class, CustomizedSwaggerSerializer.class); - module.setMixInAnnotations(ReferenceDataType.class, CustomizedSwaggerSerializer.class); - module.setMixInAnnotations(ContainerDataType.class, CustomizedSwaggerSerializer.class); - module.setMixInAnnotations(Parameter.class, CustomizedSwaggerSerializer.class); - module.setMixInAnnotations(PrimitiveDataType.class, CustomizedSwaggerSerializer.class); - module.setMixInAnnotations(PrimitiveFormatDataType.class, CustomizedSwaggerSerializer.class); - module.setMixInAnnotations(PrimitiveDataType.class, CustomizedSwaggerSerializer.class); - module.setMixInAnnotations(ResponseMessage.class, CustomizedSwaggerSerializer.class); - module.setMixInAnnotations(TokenEndpoint.class, CustomizedSwaggerSerializer.class); - module.setMixInAnnotations(TokenRequestEndpoint.class, CustomizedSwaggerSerializer.class); - } - - @JsonAutoDetect( - fieldVisibility = JsonAutoDetect.Visibility.ANY, - getterVisibility = JsonAutoDetect.Visibility.NONE, - setterVisibility = JsonAutoDetect.Visibility.NONE, - creatorVisibility = JsonAutoDetect.Visibility.NONE - ) - @JsonInclude(value = JsonInclude.Include.NON_NULL) - @JsonPropertyOrder(alphabetic = true) - private static class CustomizedSwaggerSerializer { - } -} diff --git a/springfox-swagger1/src/main/java/springfox/documentation/swagger1/dto/AllowableListValues.java b/springfox-swagger1/src/main/java/springfox/documentation/swagger1/dto/AllowableListValues.java deleted file mode 100644 index b6796e092e3..00000000000 --- a/springfox-swagger1/src/main/java/springfox/documentation/swagger1/dto/AllowableListValues.java +++ /dev/null @@ -1,58 +0,0 @@ -/* - * - * Copyright 2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.swagger1.dto; - -import com.fasterxml.jackson.annotation.JsonIgnore; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; - -import java.util.List; - -public class AllowableListValues implements AllowableValues { - @JsonProperty("enum") - @JsonInclude(JsonInclude.Include.NON_EMPTY) - private List values; - @JsonIgnore - private String valueType; - - public AllowableListValues() { - } - - public AllowableListValues(List values, String valueType) { - this.values = values; - this.valueType = valueType; - } - - public List getValues() { - return values; - } - - public void setValues(List values) { - this.values = values; - } - - public String getValueType() { - return valueType; - } - - public void setValueType(String valueType) { - this.valueType = valueType; - } -} diff --git a/springfox-swagger1/src/main/java/springfox/documentation/swagger1/dto/AllowableRangeValues.java b/springfox-swagger1/src/main/java/springfox/documentation/swagger1/dto/AllowableRangeValues.java deleted file mode 100644 index a06740e2d07..00000000000 --- a/springfox-swagger1/src/main/java/springfox/documentation/swagger1/dto/AllowableRangeValues.java +++ /dev/null @@ -1,53 +0,0 @@ -/* - * - * Copyright 2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.swagger1.dto; - -import com.fasterxml.jackson.annotation.JsonProperty; - -public class AllowableRangeValues implements AllowableValues { - @JsonProperty("minimum") - private String min; - @JsonProperty("maximum") - private String max; - - public AllowableRangeValues() { - } - - public AllowableRangeValues(String min, String max) { - this.min = min; - this.max = max; - } - - public String getMin() { - return min; - } - - public void setMin(String min) { - this.min = min; - } - - public String getMax() { - return max; - } - - public void setMax(String max) { - this.max = max; - } -} diff --git a/springfox-swagger1/src/main/java/springfox/documentation/swagger1/dto/AllowableValues.java b/springfox-swagger1/src/main/java/springfox/documentation/swagger1/dto/AllowableValues.java deleted file mode 100644 index 0a5a15c8291..00000000000 --- a/springfox-swagger1/src/main/java/springfox/documentation/swagger1/dto/AllowableValues.java +++ /dev/null @@ -1,28 +0,0 @@ -/* - * - * Copyright 2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.swagger1.dto; - -import com.fasterxml.jackson.annotation.JsonSubTypes; - -@JsonSubTypes({ - @JsonSubTypes.Type(value = AllowableListValues.class), - @JsonSubTypes.Type(value = AllowableRangeValues.class) }) -public interface AllowableValues { -} diff --git a/springfox-swagger1/src/main/java/springfox/documentation/swagger1/dto/ApiDescription.java b/springfox-swagger1/src/main/java/springfox/documentation/swagger1/dto/ApiDescription.java deleted file mode 100644 index 6207c7173bc..00000000000 --- a/springfox-swagger1/src/main/java/springfox/documentation/swagger1/dto/ApiDescription.java +++ /dev/null @@ -1,76 +0,0 @@ -/* - * - * Copyright 2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.swagger1.dto; - -import com.fasterxml.jackson.annotation.JsonIgnore; -import com.fasterxml.jackson.annotation.JsonPropertyOrder; - -import java.util.List; - -@JsonPropertyOrder({"path", "description", "hidden", "operations"}) -public class ApiDescription { - private String path; - private String description; - private List operations; - @JsonIgnore - private Boolean hidden; - - public ApiDescription() { - } - - public ApiDescription(String path, String description, List operations, Boolean hidden) { - this.path = path; - this.description = description; - this.operations = operations; - this.hidden = hidden; - } - - public String getPath() { - return path; - } - - public void setPath(String path) { - this.path = path; - } - - public String getDescription() { - return description; - } - - public void setDescription(String description) { - this.description = description; - } - - public List getOperations() { - return operations; - } - - public void setOperations(List operations) { - this.operations = operations; - } - - public Boolean isHidden() { - return hidden; - } - - public void setHidden(Boolean hidden) { - this.hidden = hidden; - } -} diff --git a/springfox-swagger1/src/main/java/springfox/documentation/swagger1/dto/ApiInfo.java b/springfox-swagger1/src/main/java/springfox/documentation/swagger1/dto/ApiInfo.java deleted file mode 100644 index 07e7ef18928..00000000000 --- a/springfox-swagger1/src/main/java/springfox/documentation/swagger1/dto/ApiInfo.java +++ /dev/null @@ -1,91 +0,0 @@ -/* - * - * Copyright 2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.swagger1.dto; - -public class ApiInfo { - - private String title; - private String description; - private String termsOfServiceUrl; - private String contact; - private String license; - private String licenseUrl; - - public ApiInfo() { - } - - public ApiInfo(String title, String description, String termsOfServiceUrl, String contact, String license, String - licenseUrl) { - this.title = title; - this.description = description; - this.termsOfServiceUrl = termsOfServiceUrl; - this.contact = contact; - this.license = license; - this.licenseUrl = licenseUrl; - } - - public String getTitle() { - return title; - } - - public void setTitle(String title) { - this.title = title; - } - - public String getDescription() { - return description; - } - - public void setDescription(String description) { - this.description = description; - } - - public String getTermsOfServiceUrl() { - return termsOfServiceUrl; - } - - public void setTermsOfServiceUrl(String termsOfServiceUrl) { - this.termsOfServiceUrl = termsOfServiceUrl; - } - - public String getContact() { - return contact; - } - - public void setContact(String contact) { - this.contact = contact; - } - - public String getLicense() { - return license; - } - - public void setLicense(String license) { - this.license = license; - } - - public String getLicenseUrl() { - return licenseUrl; - } - - public void setLicenseUrl(String licenseUrl) { - this.licenseUrl = licenseUrl; - } -} diff --git a/springfox-swagger1/src/main/java/springfox/documentation/swagger1/dto/ApiKey.java b/springfox-swagger1/src/main/java/springfox/documentation/swagger1/dto/ApiKey.java deleted file mode 100644 index cf5cd685382..00000000000 --- a/springfox-swagger1/src/main/java/springfox/documentation/swagger1/dto/ApiKey.java +++ /dev/null @@ -1,57 +0,0 @@ -/* - * - * Copyright 2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.swagger1.dto; - -public class ApiKey extends AuthorizationType { - private String keyname; - private String passAs; - - public ApiKey() { - super("apiKey"); - } - - public ApiKey(String keyname, String passAs) { - super("apiKey"); - this.keyname = keyname; - this.passAs = passAs; - } - - public ApiKey(String keyname) { - super("apiKey"); - this.keyname = keyname; - this.passAs = "header"; - } - - public String getKeyname() { - return keyname; - } - - public void setKeyname(String keyname) { - this.keyname = keyname; - } - - public String getPassAs() { - return passAs; - } - - public void setPassAs(String passAs) { - this.passAs = passAs; - } -} diff --git a/springfox-swagger1/src/main/java/springfox/documentation/swagger1/dto/ApiListing.java b/springfox-swagger1/src/main/java/springfox/documentation/swagger1/dto/ApiListing.java deleted file mode 100644 index 38e72a023dc..00000000000 --- a/springfox-swagger1/src/main/java/springfox/documentation/swagger1/dto/ApiListing.java +++ /dev/null @@ -1,227 +0,0 @@ -/* - * - * Copyright 2015-2019 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.swagger1.dto; - -import com.fasterxml.jackson.annotation.JsonIgnore; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonInclude.Include; -import com.fasterxml.jackson.annotation.JsonPropertyOrder; - -import java.util.Comparator; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.TreeMap; -import java.util.TreeSet; - -import static java.util.stream.Collectors.*; -import static springfox.documentation.builders.BuilderDefaults.*; - -@JsonPropertyOrder({ "apiVersion", "swaggerVersion", "basePath", "resourcePath", "produces", "consumes", "apis", - "models" }) -public class ApiListing { - private String apiVersion; - private String swaggerVersion; - private String basePath; - private String resourcePath; - private Set produces; - private Set consumes; - private List apis; - - @JsonIgnore - private Set protocols; - @JsonInclude(Include.NON_EMPTY) - private List authorizations; - @JsonInclude(Include.NON_EMPTY) - private Map models; - @JsonIgnore - private String description; - @JsonIgnore - private int position; - - public String getApiVersion() { - return apiVersion; - } - - public void setApiVersion(String apiVersion) { - this.apiVersion = apiVersion; - } - - public String getSwaggerVersion() { - return swaggerVersion; - } - - public void setSwaggerVersion(String swaggerVersion) { - this.swaggerVersion = swaggerVersion; - } - - public String getBasePath() { - return basePath; - } - - public void setBasePath(String basePath) { - this.basePath = basePath; - } - - public String getResourcePath() { - return resourcePath; - } - - public void setResourcePath(String resourcePath) { - this.resourcePath = resourcePath; - } - - public Set getProduces() { - return produces; - } - - public void setProduces(Set produces) { - if (produces != null) { - if (this.produces == null) { - this.produces = new TreeSet<>(); - } - this.produces.addAll(produces); - } - } - - public Set getConsumes() { - return consumes; - } - - public void setConsumes(Set consumes) { - if (consumes != null) { - if (this.consumes == null) { - this.consumes = new TreeSet<>(); - } - this.consumes.addAll(consumes); - } - } - - public Set getProtocols() { - return protocols; - } - - public void setProtocols(Set protocols) { - if (protocols != null) { - if (this.protocols == null) { - this.protocols = new TreeSet<>(); - } - this.protocols.addAll(protocols); - } - } - - public List getAuthorizations() { - return authorizations; - } - - public void setAuthorizations(List authorizations) { - this.authorizations = authorizations; - } - - public List getApis() { - return apis; - } - - public void setApis(List apis) { - this.apis = apis.stream() - .sorted(byPath() - .thenComparing(byDescription())).collect(toList()); - } - - public Map getModels() { - return models; - } - - public void setModels(Map models) { - if (models != null) { - if (this.models == null) { - this.models = new TreeMap<>(); - } - this.models.putAll(models); - } - } - - public String getDescription() { - return description; - } - - public void setDescription(String description) { - this.description = description; - } - - public int getPosition() { - return position; - } - - public void setPosition(int position) { - this.position = position; - } - - public void appendAuthorizations(List authorizations) { - if (!nullToEmptyList(authorizations).isEmpty()) { - this.authorizations = nullToEmptyList(this.authorizations); - this.authorizations.addAll(authorizations); - } - } - - public void appendApis(List apis) { - if (!nullToEmptyList(apis).isEmpty()) { - this.apis = nullToEmptyList(this.apis); - this.apis.addAll(apis); - } - } - - public void appendProtocols(Set protocols) { - if (!nullToEmptySet(protocols).isEmpty()) { - this.protocols = nullToEmptySet(this.protocols); - this.protocols.addAll(protocols); - } - } - - public void appendConsumes(Set consumes) { - if (!nullToEmptySet(consumes).isEmpty()) { - this.consumes = nullToEmptySet(this.consumes); - this.consumes.addAll(consumes); - } - } - - public void appendProduces(Set produces) { - if (!nullToEmptySet(produces).isEmpty()) { - this.produces = nullToEmptySet(this.produces); - this.produces.addAll(produces); - } - } - - public void appendModels(Map models) { - if (!nullToEmptyMap(models).isEmpty()) { - this.models = nullToEmptyMap(this.models); - this.models.putAll(models); - } - } - - private Comparator byPath() { - return Comparator.comparing(ApiDescription::getPath); - } - - private Comparator byDescription() { - return Comparator.comparing(ApiDescription::getDescription); - } -} - diff --git a/springfox-swagger1/src/main/java/springfox/documentation/swagger1/dto/ApiListingReference.java b/springfox-swagger1/src/main/java/springfox/documentation/swagger1/dto/ApiListingReference.java deleted file mode 100644 index dc536e51239..00000000000 --- a/springfox-swagger1/src/main/java/springfox/documentation/swagger1/dto/ApiListingReference.java +++ /dev/null @@ -1,59 +0,0 @@ -/* - * - * Copyright 2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.swagger1.dto; - -public class ApiListingReference { - private String path; - private String description; - private int position; - - public ApiListingReference() { - } - - public ApiListingReference(String path, String description, int position) { - this.path = path; - this.description = description; - this.position = position; - } - - public String getPath() { - return path; - } - - public void setPath(String path) { - this.path = path; - } - - public String getDescription() { - return description; - } - - public void setDescription(String description) { - this.description = description; - } - - public int getPosition() { - return position; - } - - public void setPosition(int position) { - this.position = position; - } -} diff --git a/springfox-swagger1/src/main/java/springfox/documentation/swagger1/dto/Authorization.java b/springfox-swagger1/src/main/java/springfox/documentation/swagger1/dto/Authorization.java deleted file mode 100644 index 1b37ee880af..00000000000 --- a/springfox-swagger1/src/main/java/springfox/documentation/swagger1/dto/Authorization.java +++ /dev/null @@ -1,56 +0,0 @@ -/* - * - * Copyright 2015-2019 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.swagger1.dto; - -import java.util.ArrayList; -import java.util.List; -import java.util.stream.Stream; - -import static java.util.stream.Collectors.*; - - -public class Authorization { - private String type; - private List scopes; - - public Authorization() { - } - - public Authorization(String type, AuthorizationScope[] scopes) { - this.scopes = Stream.of(scopes).collect(toList()); - this.type = type; - } - - public String getType() { - return type; - } - - public void setType(String type) { - this.type = type; - } - - public List getScopes() { - return scopes; - } - - public void setScopes(List scopes) { - this.scopes = new ArrayList<>(scopes); - } -} diff --git a/springfox-swagger1/src/main/java/springfox/documentation/swagger1/dto/AuthorizationCodeGrant.java b/springfox-swagger1/src/main/java/springfox/documentation/swagger1/dto/AuthorizationCodeGrant.java deleted file mode 100644 index 38ca911ab74..00000000000 --- a/springfox-swagger1/src/main/java/springfox/documentation/swagger1/dto/AuthorizationCodeGrant.java +++ /dev/null @@ -1,52 +0,0 @@ -/* - * - * Copyright 2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.swagger1.dto; - -public class AuthorizationCodeGrant extends GrantType { - - private TokenRequestEndpoint tokenRequestEndpoint; - private TokenEndpoint tokenEndpoint; - - public AuthorizationCodeGrant() { - super("authorization_code"); - } - - public AuthorizationCodeGrant(TokenRequestEndpoint tokenRequestEndpoint, TokenEndpoint tokenEndpoint) { - super("authorization_code"); - this.tokenRequestEndpoint = tokenRequestEndpoint; - this.tokenEndpoint = tokenEndpoint; - } - - public TokenRequestEndpoint getTokenRequestEndpoint() { - return tokenRequestEndpoint; - } - - public void setTokenRequestEndpoint(TokenRequestEndpoint tokenRequestEndpoint) { - this.tokenRequestEndpoint = tokenRequestEndpoint; - } - - public TokenEndpoint getTokenEndpoint() { - return tokenEndpoint; - } - - public void setTokenEndpoint(TokenEndpoint tokenEndpoint) { - this.tokenEndpoint = tokenEndpoint; - } -} diff --git a/springfox-swagger1/src/main/java/springfox/documentation/swagger1/dto/AuthorizationScope.java b/springfox-swagger1/src/main/java/springfox/documentation/swagger1/dto/AuthorizationScope.java deleted file mode 100644 index e7971a61e16..00000000000 --- a/springfox-swagger1/src/main/java/springfox/documentation/swagger1/dto/AuthorizationScope.java +++ /dev/null @@ -1,49 +0,0 @@ -/* - * - * Copyright 2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.swagger1.dto; - -public class AuthorizationScope { - private String scope; - private String description; - - public AuthorizationScope() { - } - - public AuthorizationScope(String scope, String description) { - this.description = description; - this.scope = scope; - } - - public String getScope() { - return scope; - } - - public void setScope(String scope) { - this.scope = scope; - } - - public String getDescription() { - return description; - } - - public void setDescription(String description) { - this.description = description; - } -} diff --git a/springfox-swagger1/src/main/java/springfox/documentation/swagger1/dto/AuthorizationType.java b/springfox-swagger1/src/main/java/springfox/documentation/swagger1/dto/AuthorizationType.java deleted file mode 100644 index 2a2de0f7a10..00000000000 --- a/springfox-swagger1/src/main/java/springfox/documentation/swagger1/dto/AuthorizationType.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * - * Copyright 2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.swagger1.dto; - -public abstract class AuthorizationType { - private final String type; - private String name; - - protected AuthorizationType(String type) { - this.type = type; - } - - public String getType() { - return type; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } -} diff --git a/springfox-swagger1/src/main/java/springfox/documentation/swagger1/dto/BasicAuth.java b/springfox-swagger1/src/main/java/springfox/documentation/swagger1/dto/BasicAuth.java deleted file mode 100644 index b839d972b32..00000000000 --- a/springfox-swagger1/src/main/java/springfox/documentation/swagger1/dto/BasicAuth.java +++ /dev/null @@ -1,27 +0,0 @@ -/* - * - * Copyright 2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.swagger1.dto; - -public class BasicAuth extends AuthorizationType { - public BasicAuth() { - super("basicAuth"); - } - -} diff --git a/springfox-swagger1/src/main/java/springfox/documentation/swagger1/dto/ContainerDataType.java b/springfox-swagger1/src/main/java/springfox/documentation/swagger1/dto/ContainerDataType.java deleted file mode 100644 index 4298c95c311..00000000000 --- a/springfox-swagger1/src/main/java/springfox/documentation/swagger1/dto/ContainerDataType.java +++ /dev/null @@ -1,61 +0,0 @@ -/* - * - * Copyright 2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.swagger1.dto; - -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.JsonPropertyOrder; - -@JsonPropertyOrder({"type", "items"}) -@JsonInclude(JsonInclude.Include.NON_NULL) -public class ContainerDataType implements SwaggerDataType { - private String type = "array"; - private final Boolean uniqueItems; - @JsonProperty - private final SwaggerDataType items; - - public ContainerDataType(String innerType, boolean uniqueItems) { - if (innerType == null) { - throw new IllegalArgumentException(("innerType may not be null")); - } - if (innerType.equalsIgnoreCase("array")) { - throw new IllegalArgumentException("Nested arrays not supported"); - } - items = new DataType(innerType); - this.uniqueItems = uniqueItems ? true : null; - } - - public String getType() { - return type; - } - - public Boolean isUniqueItems() { - return uniqueItems; - } - - public SwaggerDataType getItems() { - return items; - } - - @Override - public String getAbsoluteType() { - return type; - } -} diff --git a/springfox-swagger1/src/main/java/springfox/documentation/swagger1/dto/DataType.java b/springfox-swagger1/src/main/java/springfox/documentation/swagger1/dto/DataType.java deleted file mode 100644 index 6b468265cee..00000000000 --- a/springfox-swagger1/src/main/java/springfox/documentation/swagger1/dto/DataType.java +++ /dev/null @@ -1,117 +0,0 @@ -/* - * - * Copyright 2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.swagger1.dto; - -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.JsonUnwrapped; - -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -//CHECKSTYLE:OFF CyclomaticComplexityCheck -public class DataType implements SwaggerDataType { - @SuppressWarnings("java:S4784") - private static final Pattern containerPattern = Pattern.compile("([a-zA-Z]+)\\[([_a-zA-Z0-9\\.\\-]+)\\]"); - @JsonUnwrapped - @JsonProperty - private SwaggerDataType dataType; - - public DataType(String initialType) { - this.dataType = typeFromDataType(initialType); - } - - public SwaggerDataType typeFromDataType(String initialType) { - - if (isOfType(initialType.toLowerCase(), "void")) { - return new PrimitiveDataType("void"); - } - if (isOfType(initialType, "int")) { - return new PrimitiveFormatDataType("integer", "int32"); - } - if (isOfType(initialType, "long")) { - return new PrimitiveFormatDataType("integer", "int64"); - } - if (isOfType(initialType, "float")) { - return new PrimitiveFormatDataType("number", "float"); - } - if (isOfType(initialType, "double")) { - return new PrimitiveFormatDataType("number", "double"); - } - if (isOfType(initialType, "string")) { - return new PrimitiveDataType("string"); - } - if (isOfType(initialType, "byte")) { - return new PrimitiveFormatDataType("string", "byte"); - } - if (isOfType(initialType, "boolean")) { - return new PrimitiveDataType("boolean"); - } - if (isOfType(initialType, "Date") || isOfType(initialType, "DateTime")) { - return new PrimitiveFormatDataType("string", "date-time"); - } - if (isOfType(initialType, "bigdecimal")) { - return new PrimitiveDataType("number"); - } - if (isOfType(initialType, "biginteger")) { - return new PrimitiveDataType("integer"); - } - if (isOfType(initialType, "UUID")) { - return new PrimitiveFormatDataType("string", "uuid"); - } - if (isOfType(initialType, "date")) { - return new PrimitiveFormatDataType("string", "date"); - } - if (isOfType(initialType, "date-time")) { - return new PrimitiveFormatDataType("string", "date-time"); - } - if (isOfType(initialType, "__file")) { - return new PrimitiveDataType("File"); - } - Matcher matcher = containerPattern.matcher(initialType); - if (matcher.matches()) { - String containerInnerType = matcher.group(2); - if ("__file".equals(containerInnerType)) { - containerInnerType = "File"; - } - if (isUniqueContainerType(matcher.group(1))) { - return new ContainerDataType(containerInnerType, true); - } else { - return new ContainerDataType(containerInnerType, false); - } - } - - return new ReferenceDataType(initialType); - } - - private boolean isUniqueContainerType(String containerInnerType) { - return null != containerInnerType && containerInnerType.equalsIgnoreCase("Set"); - } - - private boolean isOfType(String initialType, String ofType) { - return initialType.equals(ofType); - } - - @Override - public String getAbsoluteType() { - return dataType.getAbsoluteType(); - } - -} -//CHECKSTYLE:ON diff --git a/springfox-swagger1/src/main/java/springfox/documentation/swagger1/dto/GrantType.java b/springfox-swagger1/src/main/java/springfox/documentation/swagger1/dto/GrantType.java deleted file mode 100644 index 4e86ea2babd..00000000000 --- a/springfox-swagger1/src/main/java/springfox/documentation/swagger1/dto/GrantType.java +++ /dev/null @@ -1,39 +0,0 @@ -/* - * - * Copyright 2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.swagger1.dto; - -public class GrantType { - private String type; - - public GrantType() { - } - - public GrantType(String type) { - this.type = type; - } - - public String getType() { - return type; - } - - public void setType(String type) { - this.type = type; - } -} diff --git a/springfox-swagger1/src/main/java/springfox/documentation/swagger1/dto/ImplicitGrant.java b/springfox-swagger1/src/main/java/springfox/documentation/swagger1/dto/ImplicitGrant.java deleted file mode 100644 index c710ce9d598..00000000000 --- a/springfox-swagger1/src/main/java/springfox/documentation/swagger1/dto/ImplicitGrant.java +++ /dev/null @@ -1,52 +0,0 @@ -/* - * - * Copyright 2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.swagger1.dto; - - -public class ImplicitGrant extends GrantType { - private LoginEndpoint loginEndpoint; - private String tokenName; - - public ImplicitGrant() { - super("implicit"); - } - - public ImplicitGrant(LoginEndpoint loginEndpoint, String tokenName) { - super("implicit"); - this.loginEndpoint = loginEndpoint; - this.tokenName = tokenName; - } - - public LoginEndpoint getLoginEndpoint() { - return loginEndpoint; - } - - public void setLoginEndpoint(LoginEndpoint loginEndpoint) { - this.loginEndpoint = loginEndpoint; - } - - public String getTokenName() { - return tokenName; - } - - public void setTokenName(String tokenName) { - this.tokenName = tokenName; - } -} diff --git a/springfox-swagger1/src/main/java/springfox/documentation/swagger1/dto/LoginEndpoint.java b/springfox-swagger1/src/main/java/springfox/documentation/swagger1/dto/LoginEndpoint.java deleted file mode 100644 index 8586e9655e6..00000000000 --- a/springfox-swagger1/src/main/java/springfox/documentation/swagger1/dto/LoginEndpoint.java +++ /dev/null @@ -1,39 +0,0 @@ -/* - * - * Copyright 2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.swagger1.dto; - -public class LoginEndpoint { - private String url; - - public LoginEndpoint() { - } - - public LoginEndpoint(String url) { - this.url = url; - } - - public String getUrl() { - return url; - } - - public void setUrl(String url) { - this.url = url; - } -} diff --git a/springfox-swagger1/src/main/java/springfox/documentation/swagger1/dto/ModelDto.java b/springfox-swagger1/src/main/java/springfox/documentation/swagger1/dto/ModelDto.java deleted file mode 100644 index c5d896529d2..00000000000 --- a/springfox-swagger1/src/main/java/springfox/documentation/swagger1/dto/ModelDto.java +++ /dev/null @@ -1,134 +0,0 @@ -/* - * - * Copyright 2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.swagger1.dto; - -import com.fasterxml.jackson.annotation.JsonIgnore; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; - -import java.util.List; -import java.util.Map; -import java.util.TreeMap; - -public class ModelDto { - - @JsonIgnore - private String id; - @JsonProperty("id") - private String name; - @JsonIgnore - private String qualifiedType; - private TreeMap properties = new TreeMap(); - private String description; - @JsonInclude(JsonInclude.Include.NON_EMPTY) - private String baseModel; - @JsonInclude(JsonInclude.Include.NON_EMPTY) - private String discriminator; - @JsonInclude(JsonInclude.Include.NON_EMPTY) - private List subTypes; - - public ModelDto() { - } - - - @SuppressWarnings("ParameterNumber") - public ModelDto( - String id, - String name, - String qualifiedType, - Map properties, - String description, - String baseModel, - String discriminator, - List subTypes) { - this.id = id; - this.name = name; - this.qualifiedType = qualifiedType; - this.properties.putAll(properties); - this.description = description; - this.baseModel = baseModel; - this.discriminator = discriminator; - this.subTypes = subTypes; - } - - public String getId() { - return id; - } - - public void setId(String id) { - this.id = id; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public String getQualifiedType() { - return qualifiedType; - } - - public void setQualifiedType(String qualifiedType) { - this.qualifiedType = qualifiedType; - } - - public Map getProperties() { - return properties; - } - - public void setProperties(Map properties) { - this.properties.putAll(properties); - } - - public String getDescription() { - return description; - } - - public void setDescription(String description) { - this.description = description; - } - - public String getBaseModel() { - return baseModel; - } - - public void setBaseModel(String baseModel) { - this.baseModel = baseModel; - } - - public String getDiscriminator() { - return discriminator; - } - - public void setDiscriminator(String discriminator) { - this.discriminator = discriminator; - } - - public List getSubTypes() { - return subTypes; - } - - public void setSubTypes(List subTypes) { - this.subTypes = subTypes; - } -} diff --git a/springfox-swagger1/src/main/java/springfox/documentation/swagger1/dto/ModelPropertyDto.java b/springfox-swagger1/src/main/java/springfox/documentation/swagger1/dto/ModelPropertyDto.java deleted file mode 100644 index a8430a3d1ee..00000000000 --- a/springfox-swagger1/src/main/java/springfox/documentation/swagger1/dto/ModelPropertyDto.java +++ /dev/null @@ -1,112 +0,0 @@ -/* - * - * Copyright 2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.swagger1.dto; - -import com.fasterxml.jackson.annotation.JsonIgnore; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.JsonUnwrapped; - -public class ModelPropertyDto { - @JsonProperty - @JsonUnwrapped - private DataType type; - @JsonIgnore - private String qualifiedType; - @JsonIgnore - private int position; - private Boolean required; - private String description; - @JsonProperty - @JsonUnwrapped - private AllowableValues allowableValues; - - @JsonIgnore - private String name; - - public ModelPropertyDto() { - } - - public ModelPropertyDto(String name, String type, String qualifiedType, int position, Boolean required, String - description, AllowableValues allowableValues) { - this.name = name; - this.type = new DataType(type); - this.qualifiedType = qualifiedType; - this.position = position; - this.required = required; - this.description = description; - this.allowableValues = allowableValues; - } - - public DataType getType() { - return type; - } - - public void setType(DataType type) { - this.type = type; - } - - public String getQualifiedType() { - return qualifiedType; - } - - public void setQualifiedType(String qualifiedType) { - this.qualifiedType = qualifiedType; - } - - public int getPosition() { - return position; - } - - public void setPosition(int position) { - this.position = position; - } - - public Boolean isRequired() { - return required; - } - - public String getDescription() { - return description; - } - - public void setDescription(String description) { - this.description = description; - } - - public AllowableValues getAllowableValues() { - return allowableValues; - } - - public void setAllowableValues(AllowableValues allowableValues) { - this.allowableValues = allowableValues; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public void setRequired(Boolean required) { - this.required = required; - } -} diff --git a/springfox-swagger1/src/main/java/springfox/documentation/swagger1/dto/OAuth.java b/springfox-swagger1/src/main/java/springfox/documentation/swagger1/dto/OAuth.java deleted file mode 100644 index b41ab4746c3..00000000000 --- a/springfox-swagger1/src/main/java/springfox/documentation/swagger1/dto/OAuth.java +++ /dev/null @@ -1,73 +0,0 @@ -/* - * - * Copyright 2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.swagger1.dto; - -import java.util.ArrayList; -import java.util.LinkedHashMap; -import java.util.List; - -public class OAuth extends AuthorizationType { - - private List scopes; - private LinkedHashMap grantTypes; - - public OAuth() { - super("oauth2"); - } - - public OAuth(List scopes, List gTypes) { - super("oauth2"); - this.scopes = scopes; - this.grantTypes = initializeGrantTypes(gTypes); - - } - - private LinkedHashMap initializeGrantTypes(List gTypes) { - if (null != gTypes) { - LinkedHashMap map = new LinkedHashMap(); - for (GrantType grantType : gTypes) { - map.put(grantType.getType(), grantType); - } - return map; - } - return null; - } - - @Override - public String getName() { - return getType(); - } - - public List getScopes() { - return scopes; - } - - public void setScopes(List scopes) { - this.scopes = scopes; - } - - public List getGrantTypes() { - return new ArrayList(grantTypes.values()); - } - - public void setGrantTypes(List grantTypes) { - this.grantTypes = initializeGrantTypes(grantTypes); - } -} diff --git a/springfox-swagger1/src/main/java/springfox/documentation/swagger1/dto/Operation.java b/springfox-swagger1/src/main/java/springfox/documentation/swagger1/dto/Operation.java deleted file mode 100644 index f8b2ffea0f2..00000000000 --- a/springfox-swagger1/src/main/java/springfox/documentation/swagger1/dto/Operation.java +++ /dev/null @@ -1,207 +0,0 @@ -/* - * - * Copyright 2015-2019 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.swagger1.dto; - -import com.fasterxml.jackson.annotation.*; - -import java.util.*; -import java.util.stream.Collectors; - -import static java.util.stream.Collectors.toList; -import static java.util.stream.Collectors.toMap; - -@JsonPropertyOrder({ - "method", "summary", "notes", "type", "nickname", "produces", - "consumes", "parameters", "responseMessages", "deprecated" -}) -public class Operation { - private String method; - private String summary; - @JsonInclude(JsonInclude.Include.NON_NULL) - private String notes; - @JsonProperty - @JsonUnwrapped - private SwaggerDataType dataType; - @JsonInclude(JsonInclude.Include.NON_NULL) - private String nickname; - @JsonIgnore - private int position; - private List produces; - private List consumes; - @JsonIgnore - private List protocol; - @JsonInclude(JsonInclude.Include.NON_EMPTY) - private Map> authorizations; - private List parameters; - private SortedSet responseMessages; - private String deprecated; - - public Operation() { - } - - @SuppressWarnings("ParameterNumber") - public Operation( - String method, - String summary, - String notes, - String responseClass, - String nickname, - int position, - List produces, - List consumes, - List protocol, - List authorizations, - List parameters, - Set responseMessages, - String deprecated) { - this.method = method; - this.summary = summary; - this.notes = notes; - this.dataType = new DataType(responseClass); - this.nickname = nickname; - this.position = position; - this.produces = produces; - this.consumes = consumes; - this.protocol = protocol; - this.authorizations = toAuthorizationsMap(authorizations); - this.parameters = parameters.stream() - .sorted(byName()).collect(toList()); - this.responseMessages = - responseMessages.stream() - .collect(Collectors.toCollection(() -> new TreeSet<>(responseMessageOrdering()))); - this.deprecated = deprecated; - } - - private Comparator responseMessageOrdering() { - return Comparator.comparingInt(ResponseMessage::getCode); - } - - private Map> toAuthorizationsMap(List authorizations) { - return authorizations.stream() - .collect(toMap(Authorization::getType, value -> new ArrayList<>(value.getScopes()))); - } - - public String getMethod() { - return method; - } - - public void setMethod(String method) { - this.method = method; - } - - public String getSummary() { - return summary; - } - - public void setSummary(String summary) { - this.summary = summary; - } - - public String getNotes() { - return notes; - } - - public void setNotes(String notes) { - this.notes = notes; - } - - - public String getNickname() { - return nickname; - } - - public void setNickname(String nickname) { - this.nickname = nickname; - } - - public int getPosition() { - return position; - } - - public void setPosition(int position) { - this.position = position; - } - - public List getProduces() { - return produces; - } - - public void setProduces(List produces) { - this.produces = produces; - } - - public List getConsumes() { - return consumes; - } - - public void setConsumes(List consumes) { - this.consumes = consumes; - } - - public List getProtocol() { - return protocol; - } - - public void setProtocol(List protocol) { - this.protocol = protocol; - } - - public Map> getAuthorizations() { - return authorizations; - } - - public void setAuthorizations(Map> authorizations) { - this.authorizations = authorizations; - } - - public List getParameters() { - return parameters; - } - - public void setParameters(List parameters) { - this.parameters = parameters; - } - - public Set getResponseMessages() { - return responseMessages; - } - - public void setResponseMessages(Set responseMessages) { - this.responseMessages = - responseMessages.stream() - .collect(Collectors.toCollection(() -> new TreeSet<>(responseMessageOrdering()))); - } - - public String getDeprecated() { - return deprecated; - } - - public void setDeprecated(String deprecated) { - this.deprecated = deprecated; - } - - public void setDataType(SwaggerDataType dataType) { - this.dataType = dataType; - } - - private Comparator byName() { - return Comparator.comparing(Parameter::getName); - } -} diff --git a/springfox-swagger1/src/main/java/springfox/documentation/swagger1/dto/Parameter.java b/springfox-swagger1/src/main/java/springfox/documentation/swagger1/dto/Parameter.java deleted file mode 100644 index 3913f02ad30..00000000000 --- a/springfox-swagger1/src/main/java/springfox/documentation/swagger1/dto/Parameter.java +++ /dev/null @@ -1,135 +0,0 @@ -/* - * - * Copyright 2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.swagger1.dto; - -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.JsonUnwrapped; - -public class Parameter { - @JsonProperty - @JsonUnwrapped - private SwaggerDataType parameterType; - private String name; - private String description; - private String defaultValue; - private Boolean required; - private Boolean allowMultiple; - @JsonProperty - @JsonUnwrapped - private AllowableValues allowableValues; - private String paramType; - private String paramAccess; - - public Parameter() { - } - - @SuppressWarnings("ParameterNumber") - public Parameter(String name, String description, String defaultValue, Boolean required, Boolean allowMultiple, - String dataType, AllowableValues allowableValues, String paramType, String paramAccess) { - this.description = description; - this.defaultValue = defaultValue; - this.required = required; - this.allowMultiple = allowMultiple; - this.allowableValues = allowableValues; - this.paramType = paramType; - this.paramAccess = paramAccess; - this.name = maybeOverrideName(name); - this.parameterType = new DataType(dataType); - } - - private String maybeOverrideName(String aName) { - if ("body".equals(paramType)) { - return paramType; - } - return aName; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public String getDescription() { - return description; - } - - public void setDescription(String description) { - this.description = description; - } - - public String getDefaultValue() { - return defaultValue; - } - - public void setDefaultValue(String defaultValue) { - this.defaultValue = defaultValue; - } - - public Boolean isRequired() { - return required; - } - - public Boolean isAllowMultiple() { - return allowMultiple; - } - - public AllowableValues getAllowableValues() { - return allowableValues; - } - - public void setAllowableValues(AllowableValues allowableValues) { - this.allowableValues = allowableValues; - } - - public String getParamType() { - return paramType; - } - - public void setParamType(String paramType) { - this.paramType = paramType; - } - - public String getParamAccess() { - return paramAccess; - } - - public void setParamAccess(String paramAccess) { - this.paramAccess = paramAccess; - } - - public SwaggerDataType getParameterType() { - return parameterType; - } - - public void setParameterType(SwaggerDataType parameterType) { - this.parameterType = parameterType; - } - - public void setRequired(Boolean required) { - this.required = required; - } - - public void setAllowMultiple(Boolean allowMultiple) { - this.allowMultiple = allowMultiple; - } -} diff --git a/springfox-swagger1/src/main/java/springfox/documentation/swagger1/dto/PrimitiveDataType.java b/springfox-swagger1/src/main/java/springfox/documentation/swagger1/dto/PrimitiveDataType.java deleted file mode 100644 index 8804c0a152e..00000000000 --- a/springfox-swagger1/src/main/java/springfox/documentation/swagger1/dto/PrimitiveDataType.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - * - * Copyright 2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.swagger1.dto; - -public class PrimitiveDataType implements SwaggerDataType { - private String type; - - public PrimitiveDataType(String type) { - this.type = type; - } - - public String getType() { - return type; - } - - @Override - public String getAbsoluteType() { - return type; - } -} diff --git a/springfox-swagger1/src/main/java/springfox/documentation/swagger1/dto/PrimitiveFormatDataType.java b/springfox-swagger1/src/main/java/springfox/documentation/swagger1/dto/PrimitiveFormatDataType.java deleted file mode 100644 index 81a21067803..00000000000 --- a/springfox-swagger1/src/main/java/springfox/documentation/swagger1/dto/PrimitiveFormatDataType.java +++ /dev/null @@ -1,44 +0,0 @@ -/* - * - * Copyright 2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.swagger1.dto; - - -public class PrimitiveFormatDataType implements SwaggerDataType { - private String type; - private String format; - - public PrimitiveFormatDataType(String type, String format) { - this.type = type; - this.format = format; - } - - public String getType() { - return type; - } - - public String getFormat() { - return format; - } - - @Override - public String getAbsoluteType() { - return type; - } -} diff --git a/springfox-swagger1/src/main/java/springfox/documentation/swagger1/dto/ReferenceDataType.java b/springfox-swagger1/src/main/java/springfox/documentation/swagger1/dto/ReferenceDataType.java deleted file mode 100644 index 5ed72d50489..00000000000 --- a/springfox-swagger1/src/main/java/springfox/documentation/swagger1/dto/ReferenceDataType.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - * - * Copyright 2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.swagger1.dto; - -import com.fasterxml.jackson.annotation.JsonIgnore; -import com.fasterxml.jackson.annotation.JsonProperty; - -public class ReferenceDataType implements SwaggerDataType { - @JsonProperty("type") - private String reference; - - public ReferenceDataType(String reference) { - this.reference = reference; - } - - public String getReference() { - return reference; - } - - @Override - @JsonIgnore - public String getAbsoluteType() { - return reference; - } -} diff --git a/springfox-swagger1/src/main/java/springfox/documentation/swagger1/dto/ResourceListing.java b/springfox-swagger1/src/main/java/springfox/documentation/swagger1/dto/ResourceListing.java deleted file mode 100644 index ad49d91d03b..00000000000 --- a/springfox-swagger1/src/main/java/springfox/documentation/swagger1/dto/ResourceListing.java +++ /dev/null @@ -1,95 +0,0 @@ -/* - * - * Copyright 2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.swagger1.dto; - -import java.util.ArrayList; -import java.util.LinkedHashMap; -import java.util.List; - -public class ResourceListing { - private String apiVersion; - private String swaggerVersion; - private List apis; - private LinkedHashMap authorizations; - private ApiInfo info; - - public ResourceListing() { - } - - public ResourceListing(String apiVersion, String swaggerVersion, List apis, List - authorizations, ApiInfo info) { - this.apiVersion = apiVersion; - this.swaggerVersion = swaggerVersion; - this.apis = apis; - this.authorizations = initializeAuthTypes(authorizations); - this.info = info; - } - - private LinkedHashMap initializeAuthTypes(List authorizationTypes) { - if (null != authorizationTypes) { - LinkedHashMap map = new LinkedHashMap(); - for (AuthorizationType authorizationType : authorizationTypes) { - map.put(authorizationType.getType(), authorizationType); - } - return map; - } - return null; - } - - public String getApiVersion() { - return apiVersion; - } - - public void setApiVersion(String apiVersion) { - this.apiVersion = apiVersion; - } - - public String getSwaggerVersion() { - return swaggerVersion; - } - - public void setSwaggerVersion(String swaggerVersion) { - this.swaggerVersion = swaggerVersion; - } - - public List getApis() { - return apis; - } - - public void setApis(List apis) { - this.apis = apis; - } - - public List getAuthorizations() { - return new ArrayList(authorizations.values()); - } - - public void setAuthorizations(List authorizations) { - this.authorizations = initializeAuthTypes(authorizations); - } - - public ApiInfo getInfo() { - return info; - } - - public void setInfo(ApiInfo info) { - this.info = info; - } -} diff --git a/springfox-swagger1/src/main/java/springfox/documentation/swagger1/dto/ResponseMessage.java b/springfox-swagger1/src/main/java/springfox/documentation/swagger1/dto/ResponseMessage.java deleted file mode 100644 index 8f8956a5883..00000000000 --- a/springfox-swagger1/src/main/java/springfox/documentation/swagger1/dto/ResponseMessage.java +++ /dev/null @@ -1,62 +0,0 @@ -/* - * - * Copyright 2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.swagger1.dto; - -import com.fasterxml.jackson.annotation.JsonInclude; - -public class ResponseMessage { - private int code; - @JsonInclude(JsonInclude.Include.ALWAYS) - private String message; - private String responseModel; - - public ResponseMessage() { - } - - public ResponseMessage(int code, String message, String responseModel) { - this.code = code; - this.message = message; - this.responseModel = responseModel; - } - - public int getCode() { - return code; - } - - public void setCode(int code) { - this.code = code; - } - - public String getMessage() { - return message; - } - - public void setMessage(String message) { - this.message = message; - } - - public String getResponseModel() { - return responseModel; - } - - public void setResponseModel(String responseModel) { - this.responseModel = responseModel; - } -} diff --git a/springfox-swagger1/src/main/java/springfox/documentation/swagger1/dto/SwaggerDataType.java b/springfox-swagger1/src/main/java/springfox/documentation/swagger1/dto/SwaggerDataType.java deleted file mode 100644 index 25ad1e4f5c4..00000000000 --- a/springfox-swagger1/src/main/java/springfox/documentation/swagger1/dto/SwaggerDataType.java +++ /dev/null @@ -1,24 +0,0 @@ -/* - * - * Copyright 2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.swagger1.dto; - -public interface SwaggerDataType { - String getAbsoluteType(); -} diff --git a/springfox-swagger1/src/main/java/springfox/documentation/swagger1/dto/TokenEndpoint.java b/springfox-swagger1/src/main/java/springfox/documentation/swagger1/dto/TokenEndpoint.java deleted file mode 100644 index 42e51bc7d5f..00000000000 --- a/springfox-swagger1/src/main/java/springfox/documentation/swagger1/dto/TokenEndpoint.java +++ /dev/null @@ -1,50 +0,0 @@ -/* - * - * Copyright 2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.swagger1.dto; - -public class TokenEndpoint { - - private String url; - private String tokenName; - - public TokenEndpoint() { - } - - public TokenEndpoint(String url, String tokenName) { - this.url = url; - this.tokenName = tokenName; - } - - public String getUrl() { - return url; - } - - public void setUrl(String url) { - this.url = url; - } - - public String getTokenName() { - return tokenName; - } - - public void setTokenName(String tokenName) { - this.tokenName = tokenName; - } -} diff --git a/springfox-swagger1/src/main/java/springfox/documentation/swagger1/dto/TokenRequestEndpoint.java b/springfox-swagger1/src/main/java/springfox/documentation/swagger1/dto/TokenRequestEndpoint.java deleted file mode 100644 index 8a928c230e2..00000000000 --- a/springfox-swagger1/src/main/java/springfox/documentation/swagger1/dto/TokenRequestEndpoint.java +++ /dev/null @@ -1,60 +0,0 @@ -/* - * - * Copyright 2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.swagger1.dto; - -public class TokenRequestEndpoint { - - private String url; - private String clientIdName; - private String clientSecretName; - - public TokenRequestEndpoint() { - } - - public TokenRequestEndpoint(String url, String clientIdName, String clientSecretName) { - this.url = url; - this.clientIdName = clientIdName; - this.clientSecretName = clientSecretName; - } - - public String getUrl() { - return url; - } - - public void setUrl(String url) { - this.url = url; - } - - public String getClientIdName() { - return clientIdName; - } - - public void setClientIdName(String clientIdName) { - this.clientIdName = clientIdName; - } - - public String getClientSecretName() { - return clientSecretName; - } - - public void setClientSecretName(String clientSecretName) { - this.clientSecretName = clientSecretName; - } -} diff --git a/springfox-swagger1/src/main/java/springfox/documentation/swagger1/mappers/AllowableValuesMapper.java b/springfox-swagger1/src/main/java/springfox/documentation/swagger1/mappers/AllowableValuesMapper.java deleted file mode 100644 index eae139f9caf..00000000000 --- a/springfox-swagger1/src/main/java/springfox/documentation/swagger1/mappers/AllowableValuesMapper.java +++ /dev/null @@ -1,51 +0,0 @@ -/* - * - * Copyright 2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.swagger1.mappers; - - -import org.mapstruct.Mapper; -import springfox.documentation.swagger1.dto.AllowableListValues; -import springfox.documentation.swagger1.dto.AllowableRangeValues; - -@Mapper -public abstract class AllowableValuesMapper { - - //Allowable values related - public abstract AllowableListValues toSwaggerAllowableListValues( - springfox.documentation.service.AllowableListValues from); - - public abstract AllowableRangeValues toSwaggerAllowableRangeValues( - springfox.documentation.service.AllowableRangeValues from); - - public springfox.documentation.swagger1.dto.AllowableValues toSwaggerAllowableValues( - springfox.documentation.service.AllowableValues original) { - if (original == null) { - return null; - } - - if (original instanceof springfox.documentation.service.AllowableListValues) { - return toSwaggerAllowableListValues((springfox.documentation.service.AllowableListValues) original); - } else if (original instanceof springfox.documentation.service.AllowableRangeValues) { - return toSwaggerAllowableRangeValues((springfox.documentation.service.AllowableRangeValues) - original); - } - throw new UnsupportedOperationException(); - } -} \ No newline at end of file diff --git a/springfox-swagger1/src/main/java/springfox/documentation/swagger1/mappers/AuthorizationTypesMapper.java b/springfox-swagger1/src/main/java/springfox/documentation/swagger1/mappers/AuthorizationTypesMapper.java deleted file mode 100644 index 6005016c1cd..00000000000 --- a/springfox-swagger1/src/main/java/springfox/documentation/swagger1/mappers/AuthorizationTypesMapper.java +++ /dev/null @@ -1,104 +0,0 @@ -/* - * - * Copyright 2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.swagger1.mappers; - -import org.mapstruct.Mapper; -import org.mapstruct.Mapping; -import org.mapstruct.Mappings; -import springfox.documentation.service.AuthorizationScope; -import springfox.documentation.service.SecurityReference; -import springfox.documentation.service.SecurityScheme; -import springfox.documentation.swagger1.dto.ApiKey; -import springfox.documentation.swagger1.dto.Authorization; -import springfox.documentation.swagger1.dto.AuthorizationCodeGrant; -import springfox.documentation.swagger1.dto.AuthorizationType; -import springfox.documentation.swagger1.dto.BasicAuth; -import springfox.documentation.swagger1.dto.ImplicitGrant; -import springfox.documentation.swagger1.dto.LoginEndpoint; -import springfox.documentation.swagger1.dto.TokenEndpoint; -import springfox.documentation.swagger1.dto.TokenRequestEndpoint; - -import java.util.List; - -@Mapper -public abstract class AuthorizationTypesMapper { - public abstract springfox.documentation.swagger1.dto.OAuth toSwaggerOAuth(springfox.documentation.service.OAuth from); - - public abstract BasicAuth toSwaggerBasicAuth(springfox.documentation.service.BasicAuth from); - - public abstract ApiKey toSwaggerApiKey(springfox.documentation.service.ApiKey from); - - public abstract ImplicitGrant toSwaggerImplicitGrant(springfox.documentation.service.ImplicitGrant from); - - public abstract AuthorizationCodeGrant - toSwaggerAuthorizationCodeGrant(springfox.documentation.service.AuthorizationCodeGrant from); - - public abstract TokenEndpoint toSwaggerTokenEndpoint(springfox.documentation.service.TokenEndpoint from); - - public abstract TokenRequestEndpoint - toSwaggerTokenRequestEndpoint(springfox.documentation.service.TokenRequestEndpoint from); - - public abstract springfox.documentation.swagger1.dto.AuthorizationScope - toSwaggerAuthorizationScope(AuthorizationScope from); - - @Mappings({ - @Mapping(target = "type", source = "reference") - }) - public abstract Authorization toSwaggerSecurityReference(SecurityReference from); - - public abstract LoginEndpoint toSwaggerLoginEndpoint(springfox.documentation.service.LoginEndpoint from); - - public springfox.documentation.swagger1.dto.GrantType toSwaggerGrantType( - springfox.documentation.service.GrantType from) { - - if (from instanceof springfox.documentation.service.ImplicitGrant) { - return toSwaggerImplicitGrant((springfox.documentation.service.ImplicitGrant) from); - } else if (from instanceof springfox.documentation.service.AuthorizationCodeGrant) { - return toSwaggerAuthorizationCodeGrant( - (springfox.documentation.service.AuthorizationCodeGrant) from); - } - throw new UnsupportedOperationException(); - } - - - public AuthorizationType toSwaggerAuthorizationType( - SecurityScheme from) { - - if (from instanceof springfox.documentation.service.ApiKey) { - return toSwaggerApiKey((springfox.documentation.service.ApiKey) from); - } else if (from instanceof springfox.documentation.service.OAuth) { - return toSwaggerOAuth((springfox.documentation.service.OAuth) from); - } else if (from instanceof springfox.documentation.service.BasicAuth) { - return toSwaggerBasicAuth((springfox.documentation.service.BasicAuth) from); - } - throw new UnsupportedOperationException(); - } - - //List types - public abstract List toSwaggerAuthorizationScopes( - List from); - - public abstract List toSwaggerGrantTypes(List from); - - public abstract List toSwaggerAuthorizationTypes( - List from); - -} diff --git a/springfox-swagger1/src/main/java/springfox/documentation/swagger1/mappers/DataTypeMapper.java b/springfox-swagger1/src/main/java/springfox/documentation/swagger1/mappers/DataTypeMapper.java deleted file mode 100644 index e51d60a0136..00000000000 --- a/springfox-swagger1/src/main/java/springfox/documentation/swagger1/mappers/DataTypeMapper.java +++ /dev/null @@ -1,109 +0,0 @@ -/* - * - * Copyright 2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.swagger1.mappers; - -import org.mapstruct.Mapper; -import org.mapstruct.Qualifier; -import springfox.documentation.swagger1.dto.DataType; - -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -@Mapper -/** - * Scheduled to be deleted @since 3.1.0 - */ -@Deprecated -public class DataTypeMapper { - @ResponseTypeName - public String responseTypeName(springfox.documentation.schema.ModelReference modelRef) { - if (modelRef == null) { - return null; - } - if (modelRef.isCollection()) { - if (modelRef.getItemType().equals("byte")) { - return "string"; - } - return "array"; - } - return modelRef.getType(); - } - - @OperationType - public DataType operationTypeFromModelRef(springfox.documentation.schema.ModelReference modelRef) { - if (modelRef != null) { - return new DataType(operationTypeName(modelRef)); - } - return null; - } - - @Type - public DataType typeFromModelRef(springfox.documentation.schema.ModelReference modelRef) { - if (modelRef != null) { - if (modelRef.isCollection()) { - if (modelRef.getItemType().equals("byte")) { - return new DataType("string"); - } - return new DataType(String.format("%s[%s]", modelRef.getType(), modelRef.getItemType())); - } - return new DataType(modelRef.getType()); - } - return null; - } - - private String operationTypeName(springfox.documentation.schema.ModelReference modelRef) { - if (modelRef == null) { - return null; - } - if (modelRef.isCollection()) { - if (modelRef.getItemType().equals("byte")) { - return "string"; - } - return String.format("%s[%s]", modelRef.getType(), modelRef.getItemType()); - } - return modelRef.getType(); - } - - @Qualifier - @Target(ElementType.METHOD) - @Retention(RetentionPolicy.SOURCE) - public @interface OperationType { - } - - @Qualifier - @Target(ElementType.METHOD) - @Retention(RetentionPolicy.SOURCE) - public @interface Type { - } - - @Qualifier - @Target(ElementType.METHOD) - @Retention(RetentionPolicy.SOURCE) - public @interface ResponseTypeName { - } - - @Qualifier - @Target(ElementType.METHOD) - @Retention(RetentionPolicy.SOURCE) - public @interface ItemType { - } -} diff --git a/springfox-swagger1/src/main/java/springfox/documentation/swagger1/mappers/Mappers.java b/springfox-swagger1/src/main/java/springfox/documentation/swagger1/mappers/Mappers.java deleted file mode 100644 index 609dfbb880b..00000000000 --- a/springfox-swagger1/src/main/java/springfox/documentation/swagger1/mappers/Mappers.java +++ /dev/null @@ -1,73 +0,0 @@ -/* - * - * Copyright 2015-2019 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.swagger1.mappers; - -import org.springframework.web.util.UriComponents; -import springfox.documentation.swagger1.dto.ApiListing; - -import jakarta.servlet.http.HttpServletRequest; -import java.util.AbstractMap; -import java.util.List; -import java.util.Map; -import java.util.function.Function; - -import static java.util.stream.Collectors.*; -import static org.springframework.util.StringUtils.*; -import static springfox.documentation.swagger.common.HostNameProvider.*; - -public class Mappers { - - private Mappers() { - throw new UnsupportedOperationException(); - } - - public static Function>, Map.Entry>> - toApiListingDto( - final HttpServletRequest servletRequest, - final String host, - final ServiceModelToSwaggerMapper mapper) { - - return entry -> { - List newApiListings = entry.getValue().stream().map(value -> { - ApiListing apiListing = mapper.toSwaggerApiListing(value); - UriComponents uriComponents = componentsFrom(servletRequest, apiListing.getBasePath()); - apiListing.setBasePath(adjustedBasePath(uriComponents, host, apiListing.getBasePath())); - return apiListing; - }).collect(toList()); - return new AbstractMap.SimpleEntry<>(entry.getKey(), newApiListings); - }; - } - - - private static String adjustedBasePath( - UriComponents uriComponents, - String hostNameOverride, - String basePath) { - if (hasLength(hostNameOverride)) { - int port = uriComponents.getPort(); - if (port > -1) { - return String.format("%s://%s:%d%s", uriComponents.getScheme(), hostNameOverride, port, basePath); - } - return String.format("%s://%s%s", uriComponents.getScheme(), hostNameOverride, basePath); - } - return basePath; - } -} diff --git a/springfox-swagger1/src/main/java/springfox/documentation/swagger1/mappers/ServiceModelToSwaggerMapper.java b/springfox-swagger1/src/main/java/springfox/documentation/swagger1/mappers/ServiceModelToSwaggerMapper.java deleted file mode 100644 index 96d84b82ad1..00000000000 --- a/springfox-swagger1/src/main/java/springfox/documentation/swagger1/mappers/ServiceModelToSwaggerMapper.java +++ /dev/null @@ -1,98 +0,0 @@ -/* - * - * Copyright 2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.swagger1.mappers; - -import io.swagger.models.Contact; -import org.mapstruct.Mapper; -import org.mapstruct.Mapping; -import org.mapstruct.Mappings; -import springfox.documentation.service.ApiListingReference; -import springfox.documentation.swagger1.dto.ApiDescription; -import springfox.documentation.swagger1.dto.ApiInfo; -import springfox.documentation.swagger1.dto.ApiListing; -import springfox.documentation.swagger1.dto.ModelDto; -import springfox.documentation.swagger1.dto.ModelPropertyDto; -import springfox.documentation.swagger1.dto.Operation; -import springfox.documentation.swagger1.dto.Parameter; -import springfox.documentation.swagger1.dto.ResourceListing; -import springfox.documentation.swagger1.dto.ResponseMessage; - - -@Mapper(uses = { - AllowableValuesMapper.class, - DataTypeMapper.class, - AuthorizationTypesMapper.class -}) -@SuppressWarnings("deprecation") -public interface ServiceModelToSwaggerMapper { - ApiDescription toSwaggerApiDescription(springfox.documentation.service.ApiDescription from); - - @Mappings({ - @Mapping(target = "contact", source = "contact.name") - }) - ApiInfo toSwaggerApiInfo(springfox.documentation.service.ApiInfo from); - - Contact map(springfox.documentation.service.Contact from); - - @Mappings({ - @Mapping( - target = "responseModel", - source = "responseModel", - qualifiedBy = DataTypeMapper.ResponseTypeName.class) - }) - ResponseMessage toSwaggerResponseMessage(springfox.documentation.service.ResponseMessage from); - - springfox.documentation.swagger1.dto.ApiListingReference toSwaggerApiListingReference(ApiListingReference from); - - @Mappings({ - @Mapping(target = "subTypes", source = "subTypes", qualifiedBy = DataTypeMapper.ResponseTypeName.class), - }) - ModelDto toSwaggerModelDto(springfox.documentation.schema.Model from); - - @Mappings({ - @Mapping(target = "swaggerVersion", constant = "1.2"), - @Mapping(target = "authorizations", source = "securityReferences") - }) - ApiListing toSwaggerApiListing(springfox.documentation.service.ApiListing from); - - @Mappings({ - @Mapping(target = "type", source = "modelRef", qualifiedBy = DataTypeMapper.Type.class) - }) - ModelPropertyDto toSwaggerModelPropertyDto(springfox.documentation.schema.ModelProperty from); - - @Mappings({ - @Mapping(target = "dataType", source = "responseModel", qualifiedBy = DataTypeMapper.OperationType.class), - @Mapping(target = "nickname", source = "uniqueId"), - @Mapping(target = "method", expression = "java(from.getMethod()!=null? from.getMethod().name():\"\")"), - @Mapping(target = "authorizations", source = "securityReferences") - }) - Operation toSwaggerOperation(springfox.documentation.service.Operation from); - - @Mappings({ - @Mapping(target = "parameterType", source = "modelRef", qualifiedBy = DataTypeMapper.OperationType.class) - }) - Parameter toSwaggerParameter(springfox.documentation.service.Parameter from); - - @Mappings({ - @Mapping(target = "swaggerVersion", constant = "1.2"), - @Mapping(target = "authorizations", source = "securitySchemes") - }) - ResourceListing toSwaggerResourceListing(springfox.documentation.service.ResourceListing from); -} diff --git a/springfox-swagger1/src/main/java/springfox/documentation/swagger1/readers/parameter/ParameterNameReader.java b/springfox-swagger1/src/main/java/springfox/documentation/swagger1/readers/parameter/ParameterNameReader.java deleted file mode 100644 index dbd74f906d7..00000000000 --- a/springfox-swagger1/src/main/java/springfox/documentation/swagger1/readers/parameter/ParameterNameReader.java +++ /dev/null @@ -1,64 +0,0 @@ -/* - * - * Copyright 2015-2019 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.swagger1.readers.parameter; - -import io.swagger.annotations.ApiParam; -import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Component; -import springfox.documentation.spi.DocumentationType; -import springfox.documentation.spi.service.ParameterBuilderPlugin; -import springfox.documentation.spi.service.contexts.ParameterContext; -import springfox.documentation.swagger.common.SwaggerPluginSupport; - -import java.util.Optional; -import java.util.function.Predicate; - -import static java.util.Optional.*; -import static springfox.documentation.spring.web.readers.parameter.ParameterTypeReader.*; - -@Component("swagger1ParameterNameReader") -@Order(SwaggerPluginSupport.SWAGGER_PLUGIN_ORDER) -@SuppressWarnings("deprecation") -public class ParameterNameReader implements ParameterBuilderPlugin { - - @Override - public void apply(ParameterContext context) { - Optional apiParam = context.resolvedMethodParameter().findAnnotation(ApiParam.class); - String paramType = findParameterType(context); - String name = null; - if (apiParam.isPresent()) { - name = ofNullable(apiParam.get().name()).filter(((Predicate) String::isEmpty).negate()).orElse(null); - } - context.parameterBuilder().name(maybeOverrideName(name, paramType)); - context.requestParameterBuilder().name(maybeOverrideName(name, paramType)); - } - - private String maybeOverrideName(String parameterName, String paramType) { - if ("body".equals(paramType)) { - return paramType; - } - return parameterName; - } - - @Override - public boolean supports(DocumentationType delimiter) { - return DocumentationType.SWAGGER_12.equals(delimiter); - } -} diff --git a/springfox-swagger1/src/main/java/springfox/documentation/swagger1/web/ApiListingMerger.java b/springfox-swagger1/src/main/java/springfox/documentation/swagger1/web/ApiListingMerger.java deleted file mode 100644 index 9086355ccf1..00000000000 --- a/springfox-swagger1/src/main/java/springfox/documentation/swagger1/web/ApiListingMerger.java +++ /dev/null @@ -1,56 +0,0 @@ -/* - * - * Copyright 2015-2019 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ -package springfox.documentation.swagger1.web; - -import springfox.documentation.swagger1.dto.ApiListing; - -import java.util.Collection; -import java.util.HashSet; -import java.util.Optional; - -import static java.util.Optional.*; -import static springfox.documentation.builders.BuilderDefaults.*; - -public class ApiListingMerger { - private ApiListingMerger() { - throw new UnsupportedOperationException(); - } - - public static Optional mergedApiListing(Collection apiListings) { - if (nullToEmptyList(apiListings).size() > 1) { - ApiListing merged = new ApiListing(); - merged.setSwaggerVersion("1.2"); - merged.setPosition(0); - for (ApiListing each : apiListings) { - merged.setApiVersion(each.getApiVersion()); - merged.setBasePath(each.getBasePath()); - merged.setResourcePath(each.getResourcePath()); - merged.setDescription(each.getDescription()); - merged.appendAuthorizations(each.getAuthorizations()); - merged.appendApis(each.getApis()); - merged.appendProtocols(new HashSet<>(each.getProtocols())); - merged.appendConsumes(new HashSet<>(each.getConsumes())); - merged.appendModels(each.getModels()); - merged.appendProduces(new HashSet<>(each.getProduces())); - } - return of(merged); - } - return nullToEmptyList(apiListings).stream().findFirst(); - } -} diff --git a/springfox-swagger1/src/main/java/springfox/documentation/swagger1/web/Swagger1Controller.java b/springfox-swagger1/src/main/java/springfox/documentation/swagger1/web/Swagger1Controller.java deleted file mode 100644 index 8567eb0968a..00000000000 --- a/springfox-swagger1/src/main/java/springfox/documentation/swagger1/web/Swagger1Controller.java +++ /dev/null @@ -1,127 +0,0 @@ -/* - * - * Copyright 2017 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.swagger1.web; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestMethod; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RestController; -import springfox.documentation.annotations.ApiIgnore; -import springfox.documentation.service.Documentation; -import springfox.documentation.spring.web.DocumentationCache; -import springfox.documentation.spring.web.json.Json; -import springfox.documentation.spring.web.json.JsonSerializer; -import springfox.documentation.spring.web.plugins.Docket; -import springfox.documentation.swagger1.dto.ApiListing; -import springfox.documentation.swagger1.dto.ResourceListing; -import springfox.documentation.swagger1.mappers.ServiceModelToSwaggerMapper; - -import jakarta.servlet.http.HttpServletRequest; -import java.util.Collection; -import java.util.List; -import java.util.Map; -import java.util.function.Function; - -import static java.util.Optional.*; -import static java.util.stream.Collectors.*; -import static springfox.documentation.swagger1.mappers.Mappers.*; -import static springfox.documentation.swagger1.web.ApiListingMerger.*; - -@RestController -@ApiIgnore -@RequestMapping("${springfox.documentation.swagger.v1.path:/api-docs}") -public class Swagger1Controller { - - private final DocumentationCache documentationCache; - private final ServiceModelToSwaggerMapper mapper; - private final JsonSerializer jsonSerializer; - - @Autowired - public Swagger1Controller( - DocumentationCache documentationCache, - ServiceModelToSwaggerMapper mapper, - JsonSerializer jsonSerializer) { - - this.documentationCache = documentationCache; - this.mapper = mapper; - this.jsonSerializer = jsonSerializer; - } - - @RequestMapping(method = RequestMethod.GET) - public ResponseEntity getResourceListing( - @RequestParam(value = "group", required = false) String swaggerGroup) { - - return getSwaggerResourceListing(swaggerGroup); - } - - @RequestMapping(value = "/{swaggerGroup}/{apiDeclaration}", method = RequestMethod.GET) - public ResponseEntity getApiListing( - @PathVariable String swaggerGroup, - @PathVariable String apiDeclaration, - HttpServletRequest servletRequest) { - - return getSwaggerApiListing(swaggerGroup, apiDeclaration, servletRequest); - } - - private ResponseEntity getSwaggerApiListing( - String swaggerGroup, - String apiDeclaration, - HttpServletRequest servletRequest) { - - String groupName = ofNullable(swaggerGroup).orElse("default"); - Documentation documentation = documentationCache.documentationByGroup(groupName); - if (documentation == null) { - return new ResponseEntity<>(HttpStatus.NOT_FOUND); - } - Map> apiListingMap = documentation.getApiListings(); - Map> dtoApiListings - = apiListingMap.entrySet().stream() - .map(toApiListingDto(servletRequest, documentation.getHost(), mapper)) - .collect(toMap(Map.Entry::getKey, Map.Entry::getValue)); - - Collection apiListings = dtoApiListings.get(apiDeclaration); - return mergedApiListing(apiListings) - .map(jsonSerializer::toJson) - .map(toResponseEntity()) - .orElse(new ResponseEntity<>(HttpStatus.NOT_FOUND)); - } - - private ResponseEntity getSwaggerResourceListing(String swaggerGroup) { - String groupName = ofNullable(swaggerGroup).orElse(Docket.DEFAULT_GROUP_NAME); - Documentation documentation = documentationCache.documentationByGroup(groupName); - if (documentation == null) { - return new ResponseEntity<>(HttpStatus.NOT_FOUND); - } - springfox.documentation.service.ResourceListing listing = documentation.getResourceListing(); - ResourceListing resourceListing = mapper.toSwaggerResourceListing(listing); - - return ofNullable(jsonSerializer.toJson(resourceListing)) - .map(toResponseEntity()) - .orElse(new ResponseEntity<>(HttpStatus.NOT_FOUND)); - } - - private Function> toResponseEntity() { - return input -> new ResponseEntity<>(input, HttpStatus.OK); - } -} diff --git a/springfox-swagger1/src/main/java/springfox/documentation/swagger1/web/SwaggerDefaultConfiguration.java b/springfox-swagger1/src/main/java/springfox/documentation/swagger1/web/SwaggerDefaultConfiguration.java deleted file mode 100644 index 97fb25c8860..00000000000 --- a/springfox-swagger1/src/main/java/springfox/documentation/swagger1/web/SwaggerDefaultConfiguration.java +++ /dev/null @@ -1,75 +0,0 @@ -/* - * - * Copyright 2015-2019 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.swagger1.web; - -import com.fasterxml.classmate.TypeResolver; -import springfox.documentation.PathProvider; -import springfox.documentation.schema.AlternateTypeRule; -import springfox.documentation.schema.WildcardType; -import springfox.documentation.spi.DocumentationType; -import springfox.documentation.spi.service.DefaultsProviderPlugin; -import springfox.documentation.spi.service.contexts.Defaults; -import springfox.documentation.spi.service.contexts.DocumentationContextBuilder; -import springfox.documentation.spring.web.plugins.DefaultConfiguration; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -import static springfox.documentation.schema.AlternateTypeRules.*; - -public class SwaggerDefaultConfiguration implements DefaultsProviderPlugin { - - private final DefaultConfiguration defaultConfiguration; - private final TypeResolver typeResolver; - - public SwaggerDefaultConfiguration( - Defaults defaults, - TypeResolver typeResolver, - PathProvider pathProvider) { - this.typeResolver = typeResolver; - defaultConfiguration = new DefaultConfiguration(defaults, typeResolver, pathProvider); - } - - @Override - public DocumentationContextBuilder create(DocumentationType documentationType) { - List rules = new ArrayList<>(); - rules.add(newRule(typeResolver.resolve(Map.class, String.class, String.class), - typeResolver.resolve(Object.class))); - rules.add(newMapRule(WildcardType.class, WildcardType.class)); - return defaultConfiguration - .create(documentationType) - .rules(rules); - } - - @Override - public DocumentationContextBuilder apply(DocumentationContextBuilder builder) { - List rules = new ArrayList<>(); - rules.add(newRule(typeResolver.resolve(Map.class, String.class, String.class), - typeResolver.resolve(Object.class))); - rules.add(newMapRule(WildcardType.class, WildcardType.class)); - return builder.rules(rules); - } - - @Override - public boolean supports(DocumentationType delimiter) { - return DocumentationType.SWAGGER_12.equals(delimiter); - } -} diff --git a/springfox-swagger1/src/test/groovy/springfox/documentation/schema/property/field/FieldModelPropertySpec.groovy b/springfox-swagger1/src/test/groovy/springfox/documentation/schema/property/field/FieldModelPropertySpec.groovy deleted file mode 100644 index 2f923201663..00000000000 --- a/springfox-swagger1/src/test/groovy/springfox/documentation/schema/property/field/FieldModelPropertySpec.groovy +++ /dev/null @@ -1,115 +0,0 @@ -/* - * - * Copyright 2015-2019 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.schema.property.field - -import com.fasterxml.classmate.TypeResolver -import spock.lang.Shared -import spock.lang.Unroll -import springfox.documentation.schema.DefaultGenericTypeNamingStrategy -import springfox.documentation.schema.SchemaSpecification -import springfox.documentation.schema.TypeWithGettersAndSetters -import springfox.documentation.schema.mixins.ModelPropertyLookupSupport -import springfox.documentation.service.AllowableListValues - -import static java.util.Collections.* -import static springfox.documentation.spi.DocumentationType.* -import static springfox.documentation.spi.schema.contexts.ModelContext.* - -class FieldModelPropertySpec extends SchemaSpecification implements ModelPropertyLookupSupport { - @Shared def namingStrategy = new DefaultGenericTypeNamingStrategy() - @Shared def resolver = new TypeResolver() - - @Unroll - def "Extracting information from resolved field #fieldName"() { - given: - def modelContext = inputParam( - "0_0", - "group", - resolver.resolve(TypeWithGettersAndSetters), - Optional.empty(), - new HashSet<>(), - SWAGGER_12, - alternateTypeProvider(), - namingStrategy, - emptySet()) - def field = field(TypeWithGettersAndSetters, fieldName) - def jacksonProperty = beanPropertyDefinitionByField(TypeWithGettersAndSetters, fieldName) - def sut = new FieldModelProperty( - fieldName, - field, - resolver, - alternateTypeProvider(), - jacksonProperty) - - expect: - sut.propertyDescription() == null //documentationType(): Added test - !sut.required - typeNameExtractor.typeName(fromParent(modelContext, sut.getType())) == typeName - sut.qualifiedTypeName() == qualifiedTypeName - if (allowableValues != null) { - def values = new ArrayList(allowableValues) - sut.allowableValues() == new AllowableListValues(values, "string") - } else { - sut.allowableValues() == null - } - sut.getName() == fieldName - sut.getType() == field.getType() - - where: - fieldName || description | isRequired | typeName | qualifiedTypeName | allowableValues - "intProp" || "int Property Field" | true | "int" | "int" | null - "boolProp" || null | false | "boolean" | "boolean" | null - } - - def "Extracting information from generic fields with array type binding"() { - given: - def typeToTest = TypeWithGettersAndSetters - def modelContext = inputParam( - "0_0", - "group", - resolver.resolve(typeToTest), - Optional.empty(), - new HashSet<>(), - SWAGGER_12, - alternateTypeProvider(), - namingStrategy, - emptySet()) - def field = field(typeToTest, fieldName) - def jacksonProperty = beanPropertyDefinitionByField(TypeWithGettersAndSetters, fieldName) - def sut = new FieldModelProperty( - fieldName, - field, - resolver, - alternateTypeProvider(), - jacksonProperty) - - expect: - typeNameExtractor.typeName(fromParent(modelContext, sut.getType())) == typeName - sut.qualifiedTypeName() == qualifiedTypeName - sut.getName() == fieldName - sut.getType() == field.getType() - - - where: - fieldName || typeName | qualifiedTypeName - "genericByteArray" || "GenericType«Array«byte»»" | "springfox.documentation.schema.GenericType" - "genericCategoryArray" || "GenericType«Array«Category»»" | "springfox.documentation.schema.GenericType" - } -} diff --git a/springfox-swagger1/src/test/groovy/springfox/documentation/schema/property/property/BeanModelPropertySpec.groovy b/springfox-swagger1/src/test/groovy/springfox/documentation/schema/property/property/BeanModelPropertySpec.groovy deleted file mode 100755 index 2f5567c1390..00000000000 --- a/springfox-swagger1/src/test/groovy/springfox/documentation/schema/property/property/BeanModelPropertySpec.groovy +++ /dev/null @@ -1,175 +0,0 @@ -/* - * - * Copyright 2015-2019 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ -package springfox.documentation.schema.property.property - -import com.fasterxml.classmate.TypeResolver -import com.fasterxml.jackson.databind.ObjectMapper -import spock.lang.Ignore -import spock.lang.Shared -import spock.lang.Unroll -import springfox.documentation.schema.DefaultGenericTypeNamingStrategy -import springfox.documentation.schema.SchemaSpecification -import springfox.documentation.schema.TypeWithAnnotatedGettersAndSetters -import springfox.documentation.schema.TypeWithGettersAndSetters -import springfox.documentation.schema.configuration.ObjectMapperConfigured -import springfox.documentation.schema.mixins.ModelPropertyLookupSupport -import springfox.documentation.schema.property.ObjectMapperBeanPropertyNamingStrategy -import springfox.documentation.schema.property.bean.BeanModelProperty -import springfox.documentation.service.AllowableListValues - -import static java.util.Collections.* -import static springfox.documentation.schema.property.BeanPropertyDefinitions.* -import static springfox.documentation.spi.DocumentationType.* -import static springfox.documentation.spi.schema.contexts.ModelContext.* - -class BeanModelPropertySpec extends SchemaSpecification implements ModelPropertyLookupSupport { - @Shared def resolver = new TypeResolver() - @Shared def namingStrategy = new DefaultGenericTypeNamingStrategy() - - @Unroll - def "Extracting information from resolved properties #methodName"() { - given: - Class typeToTest = TypeWithGettersAndSetters - def modelContext = inputParam("0_0", - "group", - resolver.resolve(typeToTest), - Optional.empty(), - new HashSet<>(), - SWAGGER_12, - alternateTypeProvider(), - namingStrategy, - emptySet()) - def method = accessorMethod(typeToTest, methodName) - def propertyDefinition = beanPropertyDefinition(typeToTest, methodName) - - ObjectMapper mapper = new ObjectMapper() - def namingStrategy = new ObjectMapperBeanPropertyNamingStrategy() - namingStrategy.onApplicationEvent(new ObjectMapperConfigured(this, mapper)) - String propName = name(propertyDefinition, true, namingStrategy, "") - def sut = new BeanModelProperty( - propName, - method, - new TypeResolver(), - alternateTypeProvider(), - propertyDefinition) - - - expect: - sut.propertyDescription() == null - !sut.required - sut.isReadOnly() - typeNameExtractor.typeName(fromParent(modelContext, sut.getType())) == typeName - sut.qualifiedTypeName() == qualifiedTypeName - sut.allowableValues() == null - - - where: - methodName | required | typeName | qualifiedTypeName - "getIntProp" | true | "int" | "int" - "isBoolProp" | false | "boolean" | "boolean" - "setIntProp" | true | "int" | "int" - "setBoolProp" | false | "boolean" | "boolean" - } - - @Ignore("Fix this via the plugin manager") - def "Extracting information from ApiModelProperty annotation"() { - given: - Class typeToTest = TypeWithAnnotatedGettersAndSetters - def modelContext = inputParam("0_0", - "group", - resolver.resolve(typeToTest), - Optional.empty(), - new HashSet<>(), - SWAGGER_12, - alternateTypeProvider(), - namingStrategy, - emptySet()) - def method = accessorMethod(typeToTest, methodName) - def propertyDefinition = beanPropertyDefinition(typeToTest, methodName) - - ObjectMapper mapper = new ObjectMapper() - def namingStrategy = new ObjectMapperBeanPropertyNamingStrategy() - namingStrategy.onApplicationEvent(new ObjectMapperConfigured(this, mapper)) - String propName = name(propertyDefinition, true, namingStrategy, "") - def sut = new BeanModelProperty( - propName, - method, - new TypeResolver(), - alternateTypeProvider(), - propertyDefinition) - - expect: - sut.propertyDescription() == description - sut.required == required - !sut.isReadOnly() - typeNameExtractor.typeName(modelContext) == typeName - sut.qualifiedTypeName() == qualifiedTypeName - - if (allowableValues) { - sut.allowableValues().getValues() == allowableValues.getValues() - sut.allowableValues().getValueType() == allowableValues.getValueType() - } - - where: - methodName | description | required | allowableValues | typeName | qualifiedTypeName - "getIntProp" | "int Property Field" | true | null | "int" | "int" - "isBoolProp" | "bool Property Getter" | false | null | "boolean" | "boolean" - "getEnumProp" | "enum Prop Getter value" | true | new AllowableListValues(Stream.of("ONE", "TWO").collect(toList()), "LIST") | "string" | "springfox.documentation.schema.ExampleEnum" - "setIntProp" | "int Property Field" | true | null | "int" | "int" - "setBoolProp" | "bool Property Getter" | false | null | "boolean" | "boolean" - "setEnumProp" | "enum Prop Getter value" | true | new AllowableListValues(Stream.of("ONE", "TWO").collect(toList()), "LIST") | "string" | "springfox.documentation.schema.ExampleEnum" - } - - def "Respects JsonGetter annotations"() { - - given: - Class typeToTest = typeForTestingJsonGetterAnnotation() - def modelContext = inputParam("0_0", - "group", - resolver.resolve(typeToTest), - Optional.empty(), - new HashSet<>(), - SWAGGER_12, - alternateTypeProvider(), - namingStrategy, - emptySet()) - def method = accessorMethod(typeToTest, methodName) - def propertyDefinition = beanPropertyDefinition(typeToTest, methodName) - - ObjectMapper mapper = new ObjectMapper() - def namingStrategy = new ObjectMapperBeanPropertyNamingStrategy() - namingStrategy.onApplicationEvent(new ObjectMapperConfigured(this, mapper)) - String propName = name(propertyDefinition, true, namingStrategy, "") - def sut = new BeanModelProperty( - propName, - method, - new TypeResolver(), - alternateTypeProvider(), - propertyDefinition) - - expect: - typeNameExtractor.typeName(fromParent(modelContext, sut.getType())) == typeName - sut.qualifiedTypeName() == qualifiedTypeName - sut.allowableValues() == null - - where: - methodName || typeName | qualifiedTypeName - "value1" || "string" | "java.lang.String" - } -} diff --git a/springfox-swagger1/src/test/groovy/springfox/documentation/spring/web/scanners/ApiDocumentationScannerSpec.groovy b/springfox-swagger1/src/test/groovy/springfox/documentation/spring/web/scanners/ApiDocumentationScannerSpec.groovy deleted file mode 100644 index 4bb8e3434d5..00000000000 --- a/springfox-swagger1/src/test/groovy/springfox/documentation/spring/web/scanners/ApiDocumentationScannerSpec.groovy +++ /dev/null @@ -1,164 +0,0 @@ -/* - * - * Copyright 2015-2019 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.spring.web.scanners - -import springfox.documentation.builders.ApiDescriptionBuilder -import springfox.documentation.builders.ApiListingBuilder -import springfox.documentation.service.ApiInfo -import springfox.documentation.service.ApiKey -import springfox.documentation.service.Documentation -import springfox.documentation.service.ResourceListing -import springfox.documentation.spi.service.contexts.Defaults -import springfox.documentation.spring.web.mixins.RequestMappingSupport -import springfox.documentation.spring.web.plugins.DocumentationContextSpec - -import static springfox.documentation.builders.PathSelectors.* - -class ApiDocumentationScannerSpec extends DocumentationContextSpec implements RequestMappingSupport { - - ApiListingReferenceScanner listingReferenceScanner = Mock(ApiListingReferenceScanner) - ApiListingScanner listingScanner = Mock(ApiListingScanner) - ApiDocumentationScanner docScanner = new ApiDocumentationScanner(listingReferenceScanner, listingScanner) - - def "default swagger resource"() { - when: "I create a swagger resource" - listingReferenceScanner.scan(_) >> new ApiListingReferenceScanResult(new HashMap<>()) - listingScanner.scan(_) >> new HashMap<>() - and: - Documentation scanned = docScanner.scan(documentationContext()) - - then: "I should should have the correct defaults" - ResourceListing resourceListing = scanned.resourceListing - def apiListingReferenceList = resourceListing.getApis() - def authorizationTypes = resourceListing.getSecuritySchemes() - - scanned.groupName == "default" - resourceListing.getApiVersion() == "1.0" - - resourceListing.getInfo() != null - apiListingReferenceList == [] - authorizationTypes == [] - } - - def "resource with api info"() { - given: - ApiInfo expected = new ApiInfo("title", "description", "1.0", "terms", "contact", "license", "licenseUrl") - when: - plugin - .groupName("groupName") - .select() - .paths(regex(".*")) - .build() - .apiInfo(expected) - .configure(contextBuilder) - listingReferenceScanner.scan(_) >> new ApiListingReferenceScanResult(new HashMap<>()) - listingScanner.scan(_) >> new HashMap<>() - and: - Documentation scanned = docScanner.scan(documentationContext()) - then: - ApiInfo actual = scanned.getResourceListing().getInfo() - actual.getTitle() == expected.getTitle() - actual.getVersion() == expected.getVersion() - actual.getDescription() == expected.getDescription() - actual.getTermsOfServiceUrl() == expected.getTermsOfServiceUrl() - actual.getContact() == expected.getContact() - actual.getLicense() == expected.getLicense() - actual.getLicenseUrl() == expected.getLicenseUrl() - } - - def "resource with authorization types"() { - given: - ApiKey apiKey = new ApiKey("my-key", "api_key", "header") - when: - plugin - .groupName("groupName") - .select() - .paths(regex(".*")) - .build() - .securitySchemes([apiKey]) - .configure(contextBuilder) - listingReferenceScanner.scan(_) >> new ApiListingReferenceScanResult(new HashMap<>()) - listingScanner.scan(_) >> new HashMap<>() - and: - Documentation scanned = docScanner.scan(documentationContext()) - then: - ResourceListing resourceListing = scanned.resourceListing - def authorizationTypes = resourceListing.getSecuritySchemes() - def apiKeyAuthType = authorizationTypes[0] - apiKeyAuthType instanceof ApiKey - apiKeyAuthType.name == "my-key" - apiKeyAuthType.keyname == "api_key" - apiKeyAuthType.passAs == "header" - } - - def "Should sort based on position"() { - given: - def defaults = new Defaults() - def ordering = defaults.apiListingReferenceOrdering() - plugin - .groupName("groupName") - .select() - .paths(regex(".*")) - .build() - .apiListingReferenceOrdering(ordering) - .configure(contextBuilder) - - def listingsMap = new HashMap<>() - def listings = [ - apiListing(defaults, 1, "/b"), - apiListing(defaults, 2, "/c"), - apiListing(defaults, 2, "/a"), - ] - listings.each { - listingsMap.putIfAbsent("test", new LinkedList()) - listingsMap.get("test").add(it) - } - listingReferenceScanner.scan(_) >> new ApiListingReferenceScanResult(new HashMap<>()) - listingScanner.scan(_) >> listingsMap - - - when: - Documentation scanned = docScanner.scan(documentationContext()) - - then: - def firstResouceListingApi = scanned.resourceListing.apis.get(0) - firstResouceListingApi.path == "/groupName/test" - firstResouceListingApi.description.normalize() == """Operation with path /a and position 2 - |Operation with path /b and position 1 - |Operation with path /c and position 2""".stripMargin() - - where: - index | path | position - 0 | '/b' | 0 - 1 | '/a' | 0 - 2 | '/c' | 0 - } - - def apiListing(Defaults defaults, int position, String path) { - new ApiListingBuilder(defaults.apiDescriptionOrdering()) - .position(position) - .apis([new ApiDescriptionBuilder(defaults.operationOrdering()) - .path(path) - .build()]) - .description("Operation with path $path and position $position") - .build() - } - -} diff --git a/springfox-swagger1/src/test/groovy/springfox/documentation/spring/web/scanners/SwaggerApiListingReferenceScannerSpec.groovy b/springfox-swagger1/src/test/groovy/springfox/documentation/spring/web/scanners/SwaggerApiListingReferenceScannerSpec.groovy deleted file mode 100644 index b99862f191a..00000000000 --- a/springfox-swagger1/src/test/groovy/springfox/documentation/spring/web/scanners/SwaggerApiListingReferenceScannerSpec.groovy +++ /dev/null @@ -1,153 +0,0 @@ -/* - * - * Copyright 2015-2019 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.spring.web.scanners - -import com.fasterxml.classmate.TypeResolver -import org.springframework.web.servlet.mvc.method.RequestMappingInfo -import springfox.documentation.RequestHandler -import springfox.documentation.annotations.ApiIgnore -import springfox.documentation.service.ResourceGroup - -import springfox.documentation.spring.web.WebMvcRequestHandler -import springfox.documentation.spring.web.dummy.DummyClass -import springfox.documentation.spring.web.dummy.DummyController -import springfox.documentation.spring.web.mixins.AccessorAssertions -import springfox.documentation.spring.web.mixins.RequestMappingSupport -import springfox.documentation.spring.web.paths.DefaultPathProvider -import springfox.documentation.spring.web.plugins.DocumentationContextSpec -import springfox.documentation.spring.web.readers.operation.HandlerMethodResolver - -import static java.util.Optional.* -import static springfox.documentation.builders.PathSelectors.* -import static springfox.documentation.builders.RequestHandlerSelectors.* -import static springfox.documentation.spring.web.paths.Paths.* - -class SwaggerApiListingReferenceScannerSpec - extends DocumentationContextSpec - implements RequestMappingSupport, - AccessorAssertions { - - ApiListingReferenceScanner sut = new ApiListingReferenceScanner() - List requestHandlers - def methodResolver = new HandlerMethodResolver(new TypeResolver()) - - - def setup() { - requestHandlers = [Mock(RequestHandler)] - contextBuilder.requestHandlers(requestHandlers) - plugin - .pathProvider(new DefaultPathProvider()) - .select() - .apis(withClassAnnotation(ApiIgnore).negate()) - .paths(regex(".*?")) - .build() - } - - def "should not get expected exceptions with invalid constructor params"() { - given: - contextBuilder.requestHandlers(handlerMappings) - - when: - plugin - .groupName(groupName) - .configure(contextBuilder) - - then: - documentationContext().groupName == "default" - - where: - handlerMappings | groupName | message - [requestMappingInfo("path")] | null | "resourceGroupingStrategy is required" - [requestMappingInfo("path")] | null | "groupName is required" - } - - def "should group controller paths"() { - when: - RequestMappingInfo businessRequestMappingInfo = requestMappingInfo("/api/v1/businesses") - RequestMappingInfo accountsRequestMappingInfo = requestMappingInfo("/api/v1/accounts") - requestHandlers = - [ - new WebMvcRequestHandler(ROOT, new HandlerMethodResolver(new TypeResolver()), businessRequestMappingInfo, dummyHandlerMethod()), - new WebMvcRequestHandler(ROOT, new HandlerMethodResolver(new TypeResolver()), accountsRequestMappingInfo, dummyHandlerMethod()) - ] - - contextBuilder.requestHandlers(requestHandlers) - plugin.groupName('groupName').configure(contextBuilder) - ApiListingReferenceScanResult result = sut.scan(documentationContext()) - - then: - result.resourceGroupRequestMappings.keySet().size() == 1 - - and: - def resourceGroup = result.resourceGroupRequestMappings.keySet().first() - resourceGroup.groupName == "dummy-class" - resourceGroup.controllerClass == ofNullable(DummyClass) - resourceGroup.position == 0 - } - - def "grouping of listing references using Spring grouping strategy"() { - given: - requestHandlers = [ - new WebMvcRequestHandler(ROOT, methodResolver, requestMappingInfo("/public/{businessId}"), dummyControllerHandlerMethod()), - new WebMvcRequestHandler(ROOT, methodResolver, requestMappingInfo("/public/inventoryTypes"), dummyHandlerMethod()), - new WebMvcRequestHandler(ROOT, methodResolver, requestMappingInfo("/public/{businessId}/accounts"), dummyHandlerMethod()), - new WebMvcRequestHandler(ROOT, methodResolver, requestMappingInfo("/public/{businessId}/employees"), dummyHandlerMethod()), - new WebMvcRequestHandler(ROOT, methodResolver, requestMappingInfo("/public/{businessId}/inventory"), dummyHandlerMethod()), - new WebMvcRequestHandler(ROOT, methodResolver, requestMappingInfo("/public/{businessId}/inventory/products"), dummyHandlerMethod()) - ] - - when: - contextBuilder.requestHandlers(requestHandlers) - plugin.configure(contextBuilder) - - and: - ApiListingReferenceScanResult result = sut.scan(documentationContext()) - - then: - result.resourceGroupRequestMappings.size() == 2 - result.resourceGroupRequestMappings[new ResourceGroup("dummy-controller", DummyController)].size() == 1 - result.resourceGroupRequestMappings[new ResourceGroup("dummy-class", DummyClass)].size() == 5 - } - - def "grouping of listing references using Class or Api Grouping Strategy"() { - given: - requestHandlers = [ - new WebMvcRequestHandler(ROOT, methodResolver, requestMappingInfo("/public/{businessId}"), dummyControllerHandlerMethod()), - new WebMvcRequestHandler(ROOT, methodResolver, requestMappingInfo("/public/inventoryTypes"), dummyHandlerMethod()), - new WebMvcRequestHandler(ROOT, methodResolver, requestMappingInfo("/public/{businessId}/accounts"), dummyHandlerMethod()), - new WebMvcRequestHandler(ROOT, methodResolver, requestMappingInfo("/public/{businessId}/employees"), dummyHandlerMethod()), - new WebMvcRequestHandler(ROOT, methodResolver, requestMappingInfo("/public/{businessId}/inventory"), dummyHandlerMethod()), - new WebMvcRequestHandler(ROOT, methodResolver, requestMappingInfo("/public/{businessId}/inventory/products"), dummyHandlerMethod()) - ] - - when: - contextBuilder.requestHandlers(requestHandlers) - plugin.configure(contextBuilder) - - and: - ApiListingReferenceScanResult result = sut.scan(documentationContext()) - - then: - result.resourceGroupRequestMappings.size() == 2 - result.resourceGroupRequestMappings[new ResourceGroup("dummy-controller", DummyController)].size() == 1 - result.resourceGroupRequestMappings[new ResourceGroup("dummy-class", DummyClass)].size() == 5 - } - -} \ No newline at end of file diff --git a/springfox-swagger1/src/test/groovy/springfox/documentation/spring/web/scanners/SwaggerApiModelReaderSpec.groovy b/springfox-swagger1/src/test/groovy/springfox/documentation/spring/web/scanners/SwaggerApiModelReaderSpec.groovy deleted file mode 100755 index ef6723aec50..00000000000 --- a/springfox-swagger1/src/test/groovy/springfox/documentation/spring/web/scanners/SwaggerApiModelReaderSpec.groovy +++ /dev/null @@ -1,273 +0,0 @@ -/* - * - * Copyright 2015-2019 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.spring.web.scanners - -import com.fasterxml.classmate.TypeResolver -import org.springframework.http.HttpEntity -import org.springframework.http.ResponseEntity -import org.springframework.plugin.core.OrderAwarePluginRegistry -import org.springframework.plugin.core.PluginRegistry -import org.springframework.web.method.HandlerMethod -import springfox.documentation.schema.DefaultTypeNameProvider -import springfox.documentation.schema.JacksonEnumTypeDeterminer -import springfox.documentation.schema.Model -import springfox.documentation.schema.ModelProperty -import springfox.documentation.schema.TypeNameExtractor -import springfox.documentation.schema.mixins.SchemaPluginsSupport -import springfox.documentation.service.ResourceGroup -import springfox.documentation.spi.DocumentationType -import springfox.documentation.spi.schema.TypeNameProviderPlugin -import springfox.documentation.spi.service.contexts.Defaults -import springfox.documentation.spi.service.contexts.RequestMappingContext -import springfox.documentation.spring.web.WebMvcRequestHandler -import springfox.documentation.spring.web.dummy.DummyClass -import springfox.documentation.spring.web.dummy.DummyModels -import springfox.documentation.spring.web.dummy.controllers.BusinessService -import springfox.documentation.spring.web.mixins.ModelProviderForServiceSupport -import springfox.documentation.spring.web.mixins.RequestMappingSupport -import springfox.documentation.spring.web.paths.DefaultPathProvider -import springfox.documentation.spring.web.plugins.DocumentationContextSpec -import springfox.documentation.spring.web.plugins.DocumentationPluginsManager -import springfox.documentation.spring.web.readers.operation.HandlerMethodResolver -import springfox.documentation.swagger.mixins.SwaggerPluginsSupport -import springfox.documentation.swagger1.web.SwaggerDefaultConfiguration - -import jakarta.servlet.http.HttpServletResponse -import java.util.function.Function -import java.util.stream.Collectors - -import static springfox.documentation.spring.web.paths.Paths.* - -class SwaggerApiModelReaderSpec - extends DocumentationContextSpec - implements RequestMappingSupport, - SwaggerPluginsSupport, - ModelProviderForServiceSupport { - - ApiModelReader sut - ResourceGroup resourceGroup - DocumentationPluginsManager pluginsManager - def methodResolver = new HandlerMethodResolver(new TypeResolver()) - - def setup() { - - pluginsManager = swaggerServicePlugins([ - new SwaggerDefaultConfiguration( - new Defaults(), - new TypeResolver(), - new DefaultPathProvider()) - ]) - - PluginRegistry modelNameRegistry = - OrderAwarePluginRegistry.create( - [new DefaultTypeNameProvider()]) - TypeNameExtractor typeNameExtractor = new TypeNameExtractor( - new TypeResolver(), - modelNameRegistry, - new JacksonEnumTypeDeterminer()) - sut = new ApiModelReader( - modelProvider(swaggerSchemaPlugins()), - new TypeResolver(), - pluginsManager, - new JacksonEnumTypeDeterminer(), - typeNameExtractor) - resourceGroup = new ResourceGroup("businesses", DummyClass) - } - - def requestMappingContext(HandlerMethod handlerMethod, String path) { - return new RequestMappingContext( - "0", - documentationContext(), - new WebMvcRequestHandler( - ROOT, - methodResolver, - requestMappingInfo(path), - handlerMethod)) - } - - Function toModelMap = new Function() { - String apply(Model model) { - return model.getName() - } - } - - def "Annotated model"() { - given: - HandlerMethod handlerMethod = dummyHandlerMethod('methodWithModelPropertyAnnotations') - RequestMappingContext context = requestMappingContext(handlerMethod, '/somePath') - when: - def modelsMap = sut.read(context) - - then: - modelsMap.containsKey("0_0") - Map models = modelsMap.get("0_0").stream() - .collect(Collectors.toMap(toModelMap, - Function.identity())) - models.size() == 1 - - models.containsKey('AnnotatedBusinessModel') - Model model = models.get('AnnotatedBusinessModel') - model.id == '0_0_springfox.documentation.spring.web.dummy.DummyModels$AnnotatedBusinessModel' - model.getName() == 'AnnotatedBusinessModel' - model.getQualifiedType() == 'springfox.documentation.spring.web.dummy.DummyModels$AnnotatedBusinessModel' - - Map modelProps = model.getProperties() - ModelProperty prop = modelProps.name - prop.type.erasedType == String - prop.getDescription() == 'The name of this business' - prop.isRequired() - - modelProps.numEmployees.getDescription() == 'Total number of current employees' - !modelProps.numEmployees.isRequired() - } - - def "Should pull models from Api Operation response class"() { - given: - HandlerMethod handlerMethod = dummyHandlerMethod('methodApiResponseClass') - RequestMappingContext context = requestMappingContext(handlerMethod, '/somePath') - when: - def modelsMap = sut.read(context) - - then: - modelsMap.containsKey("0_1") - Map models = modelsMap.get("0_1").stream() - .collect(Collectors.toMap(toModelMap, - Function.identity())) - models.size() == 1 - - models['FunkyBusiness'].getQualifiedType() == 'springfox.documentation.spring.web.dummy.DummyModels$FunkyBusiness' - } - - def "Should pull models from operation's ApiResponse annotations"() { - given: - HandlerMethod handlerMethod = dummyHandlerMethod('methodAnnotatedWithApiResponse') - RequestMappingContext context = requestMappingContext(handlerMethod, '/somePath') - when: - def modelsMap = sut.read(context) - then: - modelsMap.containsKey("0_2") - Map models = modelsMap.get("0_2").stream() - .collect(Collectors.toMap(toModelMap, - Function.identity())) - models.size() == 1 - models['RestError'].getQualifiedType() == 'springfox.documentation.spring.web.dummy.RestError' - } - - def "should only generate models for request parameters that are annotated with Springs RequestBody"() { - given: - HandlerMethod handlerMethod = dummyHandlerMethod('methodParameterWithRequestBodyAnnotation', - DummyModels.BusinessModel, - HttpServletResponse.class, - DummyModels.AnnotatedBusinessModel.class - ) - RequestMappingContext context = requestMappingContext(handlerMethod, '/somePath') - when: - def modelsMap = sut.read(context) - - then: - !modelsMap.containsKey("0_0") - modelsMap.containsKey("0_1") - modelsMap.containsKey("0_2") - Map models_1 = modelsMap.get("0_1").stream() - .collect(Collectors.toMap(toModelMap, - Function.identity())) - Map models_2 = modelsMap.get("0_2").stream() - .collect(Collectors.toMap(toModelMap, - Function.identity())) - - models_1.size() == 1 - models_1.containsKey("BusinessModel") - - models_2.size() == 1 - models_2.containsKey("RestError") // from class-level annotation. - - } - - def "Generates the correct models when alternateTypeProvider returns an ignoreable or base parameter type"() { - given: - plugin - .genericModelSubstitutes(ResponseEntity, HttpEntity) - .configure(contextBuilder) - - and: - HandlerMethod handlerMethod = handlerMethodIn(BusinessService, 'getResponseEntity', String) - RequestMappingContext context = requestMappingContext(handlerMethod, '/businesses/responseEntity/{businessId}') - - when: - def modelsMap = sut.read(context) - - then: - - modelsMap.isEmpty() - - } - - def "property description should be populated when type is used in response and request body"() { - given: - HandlerMethod handlerMethod = dummyHandlerMethod('methodWithSameAnnotatedModelInReturnAndRequestBodyParam', - DummyModels.AnnotatedBusinessModel - ) - RequestMappingContext context = requestMappingContext(handlerMethod, '/businesses/responseEntity/{businessId}') - - when: - def modelsMap = sut.read(context) - - then: - modelsMap.containsKey("0_0") - modelsMap.containsKey("0_1") - modelsMap.containsKey("0_2") - Map models_0 = modelsMap.get("0_0").stream() - .collect(Collectors.toMap(toModelMap, - Function.identity())) - Map models_1 = modelsMap.get("0_1").stream() - .collect(Collectors.toMap(toModelMap, - Function.identity())) - Map models_2 = modelsMap.get("0_2").stream() - .collect(Collectors.toMap(toModelMap, - Function.identity())) - - models_0.size() == 1 - models_1.size() == 1 - - String modelName = DummyModels.AnnotatedBusinessModel.class.simpleName - - models_0.containsKey(modelName) - models_1.containsKey(modelName) - - Model model = models_1[modelName] - - model.equalsIgnoringName(models_0[modelName]) - - Map modelProperties = model.getProperties() - - modelProperties.size() == 2 - modelProperties.containsKey('name') - modelProperties.containsKey('numEmployees') - - ModelProperty nameProperty = modelProperties['name'] - nameProperty.getDescription() == 'The name of this business' - - ModelProperty numEmployeesProperty = modelProperties['numEmployees'] - numEmployeesProperty.getDescription() == 'Total number of current employees' - - models_2.size() == 1 - models_2.containsKey('RestError') // from class-level annotation. - } -} diff --git a/springfox-swagger1/src/test/groovy/springfox/documentation/swagger1/dto/AllowableListValuesSpec.groovy b/springfox-swagger1/src/test/groovy/springfox/documentation/swagger1/dto/AllowableListValuesSpec.groovy deleted file mode 100644 index bbed554c389..00000000000 --- a/springfox-swagger1/src/test/groovy/springfox/documentation/swagger1/dto/AllowableListValuesSpec.groovy +++ /dev/null @@ -1,43 +0,0 @@ -/* - * - * Copyright 2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.swagger1.dto - -class AllowableListValuesSpec extends InternalJsonSerializationSpec { - - def "should pass coverage"() { - expect: - new springfox.documentation.service.AllowableListValues(['a'], 'string').with { - getValues() - getValueType() - } - } - - def "when list values is empty, the enum value is ignored" () { - expect: - writePretty(new AllowableListValues([], "List")) == """{ }""" - } - - def "when list values is not empty, the enum value is rendered" () { - expect: - writePretty(new AllowableListValues(['ONE', 'TWO'], "List")) == """{ - "enum" : [ "ONE", "TWO" ] -}""" - } -} diff --git a/springfox-swagger1/src/test/groovy/springfox/documentation/swagger1/dto/AllowableRangeValuesSpec.groovy b/springfox-swagger1/src/test/groovy/springfox/documentation/swagger1/dto/AllowableRangeValuesSpec.groovy deleted file mode 100644 index ec972441d2f..00000000000 --- a/springfox-swagger1/src/test/groovy/springfox/documentation/swagger1/dto/AllowableRangeValuesSpec.groovy +++ /dev/null @@ -1,33 +0,0 @@ -/* - * - * Copyright 2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.swagger1.dto - -import spock.lang.Specification - -class AllowableRangeValuesSpec extends Specification { - - def "should pass coverage"() { - expect: - new AllowableRangeValues('1', '2').with { - getMax() - getMin() - } - } -} diff --git a/springfox-swagger1/src/test/groovy/springfox/documentation/swagger1/dto/ApiDescriptionSpec.groovy b/springfox-swagger1/src/test/groovy/springfox/documentation/swagger1/dto/ApiDescriptionSpec.groovy deleted file mode 100644 index becf1e9771b..00000000000 --- a/springfox-swagger1/src/test/groovy/springfox/documentation/swagger1/dto/ApiDescriptionSpec.groovy +++ /dev/null @@ -1,41 +0,0 @@ -/* - * - * Copyright 2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.swagger1.dto - -class ApiDescriptionSpec extends InternalJsonSerializationSpec { - ApiDescription description = new ApiDescription('p', 'd', [], true) - - def "should serialize"() { - expect: - writePretty(description) == """{ - "description" : "d", - "operations" : [ ], - "path" : "p" -}""" - } - - def "should pass coverage"() { - expect: - description.getDescription() - description.getOperations() == [] - description.getPath() - description.isHidden() - } -} diff --git a/springfox-swagger1/src/test/groovy/springfox/documentation/swagger1/dto/ApiInfoSpec.groovy b/springfox-swagger1/src/test/groovy/springfox/documentation/swagger1/dto/ApiInfoSpec.groovy deleted file mode 100644 index 3a613a7307c..00000000000 --- a/springfox-swagger1/src/test/groovy/springfox/documentation/swagger1/dto/ApiInfoSpec.groovy +++ /dev/null @@ -1,54 +0,0 @@ -/* - * - * Copyright 2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.swagger1.dto - -class ApiInfoSpec extends InternalJsonSerializationSpec { - - ApiInfo apiInfo = new ApiInfo('Title' - , 'Api Description' - , 'Api terms of service' - , 'Contact Email' - , 'Licence Type' - , 'License URL') - - def "should serialize"() { - expect: - writePretty(apiInfo) == """{ - "contact" : "Contact Email", - "description" : "Api Description", - "license" : "Licence Type", - "licenseUrl" : "License URL", - "termsOfServiceUrl" : "Api terms of service", - "title" : "Title" -}""" - } - - def "should pass coverage"() { - expect: - apiInfo.with { - getContact() - getDescription() - getLicense() - getLicenseUrl() - getTitle() - getTermsOfServiceUrl() - } - } -} diff --git a/springfox-swagger1/src/test/groovy/springfox/documentation/swagger1/dto/ApiKeySpec.groovy b/springfox-swagger1/src/test/groovy/springfox/documentation/swagger1/dto/ApiKeySpec.groovy deleted file mode 100644 index fc1ef484116..00000000000 --- a/springfox-swagger1/src/test/groovy/springfox/documentation/swagger1/dto/ApiKeySpec.groovy +++ /dev/null @@ -1,53 +0,0 @@ -/* - * - * Copyright 2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.swagger1.dto - -class ApiKeySpec extends InternalJsonSerializationSpec { - - ApiKey headerKey = new ApiKey('myKey') - ApiKey customKey = new ApiKey('myKey', 'cookie') - - def "should produce a header key"() { - expect: - writePretty(headerKey) == - """{ - "keyname" : "myKey", - "passAs" : "header", - "type" : "apiKey" -}""" - } - - def "should produce a custom key"() { - expect: - writePretty(customKey) == - """{ - "keyname" : "myKey", - "passAs" : "cookie", - "type" : "apiKey" -}""" - } - - def "should pass coverage"() { - expect: - customKey.getKeyname() == 'myKey' - customKey.getPassAs() == 'cookie' - customKey.getType() == 'apiKey' - } -} diff --git a/springfox-swagger1/src/test/groovy/springfox/documentation/swagger1/dto/ApiListingReferenceSpec.groovy b/springfox-swagger1/src/test/groovy/springfox/documentation/swagger1/dto/ApiListingReferenceSpec.groovy deleted file mode 100644 index 00ba3310871..00000000000 --- a/springfox-swagger1/src/test/groovy/springfox/documentation/swagger1/dto/ApiListingReferenceSpec.groovy +++ /dev/null @@ -1,41 +0,0 @@ -/* - * - * Copyright 2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.swagger1.dto - -class ApiListingReferenceSpec extends InternalJsonSerializationSpec { - ApiListingReference apiListingReference = new ApiListingReference('/path', 'desc', 2) - - def "should serialize"() { - expect: - writePretty(apiListingReference) == """{ - "description" : "desc", - "path" : "/path", - "position" : 2 -}""" - - } - - def "should pass coverage"() { - expect: - apiListingReference.getDescription() - apiListingReference.getPath() - apiListingReference.getPosition() - } -} diff --git a/springfox-swagger1/src/test/groovy/springfox/documentation/swagger1/dto/ApiListingSpec.groovy b/springfox-swagger1/src/test/groovy/springfox/documentation/swagger1/dto/ApiListingSpec.groovy deleted file mode 100644 index c3a261a522f..00000000000 --- a/springfox-swagger1/src/test/groovy/springfox/documentation/swagger1/dto/ApiListingSpec.groovy +++ /dev/null @@ -1,156 +0,0 @@ -/* - * - * Copyright 2015-2019 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.swagger1.dto - -import org.springframework.http.MediaType - -import static java.util.Collections.* - -class ApiListingSpec extends InternalJsonSerializationSpec { - - ApiListing apiListing = newApiListing() - - def newApiListing() { - ApiListing apiListing = new ApiListing() - apiListing.apiVersion = '1' - apiListing.swaggerVersion = '1.2' - apiListing.basePath = '/base' - apiListing.resourcePath= '/resource' - apiListing.consumes= [MediaType.APPLICATION_JSON_VALUE] - apiListing.produces= [MediaType.APPLICATION_JSON_VALUE] - apiListing.protocols= [] - apiListing.authorizations= [] - apiListing.apis = [] - apiListing.models = - ['someModel': - new ModelDto('id', 'name', 'qtype', - ['aprop': new ModelPropertyDto("aProp", 'ptype', 'qtype', 0, false, 'pdesc', null)] - , 'desc', null, null, null) - ] - apiListing.description = 'description' - apiListing.position = 0 - apiListing - } - - def appendApiListing() { - when: - ApiListing apiListing = new ApiListing() - apiListing.appendConsumes(singleton(MediaType.APPLICATION_JSON_VALUE)) - apiListing.appendProduces(singleton(MediaType.APPLICATION_JSON_VALUE)) - apiListing.appendProtocols(singleton("http")) - apiListing.appendAuthorizations([Mock(Authorization)]) - apiListing.appendApis([Mock(ApiDescription)]) - apiListing.appendModels( - ['someModel': - new ModelDto('id', 'name', 'qtype', - ['aprop': new ModelPropertyDto("aProp", 'ptype', 'qtype', 0, false, 'pdesc', null)] - , 'desc', null, null, null) - ]) - then: - apiListing.consumes.size() > 0 - apiListing.produces.size() > 0 - apiListing.apis.size() > 0 - apiListing.protocols.size() > 0 - apiListing.models.size() > 0 - apiListing.authorizations.size() > 0 - } - - def appendEmptyApiListingValues() { - when: - ApiListing apiListing = new ApiListing() - apiListing.appendConsumes(new HashSet<>()) - apiListing.appendProduces(new HashSet<>()) - apiListing.appendProtocols(new HashSet<>()) - apiListing.appendAuthorizations([]) - apiListing.appendApis([]) - apiListing.appendModels(new HashMap<>()) - then: - apiListing.consumes == null - apiListing.produces == null - apiListing.apis == null - apiListing.protocols == null - apiListing.models == null - apiListing.authorizations == null - } - - def appendNullApiListingValues() { - when: - ApiListing apiListing = new ApiListing() - apiListing.appendConsumes(null) - apiListing.appendProduces(null) - apiListing.appendProtocols(null) - apiListing.appendAuthorizations(null) - apiListing.appendApis(null) - apiListing.appendModels(null) - then: - apiListing.consumes == null - apiListing.produces == null - apiListing.apis == null - apiListing.protocols == null - apiListing.models == null - apiListing.authorizations == null - } - - - def "should serialize"() { - expect: - writePretty(apiListing) == '''{ - "apiVersion" : "1", - "apis" : [ ], - "basePath" : "/base", - "consumes" : [ "application/json" ], - "models" : { - "someModel" : { - "description" : "desc", - "id" : "name", - "properties" : { - "aprop" : { - "description" : "pdesc", - "required" : false, - "type" : "ptype" - } - } - } - }, - "produces" : [ "application/json" ], - "resourcePath" : "/resource", - "swaggerVersion" : "1.2" -}''' - - } - - def "should pass coverage"() { - expect: - apiListing.with { - getApis() - getApiVersion() - getAuthorizations() - getBasePath() - getConsumes() - getProduces() - getDescription() - getModels() - getPosition() - getProtocols() - getResourcePath() - getSwaggerVersion() - } - } -} diff --git a/springfox-swagger1/src/test/groovy/springfox/documentation/swagger1/dto/AuthorizationScopeSpec.groovy b/springfox-swagger1/src/test/groovy/springfox/documentation/swagger1/dto/AuthorizationScopeSpec.groovy deleted file mode 100644 index 9f3393b7c8c..00000000000 --- a/springfox-swagger1/src/test/groovy/springfox/documentation/swagger1/dto/AuthorizationScopeSpec.groovy +++ /dev/null @@ -1,39 +0,0 @@ -/* - * - * Copyright 2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.swagger1.dto - -class AuthorizationScopeSpec extends InternalJsonSerializationSpec { - - AuthorizationScope authorizationScope = new AuthorizationScope('s', 'd') - - def "should serialize"() { - expect: - writePretty(authorizationScope) == """{ - "description" : "d", - "scope" : "s" -}""" - } - - def "should pass coverage"() { - expect: - authorizationScope.description - authorizationScope.scope - } -} diff --git a/springfox-swagger1/src/test/groovy/springfox/documentation/swagger1/dto/AuthorizationSpec.groovy b/springfox-swagger1/src/test/groovy/springfox/documentation/swagger1/dto/AuthorizationSpec.groovy deleted file mode 100644 index 382f72aca45..00000000000 --- a/springfox-swagger1/src/test/groovy/springfox/documentation/swagger1/dto/AuthorizationSpec.groovy +++ /dev/null @@ -1,41 +0,0 @@ -/* - * - * Copyright 2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.swagger1.dto - -class AuthorizationSpec extends InternalJsonSerializationSpec { - Authorization authorization = new Authorization('atype', [new AuthorizationScope('s', 'd')] as AuthorizationScope[]) - - def "should serialize"() { - expect: - writePretty(authorization) == """{ - "scopes" : [ { - "description" : "d", - "scope" : "s" - } ], - "type" : "atype" -}""" - } - - def "should pass coverage"() { - expect: - authorization.getScopes().size() == 1 - authorization.getType() == 'atype' - } -} diff --git a/springfox-swagger1/src/test/groovy/springfox/documentation/swagger1/dto/BasicAuthSpec.groovy b/springfox-swagger1/src/test/groovy/springfox/documentation/swagger1/dto/BasicAuthSpec.groovy deleted file mode 100644 index 86d95b15f0d..00000000000 --- a/springfox-swagger1/src/test/groovy/springfox/documentation/swagger1/dto/BasicAuthSpec.groovy +++ /dev/null @@ -1,46 +0,0 @@ -/* - * - * Copyright 2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.swagger1.dto - -class BasicAuthSpec extends InternalJsonSerializationSpec { - - - def "should serialize"() { - given: - AuthorizationType basicAuth = new BasicAuth() - when: - basicAuth.setName("basic") - then: - writePretty(basicAuth) == """{ - "name" : "basic", - "type" : "basicAuth" -}""" - } - - def "should pass coverage"() { - given: - AuthorizationType basicAuth = new BasicAuth() - when: - basicAuth.setName("basic") - then: - basicAuth.getName() == 'basic' - basicAuth.getType() == 'basicAuth' - } -} diff --git a/springfox-swagger1/src/test/groovy/springfox/documentation/swagger1/dto/ContainerDataTypeSpec.groovy b/springfox-swagger1/src/test/groovy/springfox/documentation/swagger1/dto/ContainerDataTypeSpec.groovy deleted file mode 100644 index 932c9ae6d88..00000000000 --- a/springfox-swagger1/src/test/groovy/springfox/documentation/swagger1/dto/ContainerDataTypeSpec.groovy +++ /dev/null @@ -1,73 +0,0 @@ -/* - * - * Copyright 2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.swagger1.dto - -class ContainerDataTypeSpec extends InternalJsonSerializationSpec { - - def "should serialize a primitive"() { - given: - def type = new ContainerDataType("int", false) - expect: - writePretty(type) == '''{ - "items" : { - "format" : "int32", - "type" : "integer" - }, - "type" : "array" -}''' - type.type == "array" - type.items.absoluteType == new DataType("int").absoluteType - } - - def "should serialize a complex"() { - expect: - writePretty(new ContainerDataType("pet", false)) == '''{ - "items" : { - "type" : "pet" - }, - "type" : "array" -}''' - } - - def "should serialize a complex with uniqueItems"() { - expect: - writePretty(new ContainerDataType("pet", true)) == '''{ - "items" : { - "type" : "pet" - }, - "type" : "array", - "uniqueItems" : true -}''' - } - - def "should fail to serialize a nested array"() { - when: - new ContainerDataType("array", false) - then: - thrown(IllegalArgumentException) - } - - def "should fail to serialize a null"() { - when: - new ContainerDataType(null, false) - then: - thrown(IllegalArgumentException) - } -} diff --git a/springfox-swagger1/src/test/groovy/springfox/documentation/swagger1/dto/DataTypeSpec.groovy b/springfox-swagger1/src/test/groovy/springfox/documentation/swagger1/dto/DataTypeSpec.groovy deleted file mode 100644 index 1693417d690..00000000000 --- a/springfox-swagger1/src/test/groovy/springfox/documentation/swagger1/dto/DataTypeSpec.groovy +++ /dev/null @@ -1,58 +0,0 @@ -/* - * - * Copyright 2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.swagger1.dto - -import spock.lang.Unroll - -class DataTypeSpec extends InternalJsonSerializationSpec { - @Unroll - def "should serialize dataType[#dataType]"() { - def swaggerDataType = new DataType(dataType) - when: - def json = writeAndParse(swaggerDataType) - then: - assertion.call(json) - - where: - dataType | assertion - "void" | { it.type == 'void' } - "File" | { it.type == 'File' } - "__file" | { it.type == 'File' } - "int" | { it.type == 'integer' && it.format == 'int32' } - "long" | { it.type == 'integer' && it.format == 'int64' } - "float" | { it.type == 'number' && it.format == 'float' } - "double" | { it.type == 'number' && it.format == 'double' } - "Date" | { it.type == 'string' && it.format == 'date-time' } - "DateTime" | { it.type == 'string' && it.format == 'date-time' } - "string" | { it.type == 'string' && !it.format } - "bigdecimal" | { it.type == 'number' && !it.format } - "biginteger" | { it.type == 'integer' && !it.format } - "boolean" | { it.type == 'boolean' && !it.format } - "byte" | { it.type == 'string' && it.format == 'byte' } - "UUID" | { it.type == 'string' && it.format == 'uuid' } - "date" | { it.type == 'string' && it.format == 'date' } - "date-time" | { it.type == 'string' && it.format == 'date-time' } - "pet" | { it.'type' == 'pet' } - "List[__file]"| { it.type == 'array' && it.items.'type' == 'File' && it.uniqueItems == null } - "Set[Pet]" | { it.type == 'array' && it.items.'type' == 'Pet' && it.uniqueItems == true } - "List[Pet]" | { it.type == 'array' && it.items.'type' == 'Pet' && it.uniqueItems == null } - "List[int]" | { it.type == 'array' && it.items.format == 'int32' && it.items.type == 'integer' } - } -} diff --git a/springfox-swagger1/src/test/groovy/springfox/documentation/swagger1/dto/InternalJsonSerializationSpec.groovy b/springfox-swagger1/src/test/groovy/springfox/documentation/swagger1/dto/InternalJsonSerializationSpec.groovy deleted file mode 100644 index f1897f3d823..00000000000 --- a/springfox-swagger1/src/test/groovy/springfox/documentation/swagger1/dto/InternalJsonSerializationSpec.groovy +++ /dev/null @@ -1,51 +0,0 @@ -/* - * - * Copyright 2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.swagger1.dto - -import com.fasterxml.jackson.databind.ObjectMapper -import groovy.json.JsonSlurper -import spock.lang.Shared -import spock.lang.Specification -import springfox.documentation.swagger1.configuration.SwaggerJacksonModule - -class InternalJsonSerializationSpec extends Specification { - - @Shared ObjectMapper objectMapper - - def setupSpec() { - def module = new SwaggerJacksonModule() - objectMapper = new ObjectMapper() - objectMapper.registerModule(module) - } - - def writeAndParse(object, boolean print = true) { - - def jsonString = objectMapper.writeValueAsString(object) - def json = new JsonSlurper().parseText(jsonString) - if (print) { - println jsonString - } - json - } - - def writePretty(object){ - objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(object).normalize() - } -} \ No newline at end of file diff --git a/springfox-swagger1/src/test/groovy/springfox/documentation/swagger1/dto/ModelPropertySpec.groovy b/springfox-swagger1/src/test/groovy/springfox/documentation/swagger1/dto/ModelPropertySpec.groovy deleted file mode 100644 index 0521b932bce..00000000000 --- a/springfox-swagger1/src/test/groovy/springfox/documentation/swagger1/dto/ModelPropertySpec.groovy +++ /dev/null @@ -1,90 +0,0 @@ -/* - * - * Copyright 2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.swagger1.dto - -class ModelPropertySpec extends InternalJsonSerializationSpec { - ModelPropertyDto modelProperty = new ModelPropertyDto("aName", 'List[mtype]' - , 'com.qual' - , 1 - , true - , 'decs' - , new AllowableListValues()) - - ModelPropertyDto setProperty = new ModelPropertyDto("aName", 'Set[mtype]' - , 'com.qual' - , 1 - , true - , 'decs' - , new AllowableListValues()) - - ModelPropertyDto regularProperty = new ModelPropertyDto("aName", 'mtype' - , 'com.qual' - , 1 - , true - , 'decs' - , new AllowableListValues()) - - def "should serialize lists"() { - expect: - writePretty(modelProperty) == '''{ - "description" : "decs", - "required" : true, - "items" : { - "type" : "mtype" - }, - "type" : "array" -}''' - } - - def "should serialize sets"() { - expect: - writePretty(setProperty) == '''{ - "description" : "decs", - "required" : true, - "items" : { - "type" : "mtype" - }, - "type" : "array", - "uniqueItems" : true -}''' - } - - def "should serialize non lists"() { - expect: - writePretty(regularProperty) == '''{ - "description" : "decs", - "required" : true, - "type" : "mtype" -}''' - } - - def "should pass coverage"() { - expect: - modelProperty.with { - getType() - getQualifiedType() - getPosition() - isRequired() - getDescription() - getAllowableValues() - } - } - -} diff --git a/springfox-swagger1/src/test/groovy/springfox/documentation/swagger1/dto/ModelSpec.groovy b/springfox-swagger1/src/test/groovy/springfox/documentation/swagger1/dto/ModelSpec.groovy deleted file mode 100644 index ebba646c235..00000000000 --- a/springfox-swagger1/src/test/groovy/springfox/documentation/swagger1/dto/ModelSpec.groovy +++ /dev/null @@ -1,76 +0,0 @@ -/* - * - * Copyright 2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.swagger1.dto - -import spock.lang.Unroll - -class ModelSpec extends InternalJsonSerializationSpec { - - ModelDto model = new ModelDto("id", "name", 'qtype', - ['propK': 'propV'] as Map, - 'desc', 'bModel', 'discrim', - ['subtype1']) - - def "should serialize"() { - expect: - writePretty(model) == """{ - "baseModel" : "bModel", - "description" : "desc", - "discriminator" : "discrim", - "id" : "name", - "properties" : { - "propK" : "propV" - }, - "subTypes" : [ "subtype1" ] -}""" - } - - @Unroll - def "should serialize ignoring optional fields"() { - final ModelDto model = new ModelDto("id", "name", 'qtype', - ['propK': 'propV'] as Map, 'desc', val, val, listVal) - - expect: - writePretty(model) == """{ - "description" : "desc", - "id" : "name", - "properties" : { - "propK" : "propV" - } -}""" - - where: - val | listVal - null | null - "" | [] - } - - def "should pass coverage"() { - expect: - model.baseModel - model.description - model.discriminator - model.id - model.name - model.properties - model.qualifiedType - model.subTypes - } -} diff --git a/springfox-swagger1/src/test/groovy/springfox/documentation/swagger1/dto/OperationSpec.groovy b/springfox-swagger1/src/test/groovy/springfox/documentation/swagger1/dto/OperationSpec.groovy deleted file mode 100644 index e485aae5a8b..00000000000 --- a/springfox-swagger1/src/test/groovy/springfox/documentation/swagger1/dto/OperationSpec.groovy +++ /dev/null @@ -1,83 +0,0 @@ -/* - * - * Copyright 2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.swagger1.dto - -class OperationSpec extends InternalJsonSerializationSpec { - - Operation operation = new Operation('PUT' - , 'updatePet' - , 'updatePet' - , 'void' - , 'updatePetUsingPUT' - , 0 - , ["*/*"] - , ['application/json'] - , [] - , [] - , [new Parameter('pet', 'pet', '', false, false, 'Pet', null, 'body', null)] - , [new ResponseMessage(200, 'ok', null)] as Set - , "false" - ) - - def "should serialize an operation"() { - expect: - writePretty(operation) == '''{ - "method" : "PUT", - "summary" : "updatePet", - "notes" : "updatePet", - "nickname" : "updatePetUsingPUT", - "produces" : [ "*/*" ], - "consumes" : [ "application/json" ], - "parameters" : [ { - "allowMultiple" : false, - "defaultValue" : "", - "description" : "pet", - "name" : "body", - "paramType" : "body", - "type" : "Pet", - "required" : false - } ], - "responseMessages" : [ { - "code" : 200, - "message" : "ok" - } ], - "deprecated" : "false", - "type" : "void" -}''' - } - - def "should pass coverage"() { - expect: - operation.with { - getAuthorizations() - getConsumes() - getDeprecated() - getMethod() - getNickname() - getNotes() - getParameters() - getPosition() - getProduces() - getProtocol() - getResponseMessages() - getSummary() - } - } -} diff --git a/springfox-swagger1/src/test/groovy/springfox/documentation/swagger1/dto/ParameterSpec.groovy b/springfox-swagger1/src/test/groovy/springfox/documentation/swagger1/dto/ParameterSpec.groovy deleted file mode 100644 index b0edddcb533..00000000000 --- a/springfox-swagger1/src/test/groovy/springfox/documentation/swagger1/dto/ParameterSpec.groovy +++ /dev/null @@ -1,146 +0,0 @@ -/* - * - * Copyright 2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.swagger1.dto - -class ParameterSpec extends InternalJsonSerializationSpec { - - Parameter testParameter = new Parameter('aname' - , 'adesc' - , 'defaultVal' - , true - , true - , "int" - , new AllowableListValues(['a', 'b'], 'string') - , "path" - , "all") - - def "should serialize with allowable list values"() { - expect: - - writePretty(testParameter) == """{ - "allowMultiple" : true, - "enum" : [ "a", "b" ], - "defaultValue" : "defaultVal", - "description" : "adesc", - "name" : "aname", - "paramAccess" : "all", - "paramType" : "path", - "format" : "int32", - "type" : "integer", - "required" : true -}""" - } - - - def "should serialize with allowable range values"() { - expect: - Parameter parameter = new Parameter('aname' - , 'adesc' - , '2' - , true - , true - , "int" - , new AllowableRangeValues('1', '2') - , "path" - , "all") - - writePretty(parameter) == """{ - "allowMultiple" : true, - "maximum" : "2", - "minimum" : "1", - "defaultValue" : "2", - "description" : "adesc", - "name" : "aname", - "paramAccess" : "all", - "paramType" : "path", - "format" : "int32", - "type" : "integer", - "required" : true -}""" - } - - def "should override body param name"() { - expect: - - Parameter parameter = new Parameter('aname' - , 'adesc' - , '2' - , true - , true - , "int" - , new AllowableRangeValues('1', '2') - , "body" - , "all") - - writePretty(parameter) == """{ - "allowMultiple" : true, - "maximum" : "2", - "minimum" : "1", - "defaultValue" : "2", - "description" : "adesc", - "name" : "body", - "paramAccess" : "all", - "paramType" : "body", - "format" : "int32", - "type" : "integer", - "required" : true -}""" - } - - def "array types are unwrapped"() { - expect: - Parameter parameter = new Parameter('aname' - , 'adesc' - , '2' - , true - , true - , "Set[Pet]" - , null - , "body" - , "all") - - writePretty(parameter) == """{ - "allowMultiple" : true, - "defaultValue" : "2", - "description" : "adesc", - "name" : "body", - "paramAccess" : "all", - "paramType" : "body", - "items" : { - "type" : "Pet" - }, - "type" : "array", - "uniqueItems" : true, - "required" : true -}""" - } - - def "should pass coverage"() { - expect: - testParameter.allowableValues - testParameter.defaultValue - testParameter.description - testParameter.isAllowMultiple() - testParameter.isRequired() - testParameter.name - testParameter.paramAccess - testParameter.paramType - } -} diff --git a/springfox-swagger1/src/test/groovy/springfox/documentation/swagger1/dto/PrimitiveDataTypeSpec.groovy b/springfox-swagger1/src/test/groovy/springfox/documentation/swagger1/dto/PrimitiveDataTypeSpec.groovy deleted file mode 100644 index 5f94e93eda8..00000000000 --- a/springfox-swagger1/src/test/groovy/springfox/documentation/swagger1/dto/PrimitiveDataTypeSpec.groovy +++ /dev/null @@ -1,28 +0,0 @@ -/* - * - * Copyright 2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.swagger1.dto - -import spock.lang.Specification - -/** - * Created by adrianbk on 14/12/2014. - */ -class PrimitiveDataTypeSpec extends Specification { -} diff --git a/springfox-swagger1/src/test/groovy/springfox/documentation/swagger1/dto/PrimitiveFormatDataTypeSpec.groovy b/springfox-swagger1/src/test/groovy/springfox/documentation/swagger1/dto/PrimitiveFormatDataTypeSpec.groovy deleted file mode 100644 index 6c1fa629a4f..00000000000 --- a/springfox-swagger1/src/test/groovy/springfox/documentation/swagger1/dto/PrimitiveFormatDataTypeSpec.groovy +++ /dev/null @@ -1,39 +0,0 @@ -/* - * - * Copyright 2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.swagger1.dto - -class PrimitiveFormatDataTypeSpec extends InternalJsonSerializationSpec { - - PrimitiveFormatDataType primitiveFormatParameterType = new PrimitiveFormatDataType('type', 'format') - - def "should serialize"() { - expect: - writePretty(primitiveFormatParameterType) == """{ - "format" : "format", - "type" : "type" -}""" - } - - def "should pass coverage"() { - expect: - primitiveFormatParameterType.format - primitiveFormatParameterType.type - } -} diff --git a/springfox-swagger1/src/test/groovy/springfox/documentation/swagger1/dto/ReferenceDataTypeSpec.groovy b/springfox-swagger1/src/test/groovy/springfox/documentation/swagger1/dto/ReferenceDataTypeSpec.groovy deleted file mode 100644 index 74039df92a0..00000000000 --- a/springfox-swagger1/src/test/groovy/springfox/documentation/swagger1/dto/ReferenceDataTypeSpec.groovy +++ /dev/null @@ -1,30 +0,0 @@ -/* - * - * Copyright 2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.swagger1.dto - -class ReferenceDataTypeSpec extends InternalJsonSerializationSpec { - - def "should serialize"() { - expect: - writePretty(new ReferenceDataType('Pet')) == '''{ - "type" : "Pet" -}''' - } -} diff --git a/springfox-swagger1/src/test/groovy/springfox/documentation/swagger1/dto/ResourceListingSpec.groovy b/springfox-swagger1/src/test/groovy/springfox/documentation/swagger1/dto/ResourceListingSpec.groovy deleted file mode 100644 index 4755ae39f05..00000000000 --- a/springfox-swagger1/src/test/groovy/springfox/documentation/swagger1/dto/ResourceListingSpec.groovy +++ /dev/null @@ -1,164 +0,0 @@ -/* - * - * Copyright 2015-2019 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.swagger1.dto - - - -class ResourceListingSpec extends InternalJsonSerializationSpec { - - def "should serialize"() { - expect: - writePretty(resourceListing()) == """{ - "apiVersion" : "apiVersion", - "apis" : [ { - "description" : "description", - "path" : "/path", - "position" : 3 - } ], - "authorizations" : { - "oauth2" : { - "grantTypes" : { - "implicit" : { - "loginEndpoint" : { - "url" : "http://petstore.swagger.io/oauth/dialog" - }, - "tokenName" : "access_token", - "type" : "implicit" - }, - "authorization_code" : { - "tokenEndpoint" : { - "tokenName" : "auth_code", - "url" : "http://petstore.swagger.io/oauth/token" - }, - "tokenRequestEndpoint" : { - "clientIdName" : "client_id", - "clientSecretName" : "client_secret", - "url" : "http://petstore.swagger.io/oauth/requestToken" - }, - "type" : "authorization_code" - } - }, - "scopes" : [ { - "description" : "access all", - "scope" : "global" - } ], - "type" : "oauth2" - } - }, - "info" : { - "contact" : "Contact Email", - "description" : "Api Description", - "license" : "Licence Type", - "licenseUrl" : "License URL", - "termsOfServiceUrl" : "Api terms of service", - "title" : " Title" - }, - "swaggerVersion" : "swagger version" -}""" - } - - def "should pass coverage"() { - expect: - ResourceListing api = resourceListing() - api.apis - api.apiVersion - api.authorizations - api.info - api.swaggerVersion - } - - def "should not initialize auth types"() { - expect: - writePretty( - new ResourceListing("apiVersion" - , "swagger version" - , [apiListingReference()] - , null - , apiInfo()) - ) == """{ - "apiVersion" : "apiVersion", - "apis" : [ { - "description" : "description", - "path" : "/path", - "position" : 3 - } ], - "info" : { - "contact" : "Contact Email", - "description" : "Api Description", - "license" : "Licence Type", - "licenseUrl" : "License URL", - "termsOfServiceUrl" : "Api terms of service", - "title" : " Title" - }, - "swaggerVersion" : "swagger version" -}""" - - } - - - def apiListingReference() { - new ApiListingReference("/path", "description", 3) - } - - - def resourceListing() { - List authorizationScopeList = new ArrayList<>(); - authorizationScopeList.add(new AuthorizationScope("global", "access all")); - - List grantTypes = new ArrayList<>(); - - LoginEndpoint loginEndpoint = new LoginEndpoint("http://petstore.swagger.io/oauth/dialog") - grantTypes.add(new ImplicitGrant(loginEndpoint, "access_token")) - - TokenRequestEndpoint tokenRequestEndpoint = new TokenRequestEndpoint( "http://petstore.swagger.io/oauth/requestToken" - , "client_id" - , "client_secret") - - TokenEndpoint tokenEndpoint = new TokenEndpoint("http://petstore.swagger.io/oauth/token", "auth_code") - - AuthorizationCodeGrant authorizationCodeGrant = new AuthorizationCodeGrant(tokenRequestEndpoint, tokenEndpoint) - - grantTypes.add(authorizationCodeGrant); - - - OAuth oAuth = new OAuth(authorizationScopeList, grantTypes) - - ApiInfo apiInfo = apiInfo() - - new ResourceListing( - "apiVersion", - "swagger version", - [apiListingReference()], - [oAuth], - apiInfo) - } - - private ApiInfo apiInfo() { - ApiInfo apiInfo = new ApiInfo( - " Title", - "Api Description", - "Api terms of service", - "Contact Email", - "Licence Type", - "License URL" - ) - apiInfo - } -} diff --git a/springfox-swagger1/src/test/groovy/springfox/documentation/swagger1/dto/ResponseMessageSpec.groovy b/springfox-swagger1/src/test/groovy/springfox/documentation/swagger1/dto/ResponseMessageSpec.groovy deleted file mode 100644 index c6108e95b84..00000000000 --- a/springfox-swagger1/src/test/groovy/springfox/documentation/swagger1/dto/ResponseMessageSpec.groovy +++ /dev/null @@ -1,58 +0,0 @@ -/* - * - * Copyright 2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.swagger1.dto - -import spock.lang.Unroll - -class ResponseMessageSpec extends InternalJsonSerializationSpec { - - @Unroll - def "should serialize"() { - expect: - writePretty(responseMessage) == expected - - where: - responseMessage << [ - new ResponseMessage(200, "ok", null), - new ResponseMessage(200, "ok", "model") - ] - - expected << [ - """{ - "code" : 200, - "message" : "ok" -}""", - """{ - "code" : 200, - "message" : "ok", - "responseModel" : "model" -}""" - ] - - } - - def "should pass coverage"() { - expect: - def message = new ResponseMessage(200, "ok", 'model') - message.getCode() - message.getMessage() - message.getResponseModel() - } -} diff --git a/springfox-swagger1/src/test/groovy/springfox/documentation/swagger1/dto/TokenEndpointSpec.groovy b/springfox-swagger1/src/test/groovy/springfox/documentation/swagger1/dto/TokenEndpointSpec.groovy deleted file mode 100644 index 336c890d06d..00000000000 --- a/springfox-swagger1/src/test/groovy/springfox/documentation/swagger1/dto/TokenEndpointSpec.groovy +++ /dev/null @@ -1,38 +0,0 @@ -/* - * - * Copyright 2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.swagger1.dto - -class TokenEndpointSpec extends InternalJsonSerializationSpec { - TokenEndpoint tokenEndpoint = new TokenEndpoint("u", "tok") - - def "should serialize"() { - expect: - writePretty(tokenEndpoint) == """{ - "tokenName" : "tok", - "url" : "u" -}""" - } - - def "should pass coverage"() { - expect: - tokenEndpoint.tokenName - tokenEndpoint.url - } -} diff --git a/springfox-swagger1/src/test/groovy/springfox/documentation/swagger1/dto/TokenRequestEndpointSpec.groovy b/springfox-swagger1/src/test/groovy/springfox/documentation/swagger1/dto/TokenRequestEndpointSpec.groovy deleted file mode 100644 index 036c876ea0c..00000000000 --- a/springfox-swagger1/src/test/groovy/springfox/documentation/swagger1/dto/TokenRequestEndpointSpec.groovy +++ /dev/null @@ -1,50 +0,0 @@ -/* - * - * Copyright 2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.swagger1.dto - -import spock.lang.Shared - -class TokenRequestEndpointSpec extends InternalJsonSerializationSpec { - - @Shared - String URL = "http://petstore.swagger.io/oauth/requestToken" - @Shared - TokenRequestEndpoint tokenRequestEndpoint = new TokenRequestEndpoint( - URL, - "client_id", - "client_secret" - ) - - def "should serialize"() { - expect: - writePretty(tokenRequestEndpoint) == """{ - "clientIdName" : "client_id", - "clientSecretName" : "client_secret", - "url" : "http://petstore.swagger.io/oauth/requestToken" -}""" - } - - def "should pass coverage"() { - expect: - tokenRequestEndpoint.clientIdName == 'client_id' - tokenRequestEndpoint.clientSecretName == 'client_secret' - tokenRequestEndpoint.url == URL - } -} diff --git a/springfox-swagger1/src/test/groovy/springfox/documentation/swagger1/integration/DocketSpec.groovy b/springfox-swagger1/src/test/groovy/springfox/documentation/swagger1/integration/DocketSpec.groovy deleted file mode 100644 index 805076e7858..00000000000 --- a/springfox-swagger1/src/test/groovy/springfox/documentation/swagger1/integration/DocketSpec.groovy +++ /dev/null @@ -1,214 +0,0 @@ -/* - * - * Copyright 2015-2019 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.swagger1.integration - -import com.fasterxml.classmate.TypeResolver -import org.joda.time.LocalDate -import org.springframework.aop.framework.AbstractSingletonProxyFactoryBean -import org.springframework.aop.framework.ProxyFactoryBean -import org.springframework.http.ResponseEntity -import springfox.documentation.service.ApiInfo -import springfox.documentation.service.ResponseMessage -import springfox.documentation.service.SecurityScheme -import springfox.documentation.spi.DocumentationType -import springfox.documentation.spi.service.contexts.Defaults -import springfox.documentation.spi.service.contexts.SecurityContext -import springfox.documentation.spring.web.paths.DefaultPathProvider -import springfox.documentation.spring.web.plugins.Docket -import springfox.documentation.spring.web.plugins.DocumentationContextSpec -import springfox.documentation.swagger1.web.SwaggerDefaultConfiguration - -import jakarta.servlet.ServletRequest - -import static java.util.Collections.* -import static org.springframework.http.HttpStatus.* -import static org.springframework.web.bind.annotation.RequestMethod.* -import static springfox.documentation.schema.AlternateTypeRules.* - -class DocketSpec extends DocumentationContextSpec { - - def "Should have sensible defaults when built with minimal configuration"() { - when: - plugin.configure(contextBuilder) - def pluginContext = contextBuilder.build() - - then: - pluginContext.groupName == 'default' - pluginContext.securitySchemes.isEmpty() - pluginContext.apiInfo.getTitle() == "Api Documentation" - pluginContext.apiInfo.getDescription() == "Api Documentation" - pluginContext.apiInfo.getTermsOfServiceUrl() == 'urn:tos' - - def contact = pluginContext.apiInfo.getContact() - contact.name == '' - contact.email == '' - contact.url == '' - pluginContext.apiInfo.getLicense() == 'Apache 2.0' - pluginContext.apiInfo.getLicenseUrl() == "http://www.apache.org/licenses/LICENSE-2.0" - pluginContext.apiInfo.version == "1.0" - - pluginContext.pathProvider instanceof DummyPathProvider // this one is dummy as this is what we have in test ctx - } - - def "Swagger global response messages should override the default for a particular RequestMethod"() { - when: - plugin - .globalResponseMessage(GET, [new ResponseMessage( - OK.value(), - "blah", - null, - [], - [] as Map, - [])]) - .useDefaultResponseMessages(true) - .configure(contextBuilder) - - and: - def pluginContext = contextBuilder.build() - - then: - pluginContext.getGlobalResponseMessages()[GET][0].getMessage() == "blah" - pluginContext.getGlobalResponseMessages()[GET].size() == 1 - - and: "defaults are preserved" - pluginContext.getGlobalResponseMessages().keySet().containsAll( - [POST, PUT, DELETE, PATCH, TRACE, OPTIONS, HEAD] - ) - } - - def "Swagger global response messages should not be used for a particular RequestMethod"() { - when: - new Docket(DocumentationType.SWAGGER_12) - .globalResponseMessage(GET, [new ResponseMessage( - OK.value(), - "blah", - null, - [], - [] as Map, - [])]) - .useDefaultResponseMessages(false) - .configure(contextBuilder) - - and: - def pluginContext = contextBuilder.build() - - then: - pluginContext.getGlobalResponseMessages()[GET][0].getMessage() == "blah" - pluginContext.getGlobalResponseMessages()[GET].size() == 1 - - and: "defaults are preserved" - pluginContext.getGlobalResponseMessages().keySet().containsAll([GET]) - } - - def "Swagger ignorableParameterTypes should append to the default ignorableParameterTypes"() { - when: - new Docket(DocumentationType.SWAGGER_12) - .ignoredParameterTypes(AbstractSingletonProxyFactoryBean.class, ProxyFactoryBean.class) - .configure(contextBuilder) - - and: - def pluginContext = contextBuilder.build() - - then: - pluginContext.getIgnorableParameterTypes().contains(AbstractSingletonProxyFactoryBean.class) - pluginContext.getIgnorableParameterTypes().contains(ProxyFactoryBean.class) - - and: "one of the defaults" - pluginContext.getIgnorableParameterTypes().contains(ServletRequest.class) - } - - def "Sets alternative AlternateTypeProvider with a rule"() { - given: - def rule = newMapRule(String, String) - new Docket(DocumentationType.SWAGGER_12) - .alternateTypeRules(rule) - .configure(contextBuilder) - - expect: - documentationContext().alternateTypeProvider.rules.contains(rule) - } - - def "Model substitution registers new rules"() { - when: - def swaggerDefault = new SwaggerDefaultConfiguration( - new Defaults(), - new TypeResolver(), - new DefaultPathProvider()) - .create(DocumentationType.SWAGGER_12) - def javaVersion = System.getProperty("java.version") - def isjdk8 = javaVersion.startsWith("1.8") || javaVersion.startsWith("11") - def jdk8RuleCount = (isjdk8 ? 6 : 0) - - and: - new Docket(DocumentationType.SWAGGER_12) - ."${method}"(*args) - .configure(swaggerDefault) - - then: - swaggerDefault.build().alternateTypeProvider.rules.size() == expectedSize + jdk8RuleCount - - where: - method | args | expectedSize - 'genericModelSubstitutes' | [ResponseEntity.class, List.class] | 17 - 'directModelSubstitute' | [LocalDate.class, Date.class] | 16 - } - - def "Basic property checks"() { - when: - plugin."$builderMethod"(object) - - then: - documentationContext()."$property" == object - - where: - builderMethod | object | property - 'pathProvider' | new DefaultPathProvider() | 'pathProvider' - 'securitySchemes' | new ArrayList() | 'securitySchemes' - 'securityContexts' | validContexts() | 'securityContexts' - 'groupName' | 'someGroup' | 'groupName' - 'apiInfo' | new ApiInfo('', '', "", '', '', '', '') | 'apiInfo' - 'apiInfo' | ApiInfo.DEFAULT | 'apiInfo' - } - - def validContexts() { - singletonList(SecurityContext.builder().build()) - } - - def "non nullable swaggerApiResourceListing properties"() { - - when: - new Docket(DocumentationType.SWAGGER_12) - .configure(contextBuilder) - - and: - def pluginContext = contextBuilder.build() - - then: - "default" == pluginContext.groupName - null != pluginContext.pathProvider - null != pluginContext.apiInfo - null != pluginContext.apiSelector - null != pluginContext.globalResponseMessages - null != pluginContext.ignorableParameterTypes - null != pluginContext.listingReferenceOrdering - null != pluginContext.apiDescriptionOrdering - - } -} diff --git a/springfox-swagger1/src/test/groovy/springfox/documentation/swagger1/jackson/AuthorizationTypesSerializerSpec.groovy b/springfox-swagger1/src/test/groovy/springfox/documentation/swagger1/jackson/AuthorizationTypesSerializerSpec.groovy deleted file mode 100644 index aac2f26b529..00000000000 --- a/springfox-swagger1/src/test/groovy/springfox/documentation/swagger1/jackson/AuthorizationTypesSerializerSpec.groovy +++ /dev/null @@ -1,71 +0,0 @@ -/* - * - * Copyright 2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.swagger1.jackson - -import springfox.documentation.swagger1.dto.AuthorizationCodeGrant -import springfox.documentation.swagger1.dto.AuthorizationScope -import springfox.documentation.swagger1.dto.GrantType -import springfox.documentation.swagger1.dto.ImplicitGrant -import springfox.documentation.swagger1.dto.InternalJsonSerializationSpec -import springfox.documentation.swagger1.dto.LoginEndpoint -import springfox.documentation.swagger1.dto.OAuth -import springfox.documentation.swagger1.dto.TokenEndpoint -import springfox.documentation.swagger1.dto.TokenRequestEndpoint - -class AuthorizationTypesSerializerSpec extends InternalJsonSerializationSpec { - - def "should serialize AuthorizationTypesSerializer"() { - setup: - def authorizationScopeList = [] - authorizationScopeList << new AuthorizationScope("email", "access all") - - List grantTypes = [] - LoginEndpoint loginEndpoint = new LoginEndpoint("http://petstore.swagger.io/oauth/dialog"); - grantTypes.add(new ImplicitGrant(loginEndpoint, "access_token")); - - TokenRequestEndpoint tokenRequestEndpoint = new TokenRequestEndpoint("http://petstore.swagger.io/oauth/requestToken", "client_id", "client_secret"); - TokenEndpoint tokenEndpoint = new TokenEndpoint("http://petstore.swagger.io/oauth/token", "auth_code"); - - AuthorizationCodeGrant authorizationCodeGrant = new AuthorizationCodeGrant() - authorizationCodeGrant.tokenRequestEndpoint = tokenRequestEndpoint - authorizationCodeGrant.tokenEndpoint = tokenEndpoint - - grantTypes.add(authorizationCodeGrant); - - OAuth oAuth = new OAuth() - oAuth.scopes = authorizationScopeList - oAuth.grantTypes = grantTypes - - when: - def json = writeAndParse(oAuth) - - then: - json.type == 'oauth2' - json.scopes[0].scope == 'email' - json.scopes[0].description == 'access all' - - json.grantTypes.implicit.loginEndpoint.url == 'http://petstore.swagger.io/oauth/dialog' - json.grantTypes.implicit.tokenName == 'access_token' - - json.grantTypes.authorization_code.tokenRequestEndpoint.url == "http://petstore.swagger.io/oauth/requestToken" - json.grantTypes.authorization_code.tokenRequestEndpoint.clientIdName == "client_id" - json.grantTypes.authorization_code.tokenRequestEndpoint.clientSecretName == "client_secret" - } -} diff --git a/springfox-swagger1/src/test/groovy/springfox/documentation/swagger1/jackson/SwaggerJacksonModuleSpec.groovy b/springfox-swagger1/src/test/groovy/springfox/documentation/swagger1/jackson/SwaggerJacksonModuleSpec.groovy deleted file mode 100644 index 713c86bc46b..00000000000 --- a/springfox-swagger1/src/test/groovy/springfox/documentation/swagger1/jackson/SwaggerJacksonModuleSpec.groovy +++ /dev/null @@ -1,45 +0,0 @@ -/* - * - * Copyright 2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.swagger1.jackson - -import com.fasterxml.jackson.databind.ObjectMapper -import spock.lang.Specification -import springfox.documentation.swagger1.configuration.SwaggerJacksonModule -import springfox.documentation.swagger1.dto.ApiListing - -class SwaggerJacksonModuleSpec extends Specification { - - def "should create serialization module"() { - ObjectMapper objectMapper = new ObjectMapper() - new SwaggerJacksonModule().maybeRegisterModule(objectMapper) - - expect: - objectMapper.findMixInClassFor(ApiListing) != null - } - - def "should create serialization module only once"() { - ObjectMapper objectMapper = new ObjectMapper() - new SwaggerJacksonModule().maybeRegisterModule(objectMapper) - new SwaggerJacksonModule().maybeRegisterModule(objectMapper) - - expect: - objectMapper.findMixInClassFor(ApiListing) != null - } -} diff --git a/springfox-swagger1/src/test/groovy/springfox/documentation/swagger1/mappers/AllMappersSpec.groovy b/springfox-swagger1/src/test/groovy/springfox/documentation/swagger1/mappers/AllMappersSpec.groovy deleted file mode 100644 index 45413279ded..00000000000 --- a/springfox-swagger1/src/test/groovy/springfox/documentation/swagger1/mappers/AllMappersSpec.groovy +++ /dev/null @@ -1,82 +0,0 @@ -/* - * - * Copyright 2017 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.swagger1.mappers - -import spock.lang.Specification -import springfox.documentation.service.AllowableListValues -import springfox.documentation.service.AllowableRangeValues -import springfox.documentation.service.ApiInfo -import springfox.documentation.service.ApiKey -import springfox.documentation.service.ApiListingReference -import springfox.documentation.service.AuthorizationCodeGrant -import springfox.documentation.service.AuthorizationScope -import springfox.documentation.service.BasicAuth -import springfox.documentation.service.ImplicitGrant -import springfox.documentation.service.LoginEndpoint -import springfox.documentation.service.OAuth -import springfox.documentation.service.ResourceListing -import springfox.documentation.service.SecurityReference -import springfox.documentation.service.TokenEndpoint -import springfox.documentation.service.TokenRequestEndpoint -import springfox.documentation.swagger1.dto.ApiDescription -import springfox.documentation.swagger1.dto.ApiListing -import springfox.documentation.swagger1.dto.ModelDto -import springfox.documentation.swagger1.dto.ModelPropertyDto -import springfox.documentation.swagger1.dto.Operation -import springfox.documentation.swagger1.dto.Parameter -import springfox.documentation.swagger1.dto.ResponseMessage -import springfox.documentation.swagger1.mixins.MapperSupport - -class AllMappersSpec extends Specification implements MapperSupport { - def "All AuthorizationTypesMapper null sources are mapped to null targets"() { - given: - AuthorizationTypesMapper mapper = authMapper() - when: - def mapped = mapper."toSwagger$typeToTest.simpleName"(null) - then: - mapped == null - where: - typeToTest << [ApiKey, OAuth, BasicAuth, ImplicitGrant, AuthorizationCodeGrant, TokenEndpoint, - TokenRequestEndpoint, AuthorizationScope, SecurityReference, LoginEndpoint] - } - - def "All AllowableValuesMapper null sources are mapped to null targets"() { - given: - AllowableValuesMapper mapper = allowableValuesMapper() - when: - def mapped = mapper."toSwagger$typeToTest.simpleName"(null) - then: - mapped == null - where: - typeToTest << [AllowableListValues, AllowableRangeValues] - } - - def "All ServiceModelToSwaggerMapper null sources are mapped to null targets"() { - given: - ServiceModelToSwaggerMapper mapper = serviceMapper() - when: - def mapped = mapper."toSwagger$typeToTest.simpleName"(null) - then: - mapped == null - where: - typeToTest << [ApiDescription, ApiInfo, ApiListing, ApiListingReference, ModelDto, ModelPropertyDto, Operation, - Parameter, ResourceListing, ResponseMessage] - } -} diff --git a/springfox-swagger1/src/test/groovy/springfox/documentation/swagger1/mappers/AllowableValuesMapperSpec.groovy b/springfox-swagger1/src/test/groovy/springfox/documentation/swagger1/mappers/AllowableValuesMapperSpec.groovy deleted file mode 100644 index e3d0e962631..00000000000 --- a/springfox-swagger1/src/test/groovy/springfox/documentation/swagger1/mappers/AllowableValuesMapperSpec.groovy +++ /dev/null @@ -1,110 +0,0 @@ -/* - * - * Copyright 2017 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.swagger1.mappers - -import spock.lang.Specification -import springfox.documentation.service.AllowableValues -import springfox.documentation.swagger1.dto.AllowableListValues -import springfox.documentation.swagger1.dto.AllowableRangeValues -import springfox.documentation.swagger1.mixins.MapperSupport - -class AllowableValuesMapperSpec extends Specification implements MapperSupport { - - def "Maps null range input to null output"() { - given: - springfox.documentation.service.AllowableRangeValues source = null - AllowableValuesMapper mapper = allowableValuesMapper() - when: - AllowableRangeValues dto = mapper.toSwaggerAllowableRangeValues(source) - then: - dto == source - } - - def "Maps null list values input to null output"() { - given: - springfox.documentation.service.AllowableListValues source = null - AllowableValuesMapper mapper = allowableValuesMapper() - when: - AllowableListValues dto = mapper.toSwaggerAllowableListValues(source) - then: - dto == source - } - - def "Maps list values input when values is null"() { - given: - springfox.documentation.service.AllowableListValues source = new springfox.documentation.service.AllowableListValues(null, "string") - AllowableValuesMapper mapper = allowableValuesMapper() - when: - AllowableListValues dto = mapper.toSwaggerAllowableListValues(source) - then: - dto.values == null - dto.valueType == "string" - } - - def "Maps allowable list correctly"() { - given: - springfox.documentation.service.AllowableListValues source = new springfox.documentation.service.AllowableListValues(['ONE', 'TWO'], "string") - AllowableValuesMapper mapper = allowableValuesMapper() - when: - AllowableListValues dto = mapper.toSwaggerAllowableListValues(source) - then: - dto.values.containsAll(['ONE', 'TWO']) - dto.valueType == "string" - } - - def "Maps allowable ranges correctly"() { - given: - springfox.documentation.service.AllowableRangeValues source = new springfox.documentation.service.AllowableRangeValues("0", "5") - AllowableValuesMapper mapper = allowableValuesMapper() - when: - AllowableRangeValues dto = mapper.toSwaggerAllowableRangeValues(source) - then: - dto.min == "0" - dto.max == "5" - } - - def "Maps abstract values correctly correctly"() { - given: - springfox.documentation.service.AllowableListValues listSource = new springfox.documentation.service.AllowableListValues(['ONE', 'TWO'], "string") - springfox.documentation.service.AllowableRangeValues rangeSource = new springfox.documentation.service.AllowableRangeValues("0", "5") - AllowableValuesMapper mapper = allowableValuesMapper() - when: - def rangeDto = mapper.toSwaggerAllowableValues(rangeSource) - def listDto = mapper.toSwaggerAllowableValues(listSource) - def nullDto = mapper.toSwaggerAllowableValues(null) - then: - rangeDto instanceof AllowableRangeValues - rangeDto.min == "0" - rangeDto.max == "5" - listDto instanceof AllowableListValues - listDto.values.containsAll(['ONE', 'TWO']) - listDto.valueType == "string" - nullDto == null - } - - def "AllowableValuesMapper handles unmapped values type"() { - given: - AllowableValuesMapper mapper = allowableValuesMapper() - when: - mapper.toSwaggerAllowableValues(new AllowableValues() {}) - then: - thrown(UnsupportedOperationException) - } -} diff --git a/springfox-swagger1/src/test/groovy/springfox/documentation/swagger1/mappers/AuthorizationTypesMapperSpec.groovy b/springfox-swagger1/src/test/groovy/springfox/documentation/swagger1/mappers/AuthorizationTypesMapperSpec.groovy deleted file mode 100644 index b5c9f8c5d54..00000000000 --- a/springfox-swagger1/src/test/groovy/springfox/documentation/swagger1/mappers/AuthorizationTypesMapperSpec.groovy +++ /dev/null @@ -1,197 +0,0 @@ -/* - * - * Copyright 2017-2019 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.swagger1.mappers - -import spock.lang.Specification -import springfox.documentation.builders.AuthorizationCodeGrantBuilder -import springfox.documentation.builders.AuthorizationScopeBuilder -import springfox.documentation.builders.ImplicitGrantBuilder -import springfox.documentation.builders.LoginEndpointBuilder -import springfox.documentation.builders.OAuthBuilder -import springfox.documentation.builders.TokenRequestEndpointBuilder -import springfox.documentation.service.ApiKey -import springfox.documentation.service.AuthorizationScope -import springfox.documentation.service.BasicAuth -import springfox.documentation.service.GrantType -import springfox.documentation.service.OAuth -import springfox.documentation.service.SecurityReference -import springfox.documentation.service.SecurityScheme -import springfox.documentation.swagger1.dto.Authorization -import springfox.documentation.swagger1.dto.AuthorizationCodeGrant -import springfox.documentation.swagger1.dto.ImplicitGrant -import springfox.documentation.swagger1.dto.LoginEndpoint -import springfox.documentation.swagger1.dto.TokenEndpoint -import springfox.documentation.swagger1.dto.TokenRequestEndpoint -import springfox.documentation.swagger1.mixins.MapperSupport - -import java.util.stream.Stream - -import static java.util.stream.Collectors.* - -class AuthorizationTypesMapperSpec extends Specification implements MapperSupport { - AuthorizationTypesMapper sut = authMapper() - - def "OAuth gets mapped correctly"() { - given: - OAuth built = createOAuth() - when: - def mapped = sut.toSwaggerOAuth(built) - and: - ImplicitGrant mappedImplicitGrant = - new ImplicitGrant(new LoginEndpoint("uri:login"), "oauth-implicit") - AuthorizationCodeGrant mappedAuthCodeGrant = new AuthorizationCodeGrant( - new TokenRequestEndpoint("uri:tokenReqEndpoint", "oauthSpec", "superSecret"), - new TokenEndpoint("uri:tokenEndpoint", "oauth-test-token")) - then: - mapped.type == built.type - mapped.grantTypes.size() == 2 - mapped.scopes.size() == 1 - ImplicitGrant actualImplicitGrant = mapped.grantTypes.find { it instanceof ImplicitGrant } - actualImplicitGrant.type == mappedImplicitGrant.type - actualImplicitGrant.loginEndpoint?.url == mappedImplicitGrant.loginEndpoint.url - actualImplicitGrant.tokenName == mappedImplicitGrant.tokenName - - - AuthorizationCodeGrant actualAuthCodeGrant = mapped.grantTypes.find { it instanceof AuthorizationCodeGrant } - actualAuthCodeGrant.tokenEndpoint?.tokenName == mappedAuthCodeGrant.tokenEndpoint.tokenName - actualAuthCodeGrant.tokenEndpoint?.url == mappedAuthCodeGrant.tokenEndpoint.url - actualAuthCodeGrant.tokenRequestEndpoint.clientIdName == mappedAuthCodeGrant.tokenRequestEndpoint.clientIdName - actualAuthCodeGrant.tokenRequestEndpoint.clientSecretName == mappedAuthCodeGrant.tokenRequestEndpoint.clientSecretName - actualAuthCodeGrant.tokenRequestEndpoint.url == mappedAuthCodeGrant.tokenRequestEndpoint.url - - mapped.scopes.first().scope == "oauth-spec" - mapped.scopes.first().description == "test scope" - } - - OAuth createOAuth() { - springfox.documentation.service.LoginEndpoint loginEndpoint = new LoginEndpointBuilder().url("uri:login").build() - def implicitGrant = new ImplicitGrantBuilder() - .loginEndpoint(loginEndpoint) - .tokenName("oauth-implicit") - .build() - def authCodeGrant = new AuthorizationCodeGrantBuilder() - .tokenEndpoint { - it.tokenName("oauth-test-token") - .url("uri:tokenEndpoint") - } - .tokenRequestEndpoint { - it.clientIdName("oauthSpec") - .clientSecretName("superSecret") - .url("uri:tokenReqEndpoint") - } - .build() - def authScope = new AuthorizationScopeBuilder() - .description("test scope") - .scope("oauth-spec") - .build() - new OAuthBuilder() - .grantTypes([implicitGrant, authCodeGrant]) - .scopes([authScope]) - .build() - } - - def "BasicAuth gets mapped correctly"() { - given: - BasicAuth built = new BasicAuth("auth") - when: - def mapped = sut.toSwaggerBasicAuth(built) - then: - built.type == mapped.type - } - - def "ApiKey gets mapped correctly"() { - given: - ApiKey built = new ApiKey("api-key", "key", "header",) - when: - def mapped = sut.toSwaggerApiKey(built) - then: - built.type == mapped.type - built.keyname == mapped.keyname - built.passAs == mapped.passAs - } - - def "Authorization gets mapped correctly"() { - given: - AuthorizationScope[] authScopes = [new AuthorizationScopeBuilder() - .description("test scope") - .scope("oauth-spec") - .build()] as AuthorizationScope[] - SecurityReference built = new SecurityReference.SecurityReferenceBuilder() - .reference("oauth") - .scopes(authScopes) - .build() - - when: - Authorization mapped = sut.toSwaggerSecurityReference(built) - then: - mapped.type == built.reference - mapped.scopes.size() == 1 - mapped.scopes.first().description == authScopes[0].description - mapped.scopes.first().scope == authScopes[0].scope - - mapped.type == built.reference - } - - def "Polymorphic authorization types are handled"() { - given: - List listAuthType = - Stream.of(createOAuth(), new BasicAuth("basic"), new ApiKey("api-key", "test", "header",)).collect(toList()) - - when: - List mapped = sut.toSwaggerAuthorizationTypes(listAuthType) - then: - mapped.size() == 3 - } - - def "AuthorizationTypesMapper handles unmapped grant type"() { - given: - AuthorizationTypesMapper mapper = authMapper() - when: - mapper.toSwaggerGrantType(new GrantType("unknown") {}) - then: - thrown(UnsupportedOperationException) - } - - def "AuthorizationTypesMapper handles list mapping with null values"() { - given: - AuthorizationTypesMapper mapper = authMapper() - when: - def mapped = mapper."toSwagger${typesToTest.simpleName}s"(null) - then: - mapped == null - where: - typesToTest << [AuthorizationScope, springfox.documentation.swagger1.dto.AuthorizationType, GrantType] - } - - def "AuthorizationTypesMapper handles unmapped authorization type"() { - given: - AuthorizationTypesMapper mapper = authMapper() - when: - mapper.toSwaggerAuthorizationType(new SecurityScheme("auth", - "unknown") { - @Override - String getName() { - throw new UnsupportedOperationException() - } - }) - then: - thrown(UnsupportedOperationException) - } -} diff --git a/springfox-swagger1/src/test/groovy/springfox/documentation/swagger1/mappers/DataTypeMapperSpec.groovy b/springfox-swagger1/src/test/groovy/springfox/documentation/swagger1/mappers/DataTypeMapperSpec.groovy deleted file mode 100644 index d5636c8ced1..00000000000 --- a/springfox-swagger1/src/test/groovy/springfox/documentation/swagger1/mappers/DataTypeMapperSpec.groovy +++ /dev/null @@ -1,74 +0,0 @@ -/* - * - * Copyright 2017 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.swagger1.mappers - -import spock.lang.Specification -import springfox.documentation.schema.ModelRef -import springfox.documentation.swagger1.mixins.MapperSupport - -class DataTypeMapperSpec extends Specification implements MapperSupport { - - def "Maps type name of model ref for responseTypeName"() { - given: - def sut = dataTypeMapper() - when: - def mapped = sut.responseTypeName(modelRef) - then: - mapped == typeName - where: - modelRef | typeName - new ModelRef("void") | "void" - new ModelRef("List", new ModelRef("String")) | "array" - new ModelRef("List", new ModelRef("byte")) | "string" - null | null - } - - def "Maps type name of model ref for typeFromModelRef"() { - given: - def sut = dataTypeMapper() - when: - def mapped = sut.typeFromModelRef(modelRef) - then: - mapped?.absoluteType == typeName - - where: - modelRef | typeName - new ModelRef("void") | "void" - new ModelRef("List", new ModelRef("String")) | "array" - new ModelRef("List", new ModelRef("byte")) | "string" - null | null - } - - def "Maps model ref for operationTypeFromModelRef"() { - given: - def sut = dataTypeMapper() - when: - def mapped = sut.operationTypeFromModelRef(modelRef) - then: - mapped?.absoluteType == typeName - - where: - modelRef | typeName - new ModelRef("void") | "void" - new ModelRef("List", new ModelRef("String")) | "array" - new ModelRef("List", new ModelRef("byte")) | "string" - null | null - } -} diff --git a/springfox-swagger1/src/test/groovy/springfox/documentation/swagger1/mappers/ServiceModelToSwaggerMapperSpec.groovy b/springfox-swagger1/src/test/groovy/springfox/documentation/swagger1/mappers/ServiceModelToSwaggerMapperSpec.groovy deleted file mode 100644 index cffcaf15601..00000000000 --- a/springfox-swagger1/src/test/groovy/springfox/documentation/swagger1/mappers/ServiceModelToSwaggerMapperSpec.groovy +++ /dev/null @@ -1,221 +0,0 @@ -/* - * - * Copyright 2017-2019 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.swagger1.mappers - -import com.fasterxml.classmate.TypeResolver -import org.springframework.http.HttpMethod -import spock.lang.Specification -import springfox.documentation.builders.ApiDescriptionBuilder -import springfox.documentation.builders.ApiInfoBuilder -import springfox.documentation.builders.ApiListingBuilder -import springfox.documentation.builders.AuthorizationScopeBuilder -import springfox.documentation.builders.ModelBuilder -import springfox.documentation.builders.ModelPropertyBuilder -import springfox.documentation.builders.OperationBuilder -import springfox.documentation.builders.ParameterBuilder -import springfox.documentation.builders.ResourceListingBuilder -import springfox.documentation.builders.ResponseMessageBuilder -import springfox.documentation.schema.ModelRef -import springfox.documentation.service.AllowableListValues -import springfox.documentation.service.ApiListingReference -import springfox.documentation.service.Contact -import springfox.documentation.service.SecurityReference -import springfox.documentation.spi.service.contexts.Defaults -import springfox.documentation.spring.web.readers.operation.CachingOperationNameGenerator -import springfox.documentation.swagger1.mixins.MapperSupport - -import static java.util.Collections.* - -class ServiceModelToSwaggerMapperSpec extends Specification implements MapperSupport { - def "Maps the api description correctly"() { - given: - def defaults = new Defaults() - def scope = new AuthorizationScopeBuilder() - .scope("test") - .description("test scope") - .build() - def response = new ResponseMessageBuilder() - .code(200) - .message("Success") - .responseModel(new ModelRef("string")) - .build() - def operation1 = new OperationBuilder(new CachingOperationNameGenerator()) - .authorizations([SecurityReference.builder() - .reference("basic") - .scopes(scope) - .build()]) - .consumes(singleton("application/json")) - .produces(singleton("application/json")) - .deprecated("deprecated") - .method(HttpMethod.POST) - .uniqueId("op1") - .notes("operation 1 notes") - .parameters([new ParameterBuilder() - .allowableValues(new AllowableListValues(["FIRST", "SECOND"], "string")) - .allowMultiple(false) - .defaultValue("FIRST") - .description("Chose first or second") - .name("order") - .parameterAccess("access") - .parameterType("body") - .modelRef(new ModelRef("string")) - .required(true) - .build()]) - .position(1) - .codegenMethodNameStem("") - .protocols(singleton("https")) - .responseModel(new ModelRef("string")) - .responseMessages(singleton(response)) - .build() - def description = new ApiDescriptionBuilder(defaults.operationOrdering()) - .description("test") - .hidden(true) - .path("/api-path") - .operations([operation1]) - .build() - def built = new ApiListingBuilder(new Defaults().apiDescriptionOrdering()) - .apis([description]) - .apiVersion("1.0") - .securityReferences(null) - .basePath("/base-path") - .description("listing") - .consumes([] as Set) - .produces([] as Set) - .models([ - "m1" : new ModelBuilder("test") - .description("test") - .name("test") - .qualifiedType("qualified.name") - .subTypes(null) - .properties([ - "p1" : new ModelPropertyBuilder() - .allowableValues(null) - .description("property 1") - .position(1) - .qualifiedType("qualified.Test") - .required(true) - .type(new TypeResolver().resolve(String)) - .build() - ]) - .build()]) - .position(1) - .resourcePath("/resource-path") - .protocols(null) - .build() - def sut = serviceMapper() - when: - def mappedListing = sut.toSwaggerApiListing(built) - and: - def mappedDescription = mappedListing.apis.first() - def builtDescription = built.apis.first() - def mappedOperation = mappedDescription.operations.first() - def builtOperation = built.apis.first().operations.first() - then: - mappedDescription.description == built.apis.first().description - mappedDescription.hidden == builtDescription.hidden - mappedDescription.path == builtDescription.path - mappedDescription.operations.size() == builtDescription.operations.size() - mappedOperation.nickname == builtOperation.uniqueId - mappedOperation.authorizations.size() == builtOperation.securityReferences.size() - mappedOperation.authorizations.containsKey("basic") - mappedOperation.consumes.first() == builtOperation.consumes.first() - mappedOperation.produces.first() == builtOperation.produces.first() - mappedOperation.parameters.size() == builtOperation.parameters.size() - mappedOperation.parameters.first().name == builtOperation.parameters.first().name - mappedOperation.position == builtOperation.position - mappedOperation.notes == builtOperation.notes - mappedOperation.dataType.absoluteType == "string" - mappedOperation.deprecated == builtOperation.deprecated - mappedOperation.protocol.first() == builtOperation.protocol.first() - mappedOperation.responseMessages.size() == builtOperation.responseMessages.size() - mappedOperation.responseMessages.first().code == builtOperation.responseMessages.first().code - mappedOperation.responseMessages.first().message == builtOperation.responseMessages.first().message - mappedOperation.responseMessages.first().responseModel == - builtOperation.responseMessages.first().responseModel.type - } - - def "Resource listings are mapped correctly"() { - given: - def built = new ResourceListingBuilder() - .apis([new ApiListingReference("test", "test description", 1)]) - .apiVersion("1.0") - .securitySchemes(null) - .info(new ApiInfoBuilder() - .contact(new Contact("test@ssmvc.com", "urn:test", "test@ssmvc.com")) - .description("test api") - .license("MIT") - .licenseUrl("urn:mit:lic") - .termsOfServiceUrl("urn:tos") - .title("Api Tester") - .build()) - .build(); - when: - def sut = serviceMapper() - def mapped = sut.toSwaggerResourceListing(built) - then: - mapped.apis.size() == built.apis.size() - mapped.apis.first().path == built.apis.first().path - mapped.apis.first().description == built.apis.first().description - mapped.apis.first().position == built.apis.first().position - mapped.apiVersion == built.apiVersion - mapped.authorizations == built.securitySchemes - mapped.swaggerVersion == "1.2" - mapped.info.contact == built.info.contact.name - mapped.info.description == built.info.description - mapped.info.license == built.info.license - mapped.info.licenseUrl == built.info.licenseUrl - mapped.info.termsOfServiceUrl == built.info.termsOfServiceUrl - mapped.info.title == built.info.title - } - - def "Resource listings are mapped correctly with authorizations"() { - given: - def built = new ResourceListingBuilder() - .apis([new ApiListingReference("test", "test description", 1)]) - .apiVersion("1.0") - .securitySchemes([]) - .info(new ApiInfoBuilder() - .contact(new Contact("test@ssmvc.com", "urn:test", "test@ssmvc.com")) - .description("test api") - .license("MIT") - .licenseUrl("urn:mit:lic") - .termsOfServiceUrl("urn:tos") - .title("Api Tester") - .build()) - .build(); - when: - def sut = serviceMapper() - def mapped = sut.toSwaggerResourceListing(built) - then: - mapped.apis.size() == built.apis.size() - mapped.apis.first().path == built.apis.first().path - mapped.apis.first().description == built.apis.first().description - mapped.apis.first().position == built.apis.first().position - mapped.apiVersion == built.apiVersion - mapped.authorizations == built.securitySchemes - mapped.swaggerVersion == "1.2" - mapped.info.contact == built.info.contact.name - mapped.info.description == built.info.description - mapped.info.license == built.info.license - mapped.info.licenseUrl == built.info.licenseUrl - mapped.info.termsOfServiceUrl == built.info.termsOfServiceUrl - mapped.info.title == built.info.title - } -} diff --git a/springfox-swagger1/src/test/groovy/springfox/documentation/swagger1/mixins/MapperSupport.groovy b/springfox-swagger1/src/test/groovy/springfox/documentation/swagger1/mixins/MapperSupport.groovy deleted file mode 100644 index df952fd29e2..00000000000 --- a/springfox-swagger1/src/test/groovy/springfox/documentation/swagger1/mixins/MapperSupport.groovy +++ /dev/null @@ -1,51 +0,0 @@ -/* - * - * Copyright 2017 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.swagger1.mixins - -import org.mapstruct.factory.Mappers -import springfox.documentation.schema.mixins.ModelProviderSupport -import springfox.documentation.swagger.mixins.SwaggerPluginsSupport -import springfox.documentation.swagger1.mappers.AllowableValuesMapper -import springfox.documentation.swagger1.mappers.AuthorizationTypesMapper -import springfox.documentation.swagger1.mappers.DataTypeMapper -import springfox.documentation.swagger1.mappers.ServiceModelToSwaggerMapper - -@SuppressWarnings("GrMethodMayBeStatic") -trait MapperSupport implements ModelProviderSupport, SwaggerPluginsSupport { - DataTypeMapper dataTypeMapper() { - new DataTypeMapper() - } - - AuthorizationTypesMapper authMapper() { - Mappers.getMapper(AuthorizationTypesMapper) - } - - AllowableValuesMapper allowableValuesMapper() { - Mappers.getMapper(AllowableValuesMapper) - } - - ServiceModelToSwaggerMapper serviceMapper() { - def mapper = Mappers.getMapper(ServiceModelToSwaggerMapper) - mapper.authorizationTypesMapper = authMapper() - mapper.allowableValuesMapper = allowableValuesMapper() - mapper.dataTypeMapper = dataTypeMapper() - mapper - } -} diff --git a/springfox-swagger1/src/test/groovy/springfox/documentation/swagger1/readers/parameter/OperationParameterReaderSpec.groovy b/springfox-swagger1/src/test/groovy/springfox/documentation/swagger1/readers/parameter/OperationParameterReaderSpec.groovy deleted file mode 100644 index 2ba65728c1f..00000000000 --- a/springfox-swagger1/src/test/groovy/springfox/documentation/swagger1/readers/parameter/OperationParameterReaderSpec.groovy +++ /dev/null @@ -1,229 +0,0 @@ -/* - * - * Copyright 2015-2019 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.swagger1.readers.parameter - -import com.fasterxml.classmate.TypeResolver -import org.joda.time.LocalDateTime -import org.springframework.validation.BindingResult -import org.springframework.web.bind.annotation.RequestMethod -import org.springframework.web.method.HandlerMethod -import springfox.documentation.builders.OperationBuilder -import springfox.documentation.schema.JacksonEnumTypeDeterminer -import springfox.documentation.schema.property.bean.AccessorsProvider -import springfox.documentation.schema.property.field.FieldProvider -import springfox.documentation.service.Parameter -import springfox.documentation.spi.service.contexts.Defaults -import springfox.documentation.spi.service.contexts.OperationContext -import springfox.documentation.spi.service.contexts.RequestMappingContext -import springfox.documentation.spring.web.WebMvcRequestHandler -import springfox.documentation.spring.web.dummy.DummyModels -import springfox.documentation.spring.web.dummy.models.Example -import springfox.documentation.spring.web.dummy.models.Treeish -import springfox.documentation.spring.web.mixins.ModelProviderForServiceSupport -import springfox.documentation.spring.web.mixins.RequestMappingSupport -import springfox.documentation.spring.web.paths.DefaultPathProvider -import springfox.documentation.spring.web.paths.Paths -import springfox.documentation.spring.web.plugins.DocumentationContextSpec -import springfox.documentation.spring.web.readers.operation.CachingOperationNameGenerator -import springfox.documentation.spring.web.readers.operation.ContentParameterAggregator -import springfox.documentation.spring.web.readers.operation.HandlerMethodResolver -import springfox.documentation.spring.web.readers.operation.OperationParameterReader -import springfox.documentation.spring.web.readers.parameter.ModelAttributeParameterExpander -import springfox.documentation.swagger.mixins.SwaggerPluginsSupport -import springfox.documentation.swagger1.web.SwaggerDefaultConfiguration - -import jakarta.servlet.ServletContext -import jakarta.servlet.ServletRequest -import jakarta.servlet.ServletResponse -import jakarta.servlet.http.HttpServletRequest -import jakarta.servlet.http.HttpServletResponse - -import static springfox.documentation.schema.AlternateTypeRules.* - -class OperationParameterReaderSpec - extends DocumentationContextSpec - implements RequestMappingSupport, - SwaggerPluginsSupport, - ModelProviderForServiceSupport { - OperationParameterReader sut - def pluginsManager - - def setup() { - def typeResolver = new TypeResolver() - def enumTypeDeterminer = new JacksonEnumTypeDeterminer() - pluginsManager = swaggerServicePlugins([ - new SwaggerDefaultConfiguration(new Defaults(), typeResolver, new DefaultPathProvider())]) - plugin - .ignoredParameterTypes( - ServletRequest, - ServletResponse, - HttpServletRequest, - HttpServletResponse, - BindingResult, ServletContext, - DummyModels.Ignorable.class) - .alternateTypeRules(newRule(typeResolver.resolve(LocalDateTime), typeResolver.resolve(String))) - .configure(contextBuilder) - - def expander = new ModelAttributeParameterExpander( - new FieldProvider(typeResolver), - new AccessorsProvider(typeResolver), - enumTypeDeterminer) - - expander.pluginsManager = pluginsManager - - sut = new OperationParameterReader(expander, enumTypeDeterminer, new ContentParameterAggregator()) - sut.pluginsManager = pluginsManager - } - - def "Should ignore ignorables"() { - given: - OperationContext operationContext = - operationContext(documentationContext(), handlerMethod) - - when: - sut.apply(operationContext) - def operation = operationContext.operationBuilder().build() - - then: - operation.parameters.size() == expectedSize - - where: - handlerMethod | expectedSize - dummyHandlerMethod('methodWithServletRequest', ServletRequest.class) | 0 - dummyHandlerMethod('methodWithBindingResult', BindingResult.class) | 0 - dummyHandlerMethod('methodWithInteger', Integer.class) | 1 - dummyHandlerMethod('methodWithAnnotatedInteger', Integer.class) | 0 - } - - def "Should read a request mapping method without APIParameter annotation"() { - given: - HandlerMethod handlerMethod = dummyHandlerMethod('methodWithSinglePathVariable', String.class) - - OperationContext operationContext = - operationContext(documentationContext(), handlerMethod) - - - when: - sut.apply(operationContext) - def operation = operationContext.operationBuilder().build() - - then: - Parameter parameter = operation.parameters[0] - assert parameter."$property" == expectedValue - - where: - property | expectedValue - 'name' | 'businessId' - 'required' | false - 'allowMultiple' | false - 'paramType' | null - } - - def "Should expand ModelAttribute request params"() { - given: - OperationContext operationContext = - operationContext(documentationContext(), dummyHandlerMethod('methodWithModelAttribute', Example.class)) - - when: - sut.apply(operationContext) - def operation = operationContext.operationBuilder().build() - - then: - operation.parameters.size() == 10 - - Parameter annotatedFooParam = operation.parameters.find { it.name == "foo" } - annotatedFooParam != null - annotatedFooParam.getDescription() == 'description of foo' - annotatedFooParam.required - annotatedFooParam.allowableValues != null - - Parameter annotatedBarParam = operation.parameters.find { it.name == "bar" } - annotatedBarParam.getDescription() == 'description of bar' - !annotatedBarParam.required - annotatedBarParam.allowableValues == null - - Parameter unannotatedEnumTypeParam = operation.parameters.find { it.name == "enumType" } - unannotatedEnumTypeParam.getDescription() == null - unannotatedEnumTypeParam.allowableValues != null - - Parameter annotatedEnumTypeParam = operation.parameters.find { it.name == "annotatedEnumType" } - annotatedEnumTypeParam.getDescription() == 'description of annotatedEnumType' - annotatedEnumTypeParam.allowableValues != null - - Parameter unannotatedNestedTypeNameParam = operation.parameters.find { it.name == "nestedType.name" } - unannotatedNestedTypeNameParam != null - unannotatedNestedTypeNameParam.getDescription() == null - - Parameter annotatedAllCapsSetParam = operation.parameters.find { it.name == "allCapsSet" } - annotatedAllCapsSetParam.getDescription() == 'description of allCapsSet' - !annotatedAllCapsSetParam.required - annotatedAllCapsSetParam.allowableValues == null - - Parameter unannotatedParentBeanParam = operation.parameters.find { it.name == "parentBeanProperty" } - unannotatedParentBeanParam.getDescription() == null - - Parameter localDateTime = operation.parameters.find { it.name == "localDateTime" } - localDateTime.required - localDateTime.getDescription() == 'local date time desc dd-MM-yyyy hh:mm:ss' - } - - def "Should expand ModelAttribute request param if param has treeish field"() { - given: - def methodResolver = new HandlerMethodResolver(new TypeResolver()) - - OperationContext operationContext = new OperationContext( - new OperationBuilder(new CachingOperationNameGenerator()), - RequestMethod.GET, - new RequestMappingContext("0", - documentationContext(), - new WebMvcRequestHandler( - Paths.ROOT, - methodResolver, - requestMappingInfo("/somePath"), - dummyHandlerMethod('methodWithTreeishModelAttribute', Treeish.class))), - 0) - when: - sut.apply(operationContext) - def operation = operationContext.operationBuilder().build() - - then: - operation.parameters.size() == 1 - Parameter annotatedBarParam = operation.parameters[0] - annotatedBarParam != null - annotatedBarParam.name == 'treeishField' - } - - def "Should not expand unannotated request params"() { - given: - OperationContext operationContext = - operationContext(documentationContext(), handlerMethod) - - when: - sut.apply(operationContext) - def operation = operationContext.operationBuilder().build() - - then: - operation.parameters.size() == expectedSize - - where: - handlerMethod | expectedSize - dummyHandlerMethod('methodWithoutModelAttribute', Example.class) | 10 - } -} diff --git a/springfox-swagger1/src/test/groovy/springfox/documentation/swagger1/readers/parameter/ParameterNameReaderSpec.groovy b/springfox-swagger1/src/test/groovy/springfox/documentation/swagger1/readers/parameter/ParameterNameReaderSpec.groovy deleted file mode 100644 index 43014d7341b..00000000000 --- a/springfox-swagger1/src/test/groovy/springfox/documentation/swagger1/readers/parameter/ParameterNameReaderSpec.groovy +++ /dev/null @@ -1,81 +0,0 @@ -/* - * - * Copyright 2015-2016 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.swagger1.readers.parameter - -import com.fasterxml.classmate.TypeResolver -import io.swagger.annotations.ApiParam -import springfox.documentation.schema.DefaultGenericTypeNamingStrategy -import springfox.documentation.service.ParameterType -import springfox.documentation.service.ResolvedMethodParameter -import springfox.documentation.spi.DocumentationType -import springfox.documentation.spi.service.contexts.OperationContext -import springfox.documentation.spi.service.contexts.ParameterContext -import springfox.documentation.spring.web.mixins.ModelProviderForServiceSupport -import springfox.documentation.spring.web.mixins.RequestMappingSupport -import springfox.documentation.spring.web.plugins.DocumentationContextSpec - -class ParameterNameReaderSpec - extends DocumentationContextSpec - implements RequestMappingSupport, - ModelProviderForServiceSupport { - - def "Should support only swagger 1 documentation types"() { - given: - def sut = new ParameterNameReader() - - expect: - !sut.supports(DocumentationType.SPRING_WEB) - sut.supports(DocumentationType.SWAGGER_12) - !sut.supports(DocumentationType.SWAGGER_2) - } - - def "param required"() { - given: - def operationContext = Mock(OperationContext) - def resolvedMethodParameter = - new ResolvedMethodParameter(0, "", [apiParam], new TypeResolver().resolve(Object.class)) - def genericNamingStrategy = new DefaultGenericTypeNamingStrategy() - - and: "mocks are setup" - operationContext.consumes() >> [] - and: "documentationContext is setup" - ParameterContext parameterContext = new ParameterContext(resolvedMethodParameter, - documentationContext(), genericNamingStrategy, operationContext, 0) - - when: - def sut = nameReader(apiParam) - sut.apply(parameterContext) - - then: - parameterContext.requestParameterBuilder() - .in(ParameterType.BODY) - .build().name == expectedName - - where: - apiParam | paramType | expectedName - [name: { -> "bodyParam" }, value: { -> "body Param" }] as ApiParam | "body" | "body" - null | "body" | "body" - } - - def nameReader(annotation) { - new ParameterNameReader() { - } - } -} diff --git a/springfox-swagger1/src/test/groovy/springfox/documentation/swagger1/web/ApiListingMergerSpec.groovy b/springfox-swagger1/src/test/groovy/springfox/documentation/swagger1/web/ApiListingMergerSpec.groovy deleted file mode 100644 index fccc82ae503..00000000000 --- a/springfox-swagger1/src/test/groovy/springfox/documentation/swagger1/web/ApiListingMergerSpec.groovy +++ /dev/null @@ -1,75 +0,0 @@ -/* - * - * Copyright 2017-2019 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ -package springfox.documentation.swagger1.web - -import org.springframework.http.MediaType -import spock.lang.Specification -import springfox.documentation.swagger1.dto.ApiListing -import springfox.documentation.swagger1.dto.ModelDto -import springfox.documentation.swagger1.dto.ModelPropertyDto - -import static java.util.Collections.* - -class ApiListingMergerSpec extends Specification { - - def "it returns api listing absent when collection is empty"(){ - when: - def merged = ApiListingMerger.mergedApiListing(apiListings) - then: - !merged.isPresent() - where: - apiListings << [new ArrayList<>(), null] - } - - def "it returns api listing absent when collection has one element"(){ - when: - def merged = ApiListingMerger.mergedApiListing(singletonList(Mock(ApiListing))) - then: - merged.isPresent() - } - - def "it returns api listing absent when collection has more than one element"(){ - when: - def merged = ApiListingMerger.mergedApiListing([newApiListing(), newApiListing()]) - then: - merged.isPresent() - } - - def newApiListing() { - ApiListing apiListing = new ApiListing() - apiListing.apiVersion = '1' - apiListing.swaggerVersion = '1.2' - apiListing.basePath = '/base' - apiListing.resourcePath= '/resource' - apiListing.consumes= [MediaType.APPLICATION_JSON_VALUE] - apiListing.produces= [MediaType.APPLICATION_JSON_VALUE] - apiListing.protocols= [] - apiListing.authorizations= [] - apiListing.apis = [] - apiListing.models = - ['someModel': - new ModelDto('id', 'name', 'qtype', - ['aprop': new ModelPropertyDto("aProp", 'ptype', 'qtype', 0, false, 'pdesc', null)] - , 'desc', null, null, null) - ] - apiListing.description = 'description' - apiListing.position = 0 - apiListing - } -} diff --git a/springfox-swagger1/src/test/groovy/springfox/documentation/swagger1/web/Swagger1ControllerSpec.groovy b/springfox-swagger1/src/test/groovy/springfox/documentation/swagger1/web/Swagger1ControllerSpec.groovy deleted file mode 100644 index bcf730477c6..00000000000 --- a/springfox-swagger1/src/test/groovy/springfox/documentation/swagger1/web/Swagger1ControllerSpec.groovy +++ /dev/null @@ -1,137 +0,0 @@ -/* - * - * Copyright 2017 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.swagger1.web - -import org.springframework.core.env.Environment -import org.springframework.http.HttpStatus -import org.springframework.web.util.WebUtils -import spock.lang.Unroll -import springfox.documentation.builders.DocumentationBuilder -import springfox.documentation.service.ApiListing -import springfox.documentation.service.Documentation -import springfox.documentation.service.SecurityScheme -import springfox.documentation.spring.web.DocumentationCache -import springfox.documentation.spring.web.json.JsonSerializer -import springfox.documentation.spring.web.mixins.ApiListingSupport -import springfox.documentation.spring.web.mixins.AuthSupport -import springfox.documentation.spring.web.mixins.JsonSupport -import springfox.documentation.spring.web.plugins.DocumentationContextSpec -import springfox.documentation.spring.web.scanners.ApiDocumentationScanner -import springfox.documentation.spring.web.scanners.ApiListingReferenceScanResult -import springfox.documentation.spring.web.scanners.ApiListingReferenceScanner -import springfox.documentation.spring.web.scanners.ApiListingScanner -import springfox.documentation.swagger1.configuration.SwaggerJacksonModule -import springfox.documentation.swagger1.mixins.MapperSupport - -import jakarta.servlet.ServletContext -import jakarta.servlet.http.HttpServletRequest - -class Swagger1ControllerSpec extends DocumentationContextSpec - implements MapperSupport, - JsonSupport, - AuthSupport, - ApiListingSupport { - - Swagger1Controller sut = new Swagger1Controller( - new DocumentationCache(), - serviceMapper(), - new JsonSerializer([new SwaggerJacksonModule()])) - - - ApiListingReferenceScanner listingReferenceScanner - ApiListingScanner listingScanner - - def setup() { - listingReferenceScanner = Mock(ApiListingReferenceScanner) - listingScanner = Mock(ApiListingScanner) - listingReferenceScanner.scan(_) >> new ApiListingReferenceScanResult(new HashMap<>()) - listingScanner.scan(_) >> new HashMap<>() - } - - @Unroll - def "should return #expectedStatus.value() for #group"() { - given: - ApiDocumentationScanner scanner = new ApiDocumentationScanner(listingReferenceScanner, listingScanner) - sut.documentationCache.addDocumentation(scanner.scan(documentationContext())) - when: - def result = sut.getResourceListing(group) - then: - result.getStatusCode() == expectedStatus - where: - group | expectedStatus - null | HttpStatus.OK - "default" | HttpStatus.OK - "unknown" | HttpStatus.NOT_FOUND - } - - def "should respond with api listing for a given resource group"() { - given: - Map> listings = new HashMap<>() - listings.put('businesses', Arrays.asList(apiListing())) - and: - Documentation group = new DocumentationBuilder() - .name("groupName") - .apiListingsByResourceGroupName(listings) - .build() - sut.documentationCache.addDocumentation(group) - when: - def result = sut.getApiListing("groupName", "businesses", servletRequest()) - then: - result.getStatusCode() == HttpStatus.OK - } - - def "should respond with auth included"() { - given: - def authTypes = new ArrayList() - authTypes.add(authorizationTypes()) - Documentation group = new DocumentationBuilder() - .name("groupName") - .resourceListing(resourceListing(authTypes)) - .build() - - sut.documentationCache.addDocumentation(group) - when: - def result = sut.getResourceListing("groupName") - then: - result.getStatusCode() == HttpStatus.OK - assertDefaultAuth(jsonBodyResponse(result.getBody().value())) - } - - def servletRequest() { - def contextPath = "/contextPath" - - HttpServletRequest request = Mock(HttpServletRequest) - request.contextPath >> contextPath - request.servletPath >> "/servletPath" - request.getAttribute(WebUtils.INCLUDE_REQUEST_URI_ATTRIBUTE) >> "http://localhost:8080/api-docs" - request.requestURL >> new StringBuffer("http://localhost/api-docs") - request.headerNames >> Collections.enumeration([]) - request.servletContext >> servletContext(contextPath) - - request - } - - def servletContext(String contextPath) { - ServletContext servletContext = Mock(ServletContext) - servletContext.contextPath >> contextPath - - servletContext - } -} \ No newline at end of file diff --git a/springfox-swagger1/src/test/groovy/springfox/documentation/swagger1/web/SwaggerApiDescriptionReaderSpec.groovy b/springfox-swagger1/src/test/groovy/springfox/documentation/swagger1/web/SwaggerApiDescriptionReaderSpec.groovy deleted file mode 100644 index 34957e0abef..00000000000 --- a/springfox-swagger1/src/test/groovy/springfox/documentation/swagger1/web/SwaggerApiDescriptionReaderSpec.groovy +++ /dev/null @@ -1,98 +0,0 @@ -/* - * - * Copyright 2015-2019 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.swagger1.web - -import com.fasterxml.classmate.TypeResolver -import org.springframework.web.servlet.mvc.method.RequestMappingInfo -import spock.lang.Shared -import springfox.documentation.service.ApiDescription -import springfox.documentation.service.Operation -import springfox.documentation.spi.service.contexts.RequestMappingContext -import springfox.documentation.spring.web.WebMvcRequestHandler -import springfox.documentation.spring.web.mixins.RequestMappingSupport -import springfox.documentation.spring.web.paths.DefaultPathProvider -import springfox.documentation.spring.web.plugins.DocumentationContextSpec -import springfox.documentation.spring.web.readers.operation.ApiOperationReader -import springfox.documentation.spring.web.readers.operation.HandlerMethodResolver -import springfox.documentation.spring.web.scanners.ApiDescriptionLookup -import springfox.documentation.spring.web.scanners.ApiDescriptionReader - -import static springfox.documentation.spring.web.paths.Paths.* - -class SwaggerApiDescriptionReaderSpec extends DocumentationContextSpec implements RequestMappingSupport { - @Shared def relativeSwaggerPathProvider = new DefaultPathProvider() - - def "should generate an api description for each request mapping pattern"() { - given: - def operationReader = Mock(ApiOperationReader) - ApiDescriptionReader sut = - new ApiDescriptionReader(operationReader, defaultWebPlugins(), new ApiDescriptionLookup()) - - and: - plugin.pathProvider(pathProvider) - RequestMappingInfo requestMappingInfo = requestMappingInfo("/doesNotMatterForThisTest", - [patternsRequestCondition: patternsRequestCondition('/somePath/{businessId}', '/somePath/{businessId:\\d+}')] - ) - RequestMappingContext mappingContext = new RequestMappingContext( - "0", - documentationContext(), - new WebMvcRequestHandler( - ROOT, - new HandlerMethodResolver(new TypeResolver()), - requestMappingInfo, - dummyHandlerMethod())) - operationReader.read(_) >> [Mock(Operation), Mock(Operation)] - - when: - def descriptionList = sut.read(mappingContext) - - then: - descriptionList.size() == 2 - - ApiDescription apiDescription = descriptionList[0] - ApiDescription secondApiDescription = descriptionList[1] - - apiDescription.getPath() == '/somePath/{businessId}' - apiDescription.getDescription() == dummyHandlerMethod().method.name - - secondApiDescription.getPath() == '/somePath/{businessId}' - secondApiDescription.getDescription() == dummyHandlerMethod().method.name - - where: - pathProvider | prefix - relativeSwaggerPathProvider | "" - } - - def "should sanitize request mapping endpoints"() { - expect: - sanitizeRequestMappingPattern(mappingPattern) == expected - - where: - mappingPattern | expected - "" | "/" - "/" | "/" - "/businesses" | "/businesses" - "/{businessId:\\w+}" | "/{businessId}" - "/businesses/{businessId}" | "/businesses/{businessId}" - "/foo/bar:{baz}" | "/foo/bar:{baz}" - "/foo:{foo}/bar:{baz}" | "/foo:{foo}/bar:{baz}" - "/foo/bar:{baz:\\w+}" | "/foo/bar:{baz}" - } -} diff --git a/springfox-swagger1/src/test/java/springfox/documentation/swagger1/configuration/CustomJavaPluginConfig.java b/springfox-swagger1/src/test/java/springfox/documentation/swagger1/configuration/CustomJavaPluginConfig.java deleted file mode 100644 index 7357a1fa24b..00000000000 --- a/springfox-swagger1/src/test/java/springfox/documentation/swagger1/configuration/CustomJavaPluginConfig.java +++ /dev/null @@ -1,84 +0,0 @@ -/* - * - * Copyright 2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.swagger1.configuration; - -import com.fasterxml.jackson.databind.ObjectMapper; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.ComponentScan; -import org.springframework.context.annotation.Configuration; -import org.springframework.web.servlet.config.annotation.EnableWebMvc; -import springfox.documentation.builders.ApiInfoBuilder; -import springfox.documentation.builders.PathSelectors; -import springfox.documentation.service.ApiInfo; -import springfox.documentation.service.Contact; -import springfox.documentation.spring.web.plugins.Docket; -import springfox.documentation.swagger1.annotations.EnableSwagger; - -import static springfox.documentation.spi.DocumentationType.*; - - -@Configuration -@EnableWebMvc -@EnableSwagger -@ComponentScan("springfox.documentation.spring.web.dummy") //Scan some controllers -public class CustomJavaPluginConfig { - - /** - * Every SwaggerSpringMvcPlugin bean is picked up by the swagger-mvc framework - allowing for multiple - * swagger groups i.e. same code base multiple swagger resource listings - */ - @Bean - public Docket customImplementation() { - return new Docket(SWAGGER_12) - .groupName("customPlugin") - .select() - .paths(PathSelectors.regex(".*pet.*")) - .build(); - } - - @Bean - public Docket secondCustomImplementation() { - return new Docket(SWAGGER_12) - .groupName("secondCustomPlugin") - .apiInfo(apiInfo()) - .select() - .paths(PathSelectors.regex("/feature.*")) - .build(); - } - - @Bean - public ObjectMapper objectMapper() { - return new ObjectMapper(); - } - - private ApiInfo apiInfo() { - return new ApiInfoBuilder() - .title("My Apps API Title") - .description("My Apps API Description") - .termsOfServiceUrl("My Apps API terms of service") - .contact(new Contact( - "My Apps API Contact Email", - "", - "")) - .license("My Apps API Licence Type") - .licenseUrl("My Apps API License URL") - .build(); - } -} diff --git a/springfox-swagger1/src/test/java/springfox/documentation/swagger1/configuration/CustomXmlJavaConfig.java b/springfox-swagger1/src/test/java/springfox/documentation/swagger1/configuration/CustomXmlJavaConfig.java deleted file mode 100644 index bb2f2f7806b..00000000000 --- a/springfox-swagger1/src/test/java/springfox/documentation/swagger1/configuration/CustomXmlJavaConfig.java +++ /dev/null @@ -1,51 +0,0 @@ -/* - * - * Copyright 2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.swagger1.configuration; - -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.web.servlet.config.annotation.EnableWebMvc; -import springfox.documentation.builders.PathSelectors; -import springfox.documentation.spi.DocumentationType; -import springfox.documentation.spring.web.plugins.Docket; -import springfox.documentation.swagger1.annotations.EnableSwagger; - -@Configuration -@EnableSwagger -@EnableWebMvc -public class CustomXmlJavaConfig { - @Bean - public Docket customImplementation() { - return new Docket(DocumentationType.SWAGGER_12) - .groupName("customPlugin") - .select() - .paths(PathSelectors.regex(".*pet.*")) - .build(); - } - - @Bean - public Docket secondCustomImplementation() { - return new Docket(DocumentationType.SWAGGER_12) - .groupName("secondCustomPlugin") - .select() - .paths(PathSelectors.regex("/feature.*")) - .build(); - } -} diff --git a/springfox-swagger1/src/test/java/springfox/documentation/swagger1/configuration/DefaultJavaPluginConfig.java b/springfox-swagger1/src/test/java/springfox/documentation/swagger1/configuration/DefaultJavaPluginConfig.java deleted file mode 100644 index e6e47706220..00000000000 --- a/springfox-swagger1/src/test/java/springfox/documentation/swagger1/configuration/DefaultJavaPluginConfig.java +++ /dev/null @@ -1,34 +0,0 @@ -/* - * - * Copyright 2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.swagger1.configuration; - -import org.springframework.context.annotation.ComponentScan; -import org.springframework.context.annotation.Configuration; -import org.springframework.web.servlet.config.annotation.EnableWebMvc; -import springfox.documentation.swagger1.annotations.EnableSwagger; - - -@Configuration -@EnableWebMvc -@EnableSwagger -@ComponentScan("springfox.documentation.spring.web.dummy") -public class DefaultJavaPluginConfig { - -} diff --git a/springfox-swagger1/src/test/java/springfox/documentation/swagger1/configuration/MultipleRMHAConfig.java b/springfox-swagger1/src/test/java/springfox/documentation/swagger1/configuration/MultipleRMHAConfig.java deleted file mode 100644 index a20fcdaee0a..00000000000 --- a/springfox-swagger1/src/test/java/springfox/documentation/swagger1/configuration/MultipleRMHAConfig.java +++ /dev/null @@ -1,34 +0,0 @@ -/* - * - * Copyright 2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.swagger1.configuration; - -import org.springframework.context.annotation.ComponentScan; -import org.springframework.context.annotation.Configuration; -import org.springframework.web.servlet.config.annotation.EnableWebMvc; -import springfox.documentation.swagger1.annotations.EnableSwagger; - -@Configuration -@EnableSwagger -@EnableWebMvc -@ComponentScan("springfox.documentation.spring.web.dummy") -public class MultipleRMHAConfig { - - -} diff --git a/springfox-swagger1/src/test/java/springfox/documentation/swagger1/configuration/SimpleBean.java b/springfox-swagger1/src/test/java/springfox/documentation/swagger1/configuration/SimpleBean.java deleted file mode 100644 index d6061323b8c..00000000000 --- a/springfox-swagger1/src/test/java/springfox/documentation/swagger1/configuration/SimpleBean.java +++ /dev/null @@ -1,44 +0,0 @@ -/* - * - * Copyright 2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.swagger1.configuration; - -public class SimpleBean { - private String aValue; - private String anotherValue; - - public SimpleBean() { - } - - public String getaValue() { - return aValue; - } - - public void setaValue(String aValue) { - this.aValue = aValue; - } - - public String getAnotherValue() { - return anotherValue; - } - - public void setAnotherValue(String anotherValue) { - this.anotherValue = anotherValue; - } -} diff --git a/springfox-swagger1/src/test/java/springfox/documentation/swagger1/models/ServiceWithAnnotationOnInterface.java b/springfox-swagger1/src/test/java/springfox/documentation/swagger1/models/ServiceWithAnnotationOnInterface.java deleted file mode 100644 index c1d739868db..00000000000 --- a/springfox-swagger1/src/test/java/springfox/documentation/swagger1/models/ServiceWithAnnotationOnInterface.java +++ /dev/null @@ -1,46 +0,0 @@ -/* - * - * Copyright 2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.swagger1.models; - -import io.swagger.annotations.ApiResponse; -import io.swagger.annotations.ApiResponses; -import org.springframework.http.HttpStatus; -import org.springframework.web.bind.annotation.ResponseStatus; - -public class ServiceWithAnnotationOnInterface { - - public static class SimpleServiceImpl implements SimpleService { - - @Override - public Object aMethod() { - return null; - } - } - - public interface SimpleService { - - @ResponseStatus(HttpStatus.CREATED) - @ApiResponses({ - @ApiResponse(code = 201, message = "201 Created") - }) - Object aMethod(); - } - -} diff --git a/springfox-swagger1/src/test/resources/avalue.properties b/springfox-swagger1/src/test/resources/avalue.properties deleted file mode 100644 index c4dce4ab8ed..00000000000 --- a/springfox-swagger1/src/test/resources/avalue.properties +++ /dev/null @@ -1 +0,0 @@ -com.yourapp.aValue=Some Value \ No newline at end of file diff --git a/springfox-swagger1/src/test/resources/custom-plugin-context.xml b/springfox-swagger1/src/test/resources/custom-plugin-context.xml deleted file mode 100644 index 6d35b978628..00000000000 --- a/springfox-swagger1/src/test/resources/custom-plugin-context.xml +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - - diff --git a/springfox-swagger1/src/test/resources/default-plugin-context.xml b/springfox-swagger1/src/test/resources/default-plugin-context.xml deleted file mode 100644 index 8e9ac5703d4..00000000000 --- a/springfox-swagger1/src/test/resources/default-plugin-context.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - diff --git a/springfox-swagger1/src/test/resources/handler-adapter-context.xml b/springfox-swagger1/src/test/resources/handler-adapter-context.xml deleted file mode 100644 index 00628456ce0..00000000000 --- a/springfox-swagger1/src/test/resources/handler-adapter-context.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - - - diff --git a/springfox-swagger1/src/test/resources/placeholders-adapter-context.xml b/springfox-swagger1/src/test/resources/placeholders-adapter-context.xml deleted file mode 100644 index 795d353720d..00000000000 --- a/springfox-swagger1/src/test/resources/placeholders-adapter-context.xml +++ /dev/null @@ -1,40 +0,0 @@ - - - - - - - - - - - - - - - - - diff --git a/springfox-swagger2/build.gradle b/springfox-swagger2/build.gradle index 20f9b0de680..83521853cc4 100644 --- a/springfox-swagger2/build.gradle +++ b/springfox-swagger2/build.gradle @@ -18,8 +18,6 @@ dependencies { api project(':springfox-schema') api project(':springfox-swagger-common') api project(':springfox-spring-web') - api project(':springfox-spring-webmvc') - api project(':springfox-spring-webflux') api libs.core api libs.spring @@ -35,18 +33,17 @@ dependencies { implementation "org.mapstruct:mapstruct:$mapstruct" annotationProcessor "org.mapstruct:mapstruct-processor:$mapstruct" - testImplementation project(':springfox-core') - testImplementation project(':springfox-core').sourceSets.test.output - testImplementation project(':springfox-schema').sourceSets.test.output - testImplementation project(':springfox-swagger-common').sourceSets.test.output - testImplementation project(':springfox-spring-web').sourceSets.test.output - testImplementation project(':springfox-spring-webmvc').sourceSets.test.output - testImplementation "jakarta.servlet:jakarta.servlet-api:$servlet" - testImplementation "org.springframework:spring-webflux:$springWeb" - testImplementation libs.springProvidedWithMvc - testImplementation libs.clientProvided - - testImplementation libs.test +// testImplementation project(':springfox-core') +// testImplementation project(':springfox-core').sourceSets.test.output +// testImplementation project(':springfox-schema').sourceSets.test.output +// testImplementation project(':springfox-swagger-common').sourceSets.test.output +// testImplementation project(':springfox-spring-web').sourceSets.test.output +// testImplementation "jakarta.servlet:jakarta.servlet-api:$servlet" +// testImplementation "org.springframework:spring-webflux:$springWeb" +// testImplementation libs.springProvidedWithMvc +// testImplementation libs.clientProvided +// +// testImplementation libs.test } @@ -55,4 +52,4 @@ compileJava { "-Amapstruct.defaultComponentModel=spring", "-Amapstruct.unmappedTargetPolicy=ERROR" ] -} \ No newline at end of file +} diff --git a/springfox-swagger2/gradle/wrapper/gradle-wrapper.jar b/springfox-swagger2/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..41d9927a4d4fb3f96a785543079b8df6723c946b GIT binary patch literal 59821 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 literal 0 HcmV?d00001 diff --git a/springfox-swagger2/gradle/wrapper/gradle-wrapper.properties b/springfox-swagger2/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 00000000000..41dfb87909a --- /dev/null +++ b/springfox-swagger2/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,5 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-7.4-bin.zip +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/springfox-swagger2/gradlew b/springfox-swagger2/gradlew new file mode 100755 index 00000000000..1b6c787337f --- /dev/null +++ b/springfox-swagger2/gradlew @@ -0,0 +1,234 @@ +#!/bin/sh + +# +# Copyright © 2015-2021 the original authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +############################################################################## +# +# Gradle start up script for POSIX generated by Gradle. +# +# Important for running: +# +# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is +# noncompliant, but you have some other compliant shell such as ksh or +# bash, then to run this script, type that shell name before the whole +# command line, like: +# +# ksh Gradle +# +# Busybox and similar reduced shells will NOT work, because this script +# requires all of these POSIX shell features: +# * functions; +# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», +# «${var#prefix}», «${var%suffix}», and «$( cmd )»; +# * compound commands having a testable exit status, especially «case»; +# * various built-in commands including «command», «set», and «ulimit». +# +# Important for patching: +# +# (2) This script targets any POSIX shell, so it avoids extensions provided +# by Bash, Ksh, etc; in particular arrays are avoided. +# +# The "traditional" practice of packing multiple parameters into a +# space-separated string is a well documented source of bugs and security +# problems, so this is (mostly) avoided, by progressively accumulating +# options in "$@", and eventually passing that to Java. +# +# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, +# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; +# see the in-line comments for details. +# +# There are tweaks for specific operating systems such as AIX, CygWin, +# Darwin, MinGW, and NonStop. +# +# (3) This script is generated from the Groovy template +# https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# within the Gradle project. +# +# You can find Gradle at https://github.com/gradle/gradle/. +# +############################################################################## + +# Attempt to set APP_HOME + +# Resolve links: $0 may be a link +app_path=$0 + +# Need this for daisy-chained symlinks. +while + APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path + [ -h "$app_path" ] +do + ls=$( ls -ld "$app_path" ) + link=${ls#*' -> '} + case $link in #( + /*) app_path=$link ;; #( + *) app_path=$APP_HOME$link ;; + esac +done + +APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit + +APP_NAME="Gradle" +APP_BASE_NAME=${0##*/} + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD=maximum + +warn () { + echo "$*" +} >&2 + +die () { + echo + echo "$*" + echo + exit 1 +} >&2 + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "$( uname )" in #( + CYGWIN* ) cygwin=true ;; #( + Darwin* ) darwin=true ;; #( + MSYS* | MINGW* ) msys=true ;; #( + NONSTOP* ) nonstop=true ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD=$JAVA_HOME/jre/sh/java + else + JAVACMD=$JAVA_HOME/bin/java + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD=java + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then + case $MAX_FD in #( + max*) + MAX_FD=$( ulimit -H -n ) || + warn "Could not query maximum file descriptor limit" + esac + case $MAX_FD in #( + '' | soft) :;; #( + *) + ulimit -n "$MAX_FD" || + warn "Could not set maximum file descriptor limit to $MAX_FD" + esac +fi + +# Collect all arguments for the java command, stacking in reverse order: +# * args from the command line +# * the main class name +# * -classpath +# * -D...appname settings +# * --module-path (only if needed) +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. + +# For Cygwin or MSYS, switch paths to Windows format before running java +if "$cygwin" || "$msys" ; then + APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) + CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) + + JAVACMD=$( cygpath --unix "$JAVACMD" ) + + # Now convert the arguments - kludge to limit ourselves to /bin/sh + for arg do + if + case $arg in #( + -*) false ;; # don't mess with options #( + /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath + [ -e "$t" ] ;; #( + *) false ;; + esac + then + arg=$( cygpath --path --ignore --mixed "$arg" ) + fi + # Roll the args list around exactly as many times as the number of + # args, so each arg winds up back in the position where it started, but + # possibly modified. + # + # NB: a `for` loop captures its iteration list before it begins, so + # changing the positional parameters here affects neither the number of + # iterations, nor the values presented in `arg`. + shift # remove old arg + set -- "$@" "$arg" # push replacement arg + done +fi + +# Collect all arguments for the java command; +# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of +# shell script including quotes and variable substitutions, so put them in +# double quotes to make sure that they get re-expanded; and +# * put everything else in single quotes, so that it's not re-expanded. + +set -- \ + "-Dorg.gradle.appname=$APP_BASE_NAME" \ + -classpath "$CLASSPATH" \ + org.gradle.wrapper.GradleWrapperMain \ + "$@" + +# Use "xargs" to parse quoted args. +# +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# + +eval "set -- $( + printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | + xargs -n1 | + sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | + tr '\n' ' ' + )" '"$@"' + +exec "$JAVACMD" "$@" diff --git a/springfox-swagger2/gradlew.bat b/springfox-swagger2/gradlew.bat new file mode 100644 index 00000000000..ac1b06f9382 --- /dev/null +++ b/springfox-swagger2/gradlew.bat @@ -0,0 +1,89 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto execute + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/springfox-spring-webflux/src/main/java/springfox/documentation/spring/web/OnReactiveWebApplication.java b/springfox-swagger2/src/main/java/springfox/documentation/spring/web/OnReactiveWebApplication.java similarity index 100% rename from springfox-spring-webflux/src/main/java/springfox/documentation/spring/web/OnReactiveWebApplication.java rename to springfox-swagger2/src/main/java/springfox/documentation/spring/web/OnReactiveWebApplication.java diff --git a/springfox-spring-webmvc/src/main/java/springfox/documentation/spring/web/OnServletBasedWebApplication.java b/springfox-swagger2/src/main/java/springfox/documentation/spring/web/OnServletBasedWebApplication.java similarity index 100% rename from springfox-spring-webmvc/src/main/java/springfox/documentation/spring/web/OnServletBasedWebApplication.java rename to springfox-swagger2/src/main/java/springfox/documentation/spring/web/OnServletBasedWebApplication.java diff --git a/springfox-spring-webflux/src/main/java/springfox/documentation/spring/web/SpringfoxWebFluxConfiguration.java b/springfox-swagger2/src/main/java/springfox/documentation/spring/web/SpringfoxWebFluxConfiguration.java similarity index 99% rename from springfox-spring-webflux/src/main/java/springfox/documentation/spring/web/SpringfoxWebFluxConfiguration.java rename to springfox-swagger2/src/main/java/springfox/documentation/spring/web/SpringfoxWebFluxConfiguration.java index fa55eed3873..9f6b021d6a4 100644 --- a/springfox-spring-webflux/src/main/java/springfox/documentation/spring/web/SpringfoxWebFluxConfiguration.java +++ b/springfox-swagger2/src/main/java/springfox/documentation/spring/web/SpringfoxWebFluxConfiguration.java @@ -42,4 +42,4 @@ public static WebFluxObjectMapperConfigurer webFluxObjectMapperConfigurer() { public DefaultsProviderPlugin webfluxDefaults(TypeResolver typeResolver) { return new WebfluxDefaultsProvider(typeResolver); } -} \ No newline at end of file +} diff --git a/springfox-spring-webmvc/src/main/java/springfox/documentation/spring/web/SpringfoxWebMvcConfiguration.java b/springfox-swagger2/src/main/java/springfox/documentation/spring/web/SpringfoxWebMvcConfiguration.java similarity index 99% rename from springfox-spring-webmvc/src/main/java/springfox/documentation/spring/web/SpringfoxWebMvcConfiguration.java rename to springfox-swagger2/src/main/java/springfox/documentation/spring/web/SpringfoxWebMvcConfiguration.java index 5bf2db83419..abf1279c650 100644 --- a/springfox-spring-webmvc/src/main/java/springfox/documentation/spring/web/SpringfoxWebMvcConfiguration.java +++ b/springfox-swagger2/src/main/java/springfox/documentation/spring/web/SpringfoxWebMvcConfiguration.java @@ -36,4 +36,4 @@ public class SpringfoxWebMvcConfiguration { public static WebMvcObjectMapperConfigurer webMvcObjectMapperConfigurer() { return new WebMvcObjectMapperConfigurer(); } -} \ No newline at end of file +} diff --git a/springfox-spring-webflux/src/main/java/springfox/documentation/spring/web/WebFluxObjectMapperConfigurer.java b/springfox-swagger2/src/main/java/springfox/documentation/spring/web/WebFluxObjectMapperConfigurer.java similarity index 100% rename from springfox-spring-webflux/src/main/java/springfox/documentation/spring/web/WebFluxObjectMapperConfigurer.java rename to springfox-swagger2/src/main/java/springfox/documentation/spring/web/WebFluxObjectMapperConfigurer.java diff --git a/springfox-spring-webmvc/src/main/java/springfox/documentation/spring/web/WebMvcObjectMapperConfigurer.java b/springfox-swagger2/src/main/java/springfox/documentation/spring/web/WebMvcObjectMapperConfigurer.java similarity index 100% rename from springfox-spring-webmvc/src/main/java/springfox/documentation/spring/web/WebMvcObjectMapperConfigurer.java rename to springfox-swagger2/src/main/java/springfox/documentation/spring/web/WebMvcObjectMapperConfigurer.java diff --git a/springfox-spring-webflux/src/main/java/springfox/documentation/spring/web/plugins/WebfluxDefaultsProvider.java b/springfox-swagger2/src/main/java/springfox/documentation/spring/web/plugins/WebfluxDefaultsProvider.java similarity index 100% rename from springfox-spring-webflux/src/main/java/springfox/documentation/spring/web/plugins/WebfluxDefaultsProvider.java rename to springfox-swagger2/src/main/java/springfox/documentation/spring/web/plugins/WebfluxDefaultsProvider.java diff --git a/springfox-swagger2/src/test/groovy/springfox/documentation/swagger2/configuration/PropertyExampleSerializerMixinSpec.groovy b/springfox-swagger2/src/test/groovy/springfox/documentation/swagger2/configuration/PropertyExampleSerializerMixinSpec.groovy deleted file mode 100644 index b653b0aeda5..00000000000 --- a/springfox-swagger2/src/test/groovy/springfox/documentation/swagger2/configuration/PropertyExampleSerializerMixinSpec.groovy +++ /dev/null @@ -1,41 +0,0 @@ -package springfox.documentation.swagger2.configuration - -import com.fasterxml.jackson.core.JsonGenerator -import com.fasterxml.jackson.databind.SerializerProvider -import io.swagger.models.properties.Property -import spock.lang.Specification -import spock.lang.Unroll - - -class PropertyExampleSerializerMixinSpec extends Specification { - def "detects string literals correctly"() { - given: - def property = Mock(Property) - def generator = Mock(JsonGenerator) - def sut = new Swagger2JacksonModule.PropertyExampleSerializerMixin.PropertyExampleSerializer(clazz) - - when: - property.example >> example - - and: - sut.serialize(example, generator, Mock(SerializerProvider)) - - then: - noCallsToWriteString * generator.writeString(_) >> { args -> - assert args[0] == serializedExample - } - - where: - example | clazz | serializedExample | noCallsToWriteString - "true" | String | "" | 0 - "false" | String | "" | 0 - "123" | String | "" | 0 - "-123" | String | "" | 0 - "123.3" | String | "" | 0 - "'123'" | String | "123" | 1 - "\"123\"" | String | "123" | 1 - "test" | String | "test" | 1 - "" | String | "" | 1 - null | String | null | 0 - } -} diff --git a/springfox-swagger2/src/test/groovy/springfox/documentation/swagger2/configuration/Swagger2JacksonModuleSpec.groovy b/springfox-swagger2/src/test/groovy/springfox/documentation/swagger2/configuration/Swagger2JacksonModuleSpec.groovy deleted file mode 100644 index 3ba072a61f0..00000000000 --- a/springfox-swagger2/src/test/groovy/springfox/documentation/swagger2/configuration/Swagger2JacksonModuleSpec.groovy +++ /dev/null @@ -1,24 +0,0 @@ -package springfox.documentation.swagger2.configuration - -import com.fasterxml.jackson.databind.ObjectMapper -import io.swagger.models.Swagger -import spock.lang.Specification - -class Swagger2JacksonModuleSpec extends Specification { - def "should create serialization module"() { - ObjectMapper objectMapper = new ObjectMapper() - new Swagger2JacksonModule().maybeRegisterModule(objectMapper) - - expect: - objectMapper.findMixInClassFor(Swagger) != null - } - - def "should create serialization module only once"() { - ObjectMapper objectMapper = new ObjectMapper() - new Swagger2JacksonModule().maybeRegisterModule(objectMapper) - new Swagger2JacksonModule().maybeRegisterModule(objectMapper) - - expect: - objectMapper.findMixInClassFor(Swagger) != null - } -} diff --git a/springfox-swagger2/src/test/groovy/springfox/documentation/swagger2/mappers/ApiKeyAuthFactorySpec.groovy b/springfox-swagger2/src/test/groovy/springfox/documentation/swagger2/mappers/ApiKeyAuthFactorySpec.groovy deleted file mode 100644 index 156139a33fd..00000000000 --- a/springfox-swagger2/src/test/groovy/springfox/documentation/swagger2/mappers/ApiKeyAuthFactorySpec.groovy +++ /dev/null @@ -1,71 +0,0 @@ -/* - * - * Copyright 2015-2019 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ -package springfox.documentation.swagger2.mappers - -import io.swagger.models.auth.ApiKeyAuthDefinition -import io.swagger.models.auth.In -import spock.lang.Specification -import springfox.documentation.service.* - -class ApiKeyAuthFactorySpec extends Specification { - - def "Create ApiKey scheme definition"() { - given: - SecurityScheme security = new ApiKey("mykey", "key1", "header", amazonVendorExtensions()) - and: - ApiKeyAuthFactory factory = new ApiKeyAuthFactory() - when: - def securityDefinition = factory.create(security) - then: - securityDefinition.type == "apiKey" - ((ApiKeyAuthDefinition)securityDefinition).getName() == "key1" - ((ApiKeyAuthDefinition)securityDefinition).getIn() == In.HEADER - ((ApiKeyAuthDefinition)securityDefinition).vendorExtensions == expectedExtensions() - } - - def amazonVendorExtensions( - String authorizerKey = 'x-amazon-apigateway-authorizer', - String authTypeKey = 'x-amazon-apigateway-authtype') { - - def authorizer = new ObjectVendorExtension(authorizerKey) - def arns = new ListVendorExtension( - "providerARNS", - ["arn:aws:cognito-idp:{region}:{account_id}:userpool/{user_pool_id}"]) - authorizer.with { - addProperty(new StringVendorExtension("type", "cognito_user_pools")) - addProperty(arns) - } - - def authType = new StringVendorExtension(authTypeKey, 'cognito_user_pools') - def vendorExtensions = [authType, authorizer] - vendorExtensions - } - - def expectedExtensions() { - [ - "x-amazon-apigateway-authtype" : "cognito_user_pools", - "x-amazon-apigateway-authorizer": [ - "type" : "cognito_user_pools", - "providerARNS": [ - "arn:aws:cognito-idp:{region}:{account_id}:userpool/{user_pool_id}" - ] - ] - ] - } -} \ No newline at end of file diff --git a/springfox-swagger2/src/test/groovy/springfox/documentation/swagger2/mappers/EnumMapperSpec.groovy b/springfox-swagger2/src/test/groovy/springfox/documentation/swagger2/mappers/EnumMapperSpec.groovy deleted file mode 100644 index dd8c3910da6..00000000000 --- a/springfox-swagger2/src/test/groovy/springfox/documentation/swagger2/mappers/EnumMapperSpec.groovy +++ /dev/null @@ -1,142 +0,0 @@ -/* - * - * Copyright 2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ -package springfox.documentation.swagger2.mappers - -import io.swagger.models.parameters.QueryParameter -import io.swagger.models.properties.ArrayProperty -import io.swagger.models.properties.DoubleProperty -import io.swagger.models.properties.FloatProperty -import io.swagger.models.properties.IntegerProperty -import io.swagger.models.properties.LongProperty -import io.swagger.models.properties.StringProperty -import spock.lang.Specification -import spock.lang.Unroll -import springfox.documentation.service.AllowableListValues -import springfox.documentation.service.AllowableRangeValues - -import static springfox.documentation.swagger2.mappers.EnumMapper.* - -class EnumMapperSpec extends Specification { - @Unroll("#property.class.simpleName") - def "adds enum values for numeric properties"() { - when: - maybeAddAllowableValues(property, allowableValues) - then: - if (allowableValues instanceof AllowableListValues) { - assert property.enum.size() == expectedSize - } else if (allowableValues instanceof AllowableRangeValues) { - assert property.minimum == 1D - assert property.exclusiveMinimum == null - assert property.maximum == 2D - assert property.exclusiveMaximum == null - } else { - assert property.enum == null - } - where: - property | expectedSize | allowableValues - new IntegerProperty() | 0 | new AllowableListValues(["A", "B", "C"], "List") - new LongProperty() | 0 | new AllowableListValues(["A", "B", "C"], "List") - new DoubleProperty() | 0 | new AllowableListValues(["A", "B", "C"], "List") - new FloatProperty() | 0 | new AllowableListValues(["A", "B", "C"], "List") - new IntegerProperty() | 3 | new AllowableListValues(["1", "2", "3"], "List") - new LongProperty() | 3 | new AllowableListValues(["1", "2", "3"], "List") - new DoubleProperty() | 3 | new AllowableListValues(["1", "2", "3"], "List") - new FloatProperty() | 3 | new AllowableListValues(["1", "2", "3"], "List") - new IntegerProperty() | 0 | new AllowableRangeValues("1", "2") - new LongProperty() | 0 | new AllowableRangeValues("1", "2") - new DoubleProperty() | 0 | new AllowableRangeValues("1", "2") - new FloatProperty() | 0 | new AllowableRangeValues("1", "2") - new IntegerProperty() | 0 | null - new LongProperty() | 0 | null - new DoubleProperty() | 0 | null - new FloatProperty() | 0 | null - } - - @Unroll("Exclusive #property.class.simpleName") - def "adds enum values with exclusive for numeric properties"() { - when: - maybeAddAllowableValues(property, allowableValues) - then: - property.minimum == expMin - property.exclusiveMinimum == expExlMin - property.maximum == expMax - property.exclusiveMaximum == expExlMax - where: - property | expMin | expMax | expExlMin | expExlMax | allowableValues - new IntegerProperty() | 1 | 7 | true | true | new AllowableRangeValues("1", true, "7", true) - new LongProperty() | 2 | 8 | false | false | new AllowableRangeValues("2", false, "8", false) - new DoubleProperty() | 3 | 9 | false | true | new AllowableRangeValues("3", false, "9", true) - new FloatProperty() | 4 | 10 | true | false | new AllowableRangeValues("4", true, "10", false) - } - - @Unroll("Exclusive #property.class.simpleName") - def "adds enum values with exclusive for array properties"() { - when: - maybeAddAllowableValues(property, allowableValues) - then: - property.minItems == expMinItems - property.maxItems == expMaxItems - where: - property | expMinItems | expMaxItems | allowableValues - new ArrayProperty() | 1 | 7 | new AllowableRangeValues("1", null, "7", null) - new ArrayProperty() | 1 | 7 | new AllowableRangeValues("1", true, "7", false) - new ArrayProperty() | 2 | 8 | new AllowableRangeValues("2", null, "8", null) - } - - @Unroll("#allowableValues?.class.simpleName") - def "adds enum values for parameters"() { - when: - maybeAddAllowableValuesToParameter(parameter, property, allowableValues) - then: - if (allowableValues instanceof AllowableListValues) { - assert parameter.enum.size() == expectedSize - } else if (allowableValues instanceof AllowableRangeValues) { - if (property instanceof StringProperty) { - verifyAll { - parameter.minLength == safeInteger(allowableValues.min) - parameter.maxLength == safeInteger(allowableValues.max) - } - } else { - verifyAll { - parameter.minimum == safeBigDecimal(allowableValues.min) - parameter.exclusiveMinimum == allowableValues.exclusiveMin - parameter.maximum == safeBigDecimal(allowableValues.max) - parameter.exclusiveMaximum == allowableValues.exclusiveMax - } - } - } else { - assert parameter.enum == null - } - where: - parameter | expectedSize | property | allowableValues - new QueryParameter() | 3 | new StringProperty() | new AllowableListValues(["A", "B", "C"], "List") - new QueryParameter() | 3 | new StringProperty() | new AllowableListValues(["1", "2", "3"], "List") - new QueryParameter() | 0 | new StringProperty() | new AllowableRangeValues("1", "2") - new QueryParameter() | 0 | new StringProperty() | new AllowableRangeValues("A", "B") - new QueryParameter() | 0 | new StringProperty() | new AllowableRangeValues("1", true, "B", false) - new QueryParameter() | 0 | new StringProperty() | null - new QueryParameter() | 3 | new IntegerProperty() | new AllowableListValues(["A", "B", "C"], "List") - new QueryParameter() | 3 | new IntegerProperty() | new AllowableListValues(["1", "2", "3"], "List") - new QueryParameter() | 0 | new IntegerProperty() | new AllowableRangeValues("1", "2") - new QueryParameter() | 0 | new IntegerProperty() | new AllowableRangeValues("A", "B") - new QueryParameter() | 0 | new IntegerProperty() | new AllowableRangeValues("1", true, "B", false) - new QueryParameter() | 0 | new IntegerProperty() | null - } - -} diff --git a/springfox-swagger2/src/test/groovy/springfox/documentation/swagger2/mappers/ExamplesMapperSpec.groovy b/springfox-swagger2/src/test/groovy/springfox/documentation/swagger2/mappers/ExamplesMapperSpec.groovy deleted file mode 100644 index 9bbe0d4eeac..00000000000 --- a/springfox-swagger2/src/test/groovy/springfox/documentation/swagger2/mappers/ExamplesMapperSpec.groovy +++ /dev/null @@ -1,74 +0,0 @@ -/* - * - * Copyright 2017-2019 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ -package springfox.documentation.swagger2.mappers - -import spock.lang.Specification -import springfox.documentation.schema.Example - -class ExamplesMapperSpec extends Specification { - def "examples are mapped correctly"() { - given: - def mediaType = "mediaType" - def value = "value" - def examples = new ArrayList<>() - examples.add(new Example(mediaType, value)) - - when: - def sut = new ExamplesMapper() - - then: - def mapped = sut.mapExamples(examples) - - and: - mapped.size() == 1 - mapped.get(mediaType) == value - } - - def "null mediaType is converted to empty string"() { - given: - def mediaType = null - def value = "value" - def examples = new ArrayList<>() - examples.add(new Example(mediaType, value)) - - when: - def sut = new ExamplesMapper() - - then: - def mapped = sut.mapExamples(examples) - - and: - mapped.size() == 1 - mapped.get("") == value - } - - def "empty example list maps to empty map"() { - given: - def examples = new ArrayList<>() - - when: - def sut = new ExamplesMapper() - - then: - def mapped = sut.mapExamples(examples) - - and: - mapped.size() == 0 - } -} diff --git a/springfox-swagger2/src/test/groovy/springfox/documentation/swagger2/mappers/LicenseMapperSpec.groovy b/springfox-swagger2/src/test/groovy/springfox/documentation/swagger2/mappers/LicenseMapperSpec.groovy deleted file mode 100644 index 47985b6c411..00000000000 --- a/springfox-swagger2/src/test/groovy/springfox/documentation/swagger2/mappers/LicenseMapperSpec.groovy +++ /dev/null @@ -1,42 +0,0 @@ -package springfox.documentation.swagger2.mappers - -import spock.lang.Specification -import springfox.documentation.builders.ApiInfoBuilder -import springfox.documentation.service.ApiInfo - -class LicenseMapperSpec extends Specification { - def "License is mapped from ApiInfo" () { - given: - def apiInfo = ApiInfo.DEFAULT - and: - def sut = new LicenseMapper() - when: - def mapped = sut.apiInfoToLicense(apiInfo) - then: - mapped.name == apiInfo.license - mapped.url == apiInfo.licenseUrl - } - - def "No license is mapped when ApiInfo contains no license info" () { - given: - def apiInfo = new ApiInfoBuilder().title("Api Documentation").version("1.0").build(); - and: - def sut = new LicenseMapper() - when: - def mapped = sut.apiInfoToLicense(apiInfo) - then: - mapped == null - } - - def "License is mapped when ApiInfo contains license url only" () { - given: - def apiInfo = new ApiInfoBuilder().title("Api Documentation").version("1.0") - .licenseUrl("http://www.apache.org/licenses/LICENSE-2.0").build(); - and: - def sut = new LicenseMapper() - when: - def mapped = sut.apiInfoToLicense(apiInfo) - then: - mapped.url == apiInfo.licenseUrl - } -} diff --git a/springfox-swagger2/src/test/groovy/springfox/documentation/swagger2/mappers/MapperSupport.groovy b/springfox-swagger2/src/test/groovy/springfox/documentation/swagger2/mappers/MapperSupport.groovy deleted file mode 100644 index c17347dc3a4..00000000000 --- a/springfox-swagger2/src/test/groovy/springfox/documentation/swagger2/mappers/MapperSupport.groovy +++ /dev/null @@ -1,36 +0,0 @@ -package springfox.documentation.swagger2.mappers - -import org.mapstruct.factory.Mappers - -trait MapperSupport { - CompatibilityModelMapper model() { - Mappers.getMapper(CompatibilityModelMapper) - } - - ParameterMapper parameter() { - Mappers.getMapper(ParameterMapper) - } - - SecurityMapper security() { - Mappers.getMapper(SecurityMapper) - } - - LicenseMapper license() { - Mappers.getMapper(LicenseMapper) - } - - VendorExtensionsMapper vendorExtensions() { - Mappers.getMapper(VendorExtensionsMapper) - } - - ServiceModelToSwagger2Mapper swagger2Mapper() { - def swagger2 = Mappers.getMapper(ServiceModelToSwagger2Mapper) - swagger2.compatibilityModelMapper = model() - swagger2.securityMapper = security() - swagger2.licenseMapper = license() - swagger2.vendorExtensionsMapper = vendorExtensions() - swagger2.useModelV3 = true - swagger2 - } - -} \ No newline at end of file diff --git a/springfox-swagger2/src/test/groovy/springfox/documentation/swagger2/mappers/ModelMapperSpec.groovy b/springfox-swagger2/src/test/groovy/springfox/documentation/swagger2/mappers/ModelMapperSpec.groovy deleted file mode 100644 index b216fd4ca0a..00000000000 --- a/springfox-swagger2/src/test/groovy/springfox/documentation/swagger2/mappers/ModelMapperSpec.groovy +++ /dev/null @@ -1,536 +0,0 @@ -/* - * - * Copyright 2015-2019 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ -package springfox.documentation.swagger2.mappers - -import com.fasterxml.classmate.ResolvedType -import com.fasterxml.classmate.TypeResolver -import com.fasterxml.classmate.types.ResolvedObjectType -import io.swagger.models.properties.AbstractNumericProperty -import io.swagger.models.properties.ObjectProperty -import io.swagger.models.properties.RefProperty -import io.swagger.models.properties.StringProperty -import org.mapstruct.factory.Mappers -import spock.lang.Shared -import spock.lang.Unroll -import springfox.documentation.builders.ModelBuilder -import springfox.documentation.builders.ModelPropertyBuilder -import springfox.documentation.schema.CodeGenGenericTypeNamingStrategy -import springfox.documentation.schema.Model -import springfox.documentation.schema.ModelProperty -import springfox.documentation.schema.ModelRef -import springfox.documentation.schema.ModelReference -import springfox.documentation.schema.SchemaSpecification -import springfox.documentation.schema.SimpleType -import springfox.documentation.service.AllowableRangeValues -import springfox.documentation.spi.DocumentationType - -import java.util.function.Function -import java.util.stream.Collectors - -import static java.util.Collections.* -import static springfox.documentation.schema.ResolvedTypes.* -import static springfox.documentation.spi.schema.contexts.ModelContext.* -import static springfox.documentation.swagger2.mappers.ModelMapper.* - -class ModelMapperSpec extends SchemaSpecification { - - @Shared def namingStrategy = new CodeGenGenericTypeNamingStrategy() - @Shared def resolver = new TypeResolver() - - def getIds = new Function() { - String apply(Model model) { - return model.getId() - } - } - - def "models are serialized correctly"() { - given: - Model model = modelProvider.modelFor( - inputParam( - "0_0", - "group", - resolver.resolve(typeToTest), - Optional.empty(), - new HashSet<>(), - DocumentationType.SWAGGER_2, - alternateTypeProvider(), - namingStrategy, - emptySet())).get() - def modelMap = new HashMap<>() - - and: - modelMap.put("test", model) - - when: - def mapped = Mappers.getMapper(ModelMapper).mapModels(modelMap) - - then: - mapped.containsKey("test") - - and: - def mappedModel = mapped.get("test") - mappedModel.properties.size() == model.properties.size() - - where: - typeToTest << [simpleType(), mapsContainer(), enumType(), typeWithLists()] - } - - def "void properties or collection of voids are filtered in the model"() { - given: - Model model = modelProvider.modelFor( - inputParam( - "0_0", - "group", - resolver.resolve(typeWithVoidLists()), - Optional.empty(), - new HashSet<>(), - DocumentationType.SWAGGER_2, - alternateTypeProvider(), - namingStrategy, - emptySet())) - .get() - def modelMap = new HashMap<>() - - and: - modelMap.put("test", model) - - when: - def mapped = Mappers.getMapper(ModelMapper).mapModels(modelMap) - - then: - def mappedModel = mapped.get("test") - model.properties.size() == 3 - mappedModel.properties == null - } - - def "model dependences are inferred correctly for list of map of string to string"() { - given: - Map modelMap = modelProvider.dependencies( - inputParam( - "0_0", - "group", - resolver.resolve(listOfMapOfStringToString()), - Optional.empty(), - new HashSet<>(), - DocumentationType.SWAGGER_2, - alternateTypeProvider(), - namingStrategy, - emptySet())) - - when: - def mapped = Mappers.getMapper(ModelMapper) - .mapModels(modelMap.values().stream() - .collect(Collectors.toMap(getIds, - Function.identity()))) - - - then: - mapped.containsKey("java.util.Map") - and: - def mappedModel = mapped.get("java.util.Map") - mappedModel.name == "MapOfstringAndstring" - mappedModel.additionalProperties instanceof StringProperty - } - - def "model dependencies are inferred correctly for list of ModelMap"() { - given: - Map modelMap = modelProvider.dependencies( - inputParam( - "0_0", - "group", - resolver.resolve(listOfModelMap()), - Optional.empty(), - new HashSet<>(), - DocumentationType.SWAGGER_2, - alternateTypeProvider(), - namingStrategy, - emptySet())) - - when: - def mapped = Mappers.getMapper(ModelMapper).mapModels(modelMap.values().stream() - .collect(Collectors.toMap(getIds, - Function.identity()))) - - then: - mapped.containsKey("org.springframework.ui.ModelMap") - and: - def mappedModel = mapped.get("org.springframework.ui.ModelMap") - mappedModel.name == "ModelMap" - mappedModel.additionalProperties instanceof ObjectProperty - - } - - def "model dependencies are inferred correctly for list of map of string to Simpletype"() { - given: - Map modelMap = modelProvider.dependencies( - inputParam( - "0_0", - "group", - resolver.resolve(listOfMapOfStringToSimpleType()), - Optional.empty(), - new HashSet<>(), - DocumentationType.SWAGGER_2, - alternateTypeProvider(), - namingStrategy, - emptySet())) - - when: - def mapped = Mappers.getMapper(ModelMapper).mapModels(modelMap.values().stream() - .collect(Collectors.toMap(getIds, - Function.identity()))) - - then: - mapped.containsKey("java.util.Map") - mapped.containsKey("springfox.documentation.schema.SimpleType") - and: - def mappedModel = mapped.get("java.util.Map") - mappedModel.name == "MapOfstringAndSimpleType" - mappedModel.additionalProperties instanceof RefProperty - - } - - def "model dependencies are inferred correctly for list of erased map"() { - given: - Map modelMap = modelProvider.dependencies( - inputParam( - "0_0", - "group", - resolver.resolve(listOfErasedMap()), - Optional.empty(), - new HashSet<>(), - DocumentationType.SWAGGER_2, - alternateTypeProvider(), - namingStrategy, - emptySet())) - - when: - def mapped = Mappers.getMapper(ModelMapper).mapModels(modelMap) - - then: - mapped.size() == 0 - } - - def "when the source models contain a property that has a generic type with one of the type bindings as Void"() { - given: - Model model = modelProvider.modelFor( - inputParam( - "0_0", - "group", - resolver.resolve(genericClassOfType(Void)), - Optional.empty(), - new HashSet<>(), - DocumentationType.SWAGGER_2, - alternateTypeProvider(), - namingStrategy, - emptySet())).get() - def modelMap = new HashMap<>() - - and: - modelMap.put("test", model) - - when: - def mapped = Mappers.getMapper(ModelMapper).mapModels(modelMap) - - then: - mapped.containsKey("test") - - and: - def mappedModel = mapped.get("test") - mappedModel.properties.size() == (model.properties.size() - 1) - !mappedModel.properties.containsKey("genericField") - } - - def "when the source models map is null"() { - given: - def modelMap = null - - when: - def mapped = Mappers.getMapper(ModelMapper).mapModels(modelMap) - - then: - mapped == null - } - - def "models with allowable ranges are serialized correctly"() { - given: - Model model = modelProvider.modelFor( - inputParam( - "0_0", - "group", - resolver.resolve(simpleType()), - Optional.empty(), - new HashSet<>(), - DocumentationType.SWAGGER_2, - alternateTypeProvider(), - namingStrategy, - emptySet())).get() - def modelMap = new HashMap<>() - - and: - modelMap.put("test", model) - - and: "we add a fake allowable range" - def intObject = model.properties.get("anObjectInt") - def properties = new HashMap(model.properties) - properties.put("anObjectInt", updatedIntObject(intObject)) - model = new ModelBuilder(model).properties(properties).build() - modelMap.put("test", model) - - when: - def mapped = Mappers.getMapper(ModelMapper).mapModels(modelMap) - - then: - mapped.containsKey("test") - - and: "Required values contains the modified property" - def mappedModel = mapped.get("test") - mappedModel.properties.size() == model.properties.size() - mappedModel.getRequired().size() == 1 - mappedModel.getRequired().contains("anObjectInt") - - and: "Range expectations are mapped correctly" - def mappedIntObject = mappedModel.properties.get("anObjectInt") - ((AbstractNumericProperty) mappedIntObject).minimum == 1 - ((AbstractNumericProperty) mappedIntObject).maximum == 2000 - } - - def "Properties that are Map subclasses that close closed generic types are supported"() { - given: - def model = Mock(Model) - - and: - model.type >> customMapOfType(SimpleType) - - when: - def valueClass = Mappers.getMapper(ModelMapper).typeOfValue(model) - - then: - valueClass.isPresent() - valueClass.get() == SimpleType - } - - def "Properties that are Map subclasses that close the open generic types are supported"() { - given: - def model = Mock(Model) - - and: - model.type >> customMapOpen() - - when: - def valueClass = Mappers.getMapper(ModelMapper).typeOfValue(model) - - then: - valueClass.isPresent() - valueClass.get() == Object - } - - def "Properties that are not maps will have the value class absent"() { - given: - def model = Mock(Model) - - and: - model.type >> genericClassWithTypeErased() - - when: - def valueClass = Mappers.getMapper(ModelMapper).typeOfValue(model) - - then: - !valueClass.isPresent() - } - - @Unroll - def "safe parses #stringValue"() { - when: - def safeParsed = safeInteger(stringValue) - - then: - safeParsed == expected - - where: - stringValue | expected - "0" | 0 - "infinity" | null - "-infinity" | null - "1.0" | null - - } - - - ModelProperty updatedIntObject(ModelProperty modelProperty) { - ModelPropertyBuilder builder = new ModelPropertyBuilder() - def newModel = builder - .allowableValues(new AllowableRangeValues("1", "2000")) - .description(modelProperty.description) - .isHidden(modelProperty.hidden) - .required(true) - .name(modelProperty.name) - .position(modelProperty.position) - .type(modelProperty.type) - .example(modelProperty.example) - .xml(modelProperty.xml) - .build() - newModel.updateModelRef(createFactory(modelProperty)) - } - - - def "models with allowable ranges are serialized correctly for string property"() { - given: - Model model = modelProvider.modelFor( - inputParam( - "0_0", - "group", - resolver.resolve(simpleType()), - Optional.empty(), - new HashSet<>(), - DocumentationType.SWAGGER_2, - alternateTypeProvider(), - namingStrategy, - emptySet())).get() - def modelMap = new HashMap<>() - - and: - modelMap.put("test", model) - - and: "we add a fake allowable range" - def stringObject = model.properties.get("aString") - def properties = new HashMap(model.properties) - properties.put("aString", updatedStringObject(stringObject)) - model = new ModelBuilder(model).properties(properties).build() - modelMap.put("test", model) - - when: - def mapped = Mappers.getMapper(ModelMapper).mapModels(modelMap) - - then: - mapped.containsKey("test") - - and: "Required values contains the modified property" - def mappedModel = mapped.get("test") - mappedModel.properties.size() == model.properties.size() - mappedModel.getRequired().size() == 1 - mappedModel.getRequired().contains("aString") - - and: "Range expectations are mapped correctly" - def mappedStringObject = mappedModel.properties.get("aString") - ((StringProperty) mappedStringObject).minLength == 1 - ((StringProperty) mappedStringObject).maxLength == 255 - } - - ModelProperty updatedStringObject(ModelProperty modelProperty) { - ModelPropertyBuilder builder = new ModelPropertyBuilder() - def newModel = builder - .allowableValues(new AllowableRangeValues("1", "255")) - .description(modelProperty.description) - .isHidden(modelProperty.hidden) - .required(true) - .name(modelProperty.name) - .position(modelProperty.position) - .type(modelProperty.type) - .build() - newModel.updateModelRef(createFactory(modelProperty)) - } - - def "model property positions affect the serialization order"() { - given: - def properties = [ - 'a': createModelPropertyWithPosition('a', 3), - 'b': createModelPropertyWithPosition('b', 2), - 'c': createModelPropertyWithPosition('c', 1), - 'd': createModelPropertyWithPosition('d', 0), - 'e': createModelPropertyWithPosition('e', 4), - ] - Model model = createModel(properties) - - when: - def mapped = Mappers.getMapper(ModelMapper).mapModels([test: model]) - - then: - mapped != null - ['d', 'c', 'b', 'a', 'e'] == mapped['test'].properties.keySet().toList() - } - - def "model property positions affect the serialization order with same positions"() { - given: - def properties = [ - 'a': createModelPropertyWithPosition('a', 0), - 'b': createModelPropertyWithPosition('b', 0), - 'c': createModelPropertyWithPosition('c', 0), - 'd': createModelPropertyWithPosition('d', 0), - 'e': createModelPropertyWithPosition('e', 0), - ] - Model model = createModel(properties) - - when: - def mapped = Mappers.getMapper(ModelMapper).mapModels([test: model]) - - then: - mapped != null - ['a', 'b', 'c', 'd', 'e'] == mapped['test'].properties.keySet().toList() - } - - ModelProperty createModelPropertyWithPosition(String name, int position) { - def stringProperty = resolver.resolve(String) - new ModelProperty( - name, - resolver.resolve(stringProperty), - simpleQualifiedTypeName(stringProperty), - position, - false, - false, - false, - false, - '', - null, - '', - '', - '', - null, - [] - ).with { - it.updateModelRef({ rt -> new ModelRef(simpleQualifiedTypeName(stringProperty)) }) - it - } - } - - Model createModel(properties) { - def modelType = typeForTestingPropertyPositions() - def model = new Model( - 'test', - 'test', - modelType, - simpleQualifiedTypeName(modelType), - properties, - '', - '', - '', - null, - '', - null) - model - } - - Function createFactory(ModelProperty modelProperty) { - new Function() { - @Override - ModelReference apply(ResolvedObjectType type) { - return modelProperty.getModelRef() - } - } - } -} diff --git a/springfox-swagger2/src/test/groovy/springfox/documentation/swagger2/mappers/OAuth2AuthFactorySpec.groovy b/springfox-swagger2/src/test/groovy/springfox/documentation/swagger2/mappers/OAuth2AuthFactorySpec.groovy deleted file mode 100644 index e0e37ab3d61..00000000000 --- a/springfox-swagger2/src/test/groovy/springfox/documentation/swagger2/mappers/OAuth2AuthFactorySpec.groovy +++ /dev/null @@ -1,79 +0,0 @@ -package springfox.documentation.swagger2.mappers - -import io.swagger.models.auth.OAuth2Definition -import spock.lang.Specification -import springfox.documentation.service.AuthorizationCodeGrant -import springfox.documentation.service.AuthorizationScope -import springfox.documentation.service.ClientCredentialsGrant -import springfox.documentation.service.GrantType -import springfox.documentation.service.OAuth -import springfox.documentation.service.ResourceOwnerPasswordCredentialsGrant -import springfox.documentation.service.SecurityScheme -import springfox.documentation.service.TokenEndpoint -import springfox.documentation.service.TokenRequestEndpoint - -import static java.util.Collections.* - -class OAuth2AuthFactorySpec extends Specification { - def "Maps authorization code grants" () { - given: - List grants = singletonList( - new AuthorizationCodeGrant( - new TokenRequestEndpoint("tre:uri", "treClient", "tre"), - new TokenEndpoint("te:uri", "treToken"))) - List scopes = new ArrayList<>() - SecurityScheme security = new OAuth("oauth", new ArrayList(scopes), new ArrayList(grants)) - and: - OAuth2AuthFactory factory = new OAuth2AuthFactory() - when: - def securityDefinition = factory.create(security) - then: - securityDefinition.type == "oauth2" - ((OAuth2Definition)securityDefinition).getFlow() == "accessCode" - ((OAuth2Definition)securityDefinition).tokenUrl == "te:uri" - ((OAuth2Definition)securityDefinition).authorizationUrl == "tre:uri" - } - - def "Maps application grant" () { - given: - List grants = singletonList(new ClientCredentialsGrant("token:uri")) - List scopes = new ArrayList<>() - SecurityScheme security = new OAuth("oauth", new ArrayList(scopes), new ArrayList(grants)) - and: - OAuth2AuthFactory factory = new OAuth2AuthFactory() - when: - def securityDefinition = factory.create(security) - then: - securityDefinition.type == "oauth2" - ((OAuth2Definition)securityDefinition).getFlow() == "application" - ((OAuth2Definition)securityDefinition).tokenUrl == "token:uri" - } - - def "Maps password grant" () { - given: - List grants = singletonList(new ResourceOwnerPasswordCredentialsGrant("token:uri")) - List scopes = new ArrayList<>() - SecurityScheme security = new OAuth("oauth", new ArrayList(scopes), new ArrayList(grants)) - and: - OAuth2AuthFactory factory = new OAuth2AuthFactory() - when: - def securityDefinition = factory.create(security) - then: - securityDefinition.type == "oauth2" - ((OAuth2Definition)securityDefinition).getFlow() == "password" - ((OAuth2Definition)securityDefinition).tokenUrl == "token:uri" - } - - def "Throws exception when it receives an unknown grant" () { - given: - List grants = singletonList(new GrantType("unknown")) - List scopes = new ArrayList<>() - SecurityScheme security = new OAuth("oauth", new ArrayList(scopes), new ArrayList(grants)) - and: - OAuth2AuthFactory factory = new OAuth2AuthFactory() - when: - factory.create(security) - then: - thrown(IllegalArgumentException) - } -} diff --git a/springfox-swagger2/src/test/groovy/springfox/documentation/swagger2/mappers/ParameterMapperSpec.groovy b/springfox-swagger2/src/test/groovy/springfox/documentation/swagger2/mappers/ParameterMapperSpec.groovy deleted file mode 100644 index f59fd0b1c94..00000000000 --- a/springfox-swagger2/src/test/groovy/springfox/documentation/swagger2/mappers/ParameterMapperSpec.groovy +++ /dev/null @@ -1,167 +0,0 @@ -package springfox.documentation.swagger2.mappers - -import com.fasterxml.classmate.ResolvedType -import io.swagger.models.Model -import io.swagger.models.parameters.BodyParameter -import io.swagger.models.parameters.FormParameter -import io.swagger.models.parameters.QueryParameter -import io.swagger.models.parameters.SerializableParameter -import io.swagger.models.properties.FileProperty -import spock.lang.Specification -import springfox.documentation.builders.ParameterBuilder -import springfox.documentation.schema.ModelRef - -class ParameterMapperSpec extends Specification { - def "body parameters are mapped correctly" () { - given: - def parameter = parameter(parameterType).modelRef(modelRef).build() - when: - def sut = new ParameterMapper() - then: - def mapped = sut.mapParameter(parameter) - and: - mapped.access == "access" - mapped.name == "test" - mapped.description == "test description" - mapped.required - parameterInstance.isAssignableFrom(mapped.class) - - where: - parameterType | modelRef | parameterInstance - "header" | new ModelRef("sometype") | SerializableParameter - "body" | new ModelRef("sometype") | BodyParameter - "body" | new ModelRef("date") | BodyParameter - "body" | new ModelRef("sometype") | BodyParameter - "header" | new ModelRef("sometype", new ModelRef("itemType")) | SerializableParameter - "body" | new ModelRef("sometype", new ModelRef("itemType")) | BodyParameter - "header" | new ModelRef("sometype", new ModelRef("itemType"), true) | SerializableParameter - "body" | new ModelRef("sometype", new ModelRef("itemType"), true) | BodyParameter - } - - def "form parameters are mapped correctly" () { - given: - def parameter = parameter("formData").modelRef(modelRef).build() - when: - def sut = new ParameterMapper() - then: - def mapped = (FormParameter) sut.mapParameter(parameter) - and: - mapped.access == "access" - mapped.name == "test" - mapped.description == "test description" - mapped.required - mapped.type == type - mapped.format == format - mapped.items?.format == itemFormat - mapped.items?.type == itemType - - where: - modelRef | type | format | itemType | itemFormat - new ModelRef("string") | "string" | null | null | null - new ModelRef("array", new ModelRef("string")) | "array" | null | "string" | null - new ModelRef("array", new ModelRef("int")) | "array" | null | "integer" | "int32" - new ModelRef("int") | "integer" | "int32" | null | null - new ModelRef("long") | "integer" | "int64" | null | null - new ModelRef("boolean") | "boolean" | null | null | null - } - - def "form parameters fall back to body parameters for non-primitive top level types" () { - given: - def parameter = parameter("formData") - .modelRef(new ModelRef("some-non-primitive-type")) - .build() - when: - def sut = new ParameterMapper() - then: - sut.mapParameter(parameter) instanceof BodyParameter - } - - def "file parameter handling" () { - given: - def parameter = parameter("formData") - .modelRef(new ModelRef("file")) - .build() - when: - def sut = new ParameterMapper() - then: - sut.mapParameter(parameter) instanceof BodyParameter - } - - def "form parameters fall back to body parameters for arrays of non-primitive types" () { - given: - def parameter = parameter("formData") - .modelRef(new ModelRef("array", new ModelRef("object"))) - .build() - when: - def sut = new ParameterMapper() - then: - sut.mapParameter(parameter) instanceof BodyParameter - } - - def "Serializes byte array to string model in body" () { - given: - def byteArray = new ModelRef("", new ModelRef("byte")) - def parameter = parameter("body").modelRef(byteArray).build() - when: - def sut = new ParameterMapper() - then: - def mapped = sut.mapParameter(parameter) - and: - mapped.access == "access" - mapped.name == "test" - mapped.description == "test description" - mapped.required - mapped instanceof BodyParameter - mapped.schema instanceof Model - mapped.schema.format == "byte" - mapped.schema.type == "string" - } - - def "Maps example for body parameter" () { - given: - def parameter = parameter("body") - .modelRef(new ModelRef("sometype")) - .scalarExample("example") - .build() - when: - def sut = new ParameterMapper() - then: - def mapped = sut.mapParameter(parameter) - and: - mapped.access == "access" - mapped.name == "test" - mapped.description == "test description" - mapped.required - mapped instanceof BodyParameter - mapped.schema instanceof Model - mapped.schema.example == "example" - } - - def "Serializes byte array to string model in query" () { - given: - def byteArray = new ModelRef("", new ModelRef("byte")) - def parameter = parameter("query").modelRef(byteArray).build() - when: - def sut = new ParameterMapper() - then: - def mapped = sut.mapParameter(parameter) - and: - mapped.access == "access" - mapped.name == "test" - mapped.description == "test description" - mapped.required - mapped instanceof QueryParameter - mapped.format == "byte" - mapped.type == "string" - } - - def parameter(def parameterType) { - new ParameterBuilder() - .name("test") - .parameterAccess("access") - .parameterType(parameterType) - .description("test description") - .required(true) - .type(Mock(ResolvedType)) - } -} diff --git a/springfox-swagger2/src/test/groovy/springfox/documentation/swagger2/mappers/PropertiesSpec.groovy b/springfox-swagger2/src/test/groovy/springfox/documentation/swagger2/mappers/PropertiesSpec.groovy deleted file mode 100644 index c4db0999dd1..00000000000 --- a/springfox-swagger2/src/test/groovy/springfox/documentation/swagger2/mappers/PropertiesSpec.groovy +++ /dev/null @@ -1,119 +0,0 @@ -/* - * - * Copyright 2017 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ -package springfox.documentation.swagger2.mappers - -import io.swagger.models.properties.* -import springfox.documentation.schema.ModelRef - -import static springfox.documentation.swagger2.mappers.Properties.* - -import spock.lang.Specification - -class PropertiesSpec extends Specification { - def "Properties is a static class" () { - when: - new Properties() - then: - thrown(UnsupportedOperationException) - } - - def "void is represented as a null" () { - expect: - property("void") == null - } - - def "byte is represented as an integer with a format and minimum, maximum" () { - when: - def byteProp = property("byte") - then: - byteProp instanceof IntegerProperty - byteProp.format == "int32" - byteProp.maximum == Byte.MAX_VALUE - byteProp.minimum == Byte.MIN_VALUE - } - - def "List is represented as a string with a format" () { - when: - def listProp = property(new ModelRef("List", new ModelRef("string"))) - then: - listProp instanceof ArrayProperty - } - - def "Byte array is represented as a string with a byte format" () { - when: - def listProp = property(new ModelRef("Array", new ModelRef("byte"))) - then: - listProp instanceof ByteArrayProperty - } - - def "Map is represented as a string with a format" () { - when: - def mapProp = property(new ModelRef("Map", new ModelRef("string"), true)) - then: - mapProp instanceof MapProperty - } - - def "Nested collection properties are supported" () { - when: - def prop = itemTypeProperty(ref) - then: - prop == expected - where: - ref | expected - new ModelRef("string") | new StringProperty() - new ModelRef("List", new ModelRef("string")) | new ArrayProperty(new StringProperty()) - new ModelRef("List", new ModelRef("List", new ModelRef("string"))) | new ArrayProperty(new ArrayProperty(new StringProperty())) - } - - def "Properties are inferred given the type as a string"() { - expect: - property(typeName).class.isAssignableFrom(expected) - where: - typeName | expected - "int" | IntegerProperty - "long" | LongProperty - "float" | FloatProperty - "double" | DoubleProperty - "string" | StringProperty - "boolean" | BooleanProperty - "date" | DateProperty - "date-time" | DateTimeProperty - "bigdecimal"| DecimalProperty - "biginteger"| LongProperty - "uuid" | UUIDProperty - "object" | ObjectProperty - "byte" | IntegerProperty - "INT" | IntegerProperty - "LONG" | LongProperty - "FLOAT" | FloatProperty - "DOUBLE" | DoubleProperty - "STRING" | StringProperty - "BOOLEAN" | BooleanProperty - "DATE" | DateProperty - "DATE-time" | DateTimeProperty - "BIGDECIMAL"| DecimalProperty - "BIGINTEGER"| LongProperty - "UUID" | UUIDProperty - "OBJECT" | ObjectProperty - "BYTE" | IntegerProperty - "Anything" | RefProperty - } - - -} diff --git a/springfox-swagger2/src/test/groovy/springfox/documentation/swagger2/mappers/SecurityMapperSpec.groovy b/springfox-swagger2/src/test/groovy/springfox/documentation/swagger2/mappers/SecurityMapperSpec.groovy deleted file mode 100644 index ffdec748541..00000000000 --- a/springfox-swagger2/src/test/groovy/springfox/documentation/swagger2/mappers/SecurityMapperSpec.groovy +++ /dev/null @@ -1,102 +0,0 @@ -package springfox.documentation.swagger2.mappers - -import io.swagger.models.auth.ApiKeyAuthDefinition -import io.swagger.models.auth.BasicAuthDefinition -import io.swagger.models.auth.OAuth2Definition -import spock.lang.Specification -import springfox.documentation.builders.ImplicitGrantBuilder -import springfox.documentation.builders.OAuthBuilder -import springfox.documentation.service.ApiKey -import springfox.documentation.service.AuthorizationScope -import springfox.documentation.service.BasicAuth -import springfox.documentation.service.GrantType -import springfox.documentation.service.LoginEndpoint -import springfox.documentation.service.ResourceListing - -import java.util.stream.Stream - -import static java.util.Collections.* -import static java.util.stream.Collectors.* - -class SecurityMapperSpec extends Specification { - def "creates apiKey authentication based on provided security scheme" () { - given: - def scheme = new ApiKey("name", "keyName", "header") - when: - def sut = new ApiKeyAuthFactory() - and: - def mapped = sut.create(scheme) - then: - mapped as ApiKeyAuthDefinition - ((ApiKeyAuthDefinition) mapped).in.toValue() == "header" - ((ApiKeyAuthDefinition) mapped).name == "keyName" - ((ApiKeyAuthDefinition) mapped).type == "apiKey" - } - - def "creates basic authentication based on provided security scheme" () { - given: - def scheme = new BasicAuth("name") - when: - def sut = new BasicAuthFactory() - and: - def mapped = sut.create(scheme) - then: - mapped as BasicAuthDefinition - ((BasicAuthDefinition) mapped).type == "basic" - } - - - def "creates oauth2 authentication based on provided security scheme" () { - given: - def scheme = new OAuthBuilder() - .grantTypes(grantTypes()) - .scopes(scopes()) - .build() - when: - def sut = new OAuth2AuthFactory() - and: - def mapped = sut.create(scheme) - then: - mapped as OAuth2Definition - ((OAuth2Definition) mapped).type == "oauth2" - ((OAuth2Definition) mapped).scopes.containsKey("write:pets") - ((OAuth2Definition) mapped).scopes.containsKey("read:pets") - ((OAuth2Definition) mapped).flow == "implicit" - ((OAuth2Definition) mapped).authorizationUrl == "http://petstore.swagger.io/api/oauth/dialog" - } - - def "Security mapper handles all types" () { - given: - def oauth = new OAuthBuilder() - .grantTypes(grantTypes()) - .scopes(scopes()) - .name("oauth2") - .build() - def basic = new BasicAuth("basic") - def apiKey = new ApiKey("apiKey", "keyName", "header") - - when: - def sut = new SecurityMapper() - def resourceListing = Mock(ResourceListing) - and: - resourceListing.securitySchemes >> [oauth, basic, apiKey] - and: - def mapped = sut.toSecuritySchemeDefinitions(resourceListing) - then: - mapped.containsKey("oauth2") - mapped.containsKey("basic") - mapped.containsKey("apiKey") - mapped.size() == 3 - } - - List scopes() { - Stream.of(new AuthorizationScope("write:pets", "modify pets in your account"), - new AuthorizationScope("read:pets", "read your pets")).collect(toList()) - } - - List grantTypes() { - singletonList(new ImplicitGrantBuilder() - .loginEndpoint(new LoginEndpoint("http://petstore.swagger.io/api/oauth/dialog")) - .build()) - } -} diff --git a/springfox-swagger2/src/test/groovy/springfox/documentation/swagger2/mappers/SerializableParameterFactoriesSpec.groovy b/springfox-swagger2/src/test/groovy/springfox/documentation/swagger2/mappers/SerializableParameterFactoriesSpec.groovy deleted file mode 100644 index 88f93b1c92a..00000000000 --- a/springfox-swagger2/src/test/groovy/springfox/documentation/swagger2/mappers/SerializableParameterFactoriesSpec.groovy +++ /dev/null @@ -1,136 +0,0 @@ -package springfox.documentation.swagger2.mappers -import com.fasterxml.classmate.ResolvedType -import io.swagger.models.parameters.SerializableParameter -import spock.lang.Specification -import spock.lang.Unroll -import springfox.documentation.builders.ParameterBuilder -import springfox.documentation.schema.ModelRef -import springfox.documentation.service.AllowableListValues -import springfox.documentation.service.Parameter - -import static springfox.documentation.swagger2.mappers.SerializableParameterFactories.* - -class SerializableParameterFactoriesSpec extends Specification { - def "Cannot instantiate static class" () { - when: - new SerializableParameterFactories() - then: - thrown(UnsupportedOperationException) - } - - @Unroll - def "Known serializable parameters are mapped" () { - given: - Parameter parameter = parameter(parameterType) - .modelRef(modelRef) - .build() - when: - def sut = create(parameter) - then: - sut.isPresent() - and: - def mapped = sut.get() - mapped.access == "access" - mapped.name == "test" - mapped.description == "test description" - mapped.required - mapped instanceof SerializableParameter - if (modelRef.isCollection()) { - if (modelRef.itemType.equals("byte")) { - ((SerializableParameter) mapped).format == "byte" - ((SerializableParameter) mapped).type == "string" - } else { - ((SerializableParameter) mapped).collectionFormat == "csv" - ((SerializableParameter) mapped).type == "array" - ((SerializableParameter) mapped).items.name == modelRef.itemType - } - } else { - ((SerializableParameter)mapped).format == null - ((SerializableParameter)mapped).type == "string" - } - where: - parameterType | modelRef - "header" | new ModelRef("sometype") - "query" | new ModelRef("sometype") - "form" | new ModelRef("sometype") - "form" | new ModelRef("sometype", new ModelRef("byte")) - "cookie" | new ModelRef("sometype") - "path" | new ModelRef("sometype") - "header" | new ModelRef("sometype", new ModelRef("itemType")) - "query" | new ModelRef("sometype", new ModelRef("itemType")) - "form" | new ModelRef("sometype", new ModelRef("itemType")) - "cookie" | new ModelRef("sometype", new ModelRef("itemType")) - "path" | new ModelRef("sometype", new ModelRef("itemType")) - "header" | new ModelRef("sometype", new ModelRef("itemType"), true) - "query" | new ModelRef("sometype", new ModelRef("itemType"), true) - "form" | new ModelRef("sometype", new ModelRef("itemType"), true) - "cookie" | new ModelRef("sometype", new ModelRef("itemType"), true) - "path" | new ModelRef("sometype", new ModelRef("itemType"), true) - } - - @Unroll - def "Known serializable parameters are mapped with allowable values" () { - given: - Parameter parameter = parameterWithAllowableValues(parameterType) - .modelRef(modelRef) - .build() - when: - def sut = create(parameter) - then: - sut.isPresent() - and: - def mapped = sut.get() - mapped.access == "access" - mapped.name == "test" - mapped.description == "test description" - mapped.required - mapped instanceof SerializableParameter - if (modelRef.isCollection()) { - ((SerializableParameter)mapped).collectionFormat == "csv" - ((SerializableParameter)mapped).type == "array" - ((SerializableParameter)mapped).items.name == modelRef.itemType - } else { - ((SerializableParameter)mapped).format == null - ((SerializableParameter)mapped).type == "string" - } - ((SerializableParameter)mapped).enum.size() == 3 - where: - parameterType | modelRef - "header" | new ModelRef("sometype") - "query" | new ModelRef("sometype") - "form" | new ModelRef("sometype") - "cookie" | new ModelRef("sometype") - "path" | new ModelRef("sometype") - "header" | new ModelRef("sometype", new ModelRef("itemType")) - "query" | new ModelRef("sometype", new ModelRef("itemType")) - "form" | new ModelRef("sometype", new ModelRef("itemType")) - "cookie" | new ModelRef("sometype", new ModelRef("itemType")) - "path" | new ModelRef("sometype", new ModelRef("itemType")) - "header" | new ModelRef("sometype", new ModelRef("itemType"), true) - "query" | new ModelRef("sometype", new ModelRef("itemType"), true) - "form" | new ModelRef("sometype", new ModelRef("itemType"), true) - "cookie" | new ModelRef("sometype", new ModelRef("itemType"), true) - "path" | new ModelRef("sometype", new ModelRef("itemType"), true) - } - - def parameter(def parameterType) { - new ParameterBuilder() - .name("test") - .parameterAccess("access") - .parameterType(parameterType) - .description("test description") - .required(true) - .type(Mock(ResolvedType)) - } - - def parameterWithAllowableValues(def parameterType) { - new ParameterBuilder() - .name("test") - .parameterAccess("access") - .parameterType(parameterType) - .description("test description") - .required(true) - .type(Mock(ResolvedType)) - .allowableValues(new AllowableListValues(["ABC", "ONE", "TWO"], "string")) - } -} diff --git a/springfox-swagger2/src/test/groovy/springfox/documentation/swagger2/mappers/ServiceModelToSwagger2MapperSpec.groovy b/springfox-swagger2/src/test/groovy/springfox/documentation/swagger2/mappers/ServiceModelToSwagger2MapperSpec.groovy deleted file mode 100644 index e8f245d9071..00000000000 --- a/springfox-swagger2/src/test/groovy/springfox/documentation/swagger2/mappers/ServiceModelToSwagger2MapperSpec.groovy +++ /dev/null @@ -1,370 +0,0 @@ -package springfox.documentation.swagger2.mappers - -import com.fasterxml.classmate.ResolvedType -import com.fasterxml.classmate.TypeResolver -import com.fasterxml.classmate.types.ResolvedObjectType -import org.springframework.http.HttpMethod -import org.springframework.http.MediaType -import spock.lang.Specification -import springfox.documentation.builders.ApiDescriptionBuilder -import springfox.documentation.builders.ApiListingBuilder -import springfox.documentation.builders.AuthorizationScopeBuilder -import springfox.documentation.builders.DocumentationBuilder -import springfox.documentation.builders.ModelBuilder -import springfox.documentation.builders.ModelPropertyBuilder -import springfox.documentation.builders.ModelSpecificationBuilder -import springfox.documentation.builders.OperationBuilder -import springfox.documentation.builders.ParameterBuilder -import springfox.documentation.builders.RequestParameterBuilder -import springfox.documentation.builders.ResponseBuilder -import springfox.documentation.builders.ResponseMessageBuilder -import springfox.documentation.schema.Example -import springfox.documentation.schema.ModelRef -import springfox.documentation.schema.ModelReference -import springfox.documentation.schema.ScalarType -import springfox.documentation.service.AllowableListValues -import springfox.documentation.service.ApiInfo -import springfox.documentation.service.Documentation -import springfox.documentation.service.ModelNamesRegistry -import springfox.documentation.service.ObjectVendorExtension -import springfox.documentation.service.ParameterStyle -import springfox.documentation.service.ParameterType -import springfox.documentation.service.SecurityReference -import springfox.documentation.service.StringVendorExtension -import springfox.documentation.service.Tag -import springfox.documentation.spi.service.contexts.Defaults -import springfox.documentation.spring.web.readers.operation.CachingOperationNameGenerator - -import java.util.function.Consumer -import java.util.function.Function - -import static java.util.Collections.* - -class ServiceModelToSwagger2MapperSpec extends Specification implements MapperSupport { - def "Maps the api operation correctly"() { - given: - def built = apiListing() - def sut = swagger2Mapper() - - when: - def apiListings = new HashMap<>() - apiListings.putIfAbsent( - "new", - new ArrayList<>()) - apiListings.get("new").add(built) - def mappedListing = sut.mapApiListings(apiListings) - - and: - def mappedPath = mappedListing.entrySet().first() - def builtDescription = built.apis.first() - def mappedOperation = mappedPath.value.post - def builtOperation = built.apis.first().operations.first() - - then: - mappedPath.key == builtDescription.path - mappedOperation.operationId == builtOperation.uniqueId - mappedOperation.security.size() == builtOperation.securityReferences.size() - mappedOperation.security.first() containsKey("basic") - mappedOperation.consumes.first() == builtOperation.consumes.first() - mappedOperation.produces.first() == builtOperation.produces.first() - mappedOperation.parameters.size() == builtOperation.parameters.size() - mappedOperation.parameters.first().name == builtOperation.parameters.first().name - mappedOperation.description == builtOperation.notes - mappedOperation.deprecated == Boolean.parseBoolean(builtOperation.deprecated) - mappedOperation.schemes.first().toValue() == builtOperation.protocol.first().toLowerCase() - mappedOperation.responses.size() == builtOperation.responseMessages.size() - mappedOperation.responses.get("200").description == builtOperation.responseMessages.first().message - mappedOperation.responses.get("200").schema.type == "string" - mappedOperation.responses.get("200").examples.get("mediaType") == "value" - mappedOperation.vendorExtensions.size() == builtOperation.vendorExtensions.size() - mappedOperation.vendorExtensions.containsKey("x-test1") - mappedOperation.vendorExtensions.containsKey("x-test2") - } - - def "Maps documentation to swagger models"() { - given: - Documentation documentation = new DocumentationBuilder() - .basePath("base:uri") - .consumes(["application/json"] as Set) - .name("doc-group") - .host("test") - .schemes(["https"] as Set) - .tags( - [new Tag( - "tag", - "tag description", - [new StringVendorExtension( - "x-test3", - "value")])] as Set) - .build() - - when: - def sut = swagger2Mapper() - - and: - def mapped = sut.mapDocumentation(documentation) - - then: - mapped.basePath == documentation.basePath - mapped.consumes.containsAll(documentation.consumes) - mapped.produces.isEmpty() - mapped.schemes.first().toValue() == documentation.schemes.first() - mapped.host == documentation.host - mapped.definitions.isEmpty() - mapped.tags.first().name == "tag" - mapped.tags.first().description == "tag description" - mapped.tags.first().vendorExtensions.containsKey("x-test3") - } - - def "Maps documentation with resource listing to swagger models"() { - given: - Documentation documentation = new DocumentationBuilder() - .basePath("base:uri") - .produces(["application/json"] as Set) - .name("doc-group") - .resourceListing { - it.apiVersion("1.0") - .info(ApiInfo.DEFAULT) - } - .build() - - when: - def sut = swagger2Mapper() - - and: - def mapped = sut.mapDocumentation(documentation) - - then: - mapped.basePath == documentation.basePath - mapped.produces.containsAll(documentation.produces) - mapped.consumes.isEmpty() - mapped.definitions.isEmpty() - mapped.tags.isEmpty() - mapped.info != null - } - - def "Maps documentation with api listing to swagger models"() { - given: - def listingLookup = new HashMap<>() - listingLookup.putIfAbsent( - "test", - new LinkedList<>()) - listingLookup.get("test").add(apiListing()) - Documentation documentation = new DocumentationBuilder() - .basePath("base:uri") - .produces(["application/json"] as Set) - .name("doc-group") - .resourceListing { - it.apiVersion("1.0") - } - .apiListingsByResourceGroupName(listingLookup) - .build() - - when: - def sut = swagger2Mapper() - - and: - def mapped = sut.mapDocumentation(documentation) - - then: - mapped.basePath == documentation.basePath - mapped.paths.containsKey("/api-path") - mapped.definitions.containsKey("m1") - mapped.tags.isEmpty() - mapped.info == null - } - - def "Maps api info to swagger models"() { - given: - def sut = swagger2Mapper() - def apiInfo = ApiInfo.DEFAULT - - when: - def mapped = sut.mapApiInfo(apiInfo) - - then: - mapped.contact.name == apiInfo.contact.name - mapped.contact.email == apiInfo.contact.name - mapped.contact.url == apiInfo.contact.url - mapped.description == apiInfo.description - mapped.license.name == apiInfo.license - mapped.license.url == apiInfo.licenseUrl - mapped.termsOfService == apiInfo.termsOfServiceUrl - mapped.title == apiInfo.title - mapped.version == apiInfo.version - } - - def "Maps empty api info to swagger models"() { - given: - def sut = swagger2Mapper() - def apiInfo = null - - when: - def mapped = sut.mapApiInfo(apiInfo) - - then: - mapped == null - } - - def apiListing() { - def defaults = new Defaults() - def scope = new AuthorizationScopeBuilder() - .scope("test") - .description("test scope") - .build() - def example = new Example( - "mediaType", - "value") - def response = new ResponseMessageBuilder() - .code(200) - .message("Success") - .responseModel(new ModelRef("string")) - .examples([example]) - .build() - - def first = new ObjectVendorExtension("") - first.with { - addProperty( - new StringVendorExtension( - "x-test1", - "test1")) - } - - def second = new ObjectVendorExtension("x-test2") - second.with { - addProperty( - new StringVendorExtension( - "name2", - "test2")) - } - - def operation1 = new OperationBuilder(new CachingOperationNameGenerator()) - .authorizations( - [SecurityReference.builder() - .reference("basic") - .scopes(scope) - .build()]) - .consumes(singleton("application/json")) - .produces(singleton("application/json")) - .deprecated("true") - .method(HttpMethod.POST) - .uniqueId("op1") - .notes("operation 1 notes") - .tags(singleton("sometag")) - .parameters( - [new ParameterBuilder() - .allowableValues( - new AllowableListValues( - ["FIRST", "SECOND"], - "string")) - .allowMultiple(false) - .defaultValue("FIRST") - .description("Chose first or second") - .name("order") - .parameterAccess("access") - .parameterType("body") - .modelRef(new ModelRef("string")) - .required(true) - .build()]) - .requestParameters( - [new RequestParameterBuilder() - .required(true) - .name("order") - .description("Chose first or second") - .in(ParameterType.FORM) - .query { q -> - q.style(ParameterStyle.FORM) - .enumerationFacet { e - -> - e.allowedValues(["FIRST", "SECOND"]) - } - .model { - it.scalarModel(ScalarType.STRING) - } - } - .build()]) - .position(1) - .codegenMethodNameStem("") - .protocols(singleton("HTTPS")) - .responseModel(new ModelRef("string")) - .responseMessages(singleton(response)) - .responses( - [new ResponseBuilder() - .code("200") - .description("Success") - .examples([example]) - .representation(MediaType.TEXT_PLAIN) - .apply({ - it.model { m -> m.scalarModel(ScalarType.STRING) } - } as Consumer) - .build()] as Set) - .extensions([first, second]) - .build() - def description = new ApiDescriptionBuilder(defaults.operationOrdering()) - .description("test") - .hidden(true) - .path("/api-path") - .operations([operation1]) - .build() - - ResolvedType resolved = new TypeResolver().resolve(String) - def modelProperty = new ModelPropertyBuilder() - .allowableValues(null) - .name("p1") - .description("property 1") - .position(1) - .qualifiedType("qualified.Test") - .required(true) - .type(resolved) - .build() - modelProperty.updateModelRef(createFactory(new ModelRef("string"))) - def modelSpecs = ["m1": - new ModelSpecificationBuilder() - .scalarModel(ScalarType.STRING) - .name("test") - .build()] - def modelNames = Mock(ModelNamesRegistry) - modelNames.modelsByName() >> modelSpecs - new ApiListingBuilder(defaults.apiDescriptionOrdering()) - .apis([description]) - .apiVersion("1.0") - .securityReferences(null) - .basePath("/base-path") - .tags( - [new Tag( - "some-group", - "")] as Set) - .description("listing") - .consumes([] as Set) - .produces([] as Set) - .models( - [ - "m1": new ModelBuilder("test") - .description("test") - .name("test") - .type(new TypeResolver().resolve(String)) - .qualifiedType("qualified.name") - .subTypes(null) - .properties( - [ - "p1": modelProperty - ]) - .build()]) - .modelSpecifications(modelSpecs) - .modelNamesRegistry(modelNames) - .position(1) - .resourcePath("/resource-path") - .protocols(null) - .build() - } - - Function createFactory(ModelRef modelRef) { - new Function() { - @Override - ModelReference apply(ResolvedObjectType type) { - return modelRef - } - } - } - -} diff --git a/springfox-swagger2/src/test/groovy/springfox/documentation/swagger2/mappers/VendorExtensionsMapperSpec.groovy b/springfox-swagger2/src/test/groovy/springfox/documentation/swagger2/mappers/VendorExtensionsMapperSpec.groovy deleted file mode 100644 index 97321da4085..00000000000 --- a/springfox-swagger2/src/test/groovy/springfox/documentation/swagger2/mappers/VendorExtensionsMapperSpec.groovy +++ /dev/null @@ -1,86 +0,0 @@ -/* - * - * Copyright 2017-2019 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ -package springfox.documentation.swagger2.mappers - -import spock.lang.Specification -import springfox.documentation.service.VendorExtension -import springfox.documentation.service.ListVendorExtension -import springfox.documentation.service.ObjectVendorExtension -import springfox.documentation.service.StringVendorExtension - -class VendorExtensionsMapperSpec extends Specification { - class Person { - String name; - int age; - } - def second() { - def second = new ObjectVendorExtension("x-test2") - second.with { - addProperty(new StringVendorExtension("x-name2", "value2")) - } - second - } - - def first() { - def first = new ObjectVendorExtension("") - first.with { - addProperty(new StringVendorExtension("x-test1", "value1")) - } - first - } - - def third() { - new ListVendorExtension("x-test3", [1, 3]) - } - - def fourth() { - new VendorExtension() { - def getValue() { - Person person = new Person() - person.name = "test" - person.age = 1 - return person - } - String getName() { - "x-test4" - } - } - } - - def "mapper works as expected" () { - given: - VendorExtensionsMapper sut = new VendorExtensionsMapper() - when: - def mapped = sut.mapExtensions([first(), second(), third(), fourth()]) - then: - mapped.containsKey("x-test1") - mapped["x-test1"] == "value1" - and: - mapped.containsKey("x-test2") - mapped["x-test2"] == ["x-name2": "value2"] - and: - mapped.containsKey("x-test3") - mapped["x-test3"] == [1, 3] - and: - mapped.containsKey("x-test4") - Person p = mapped["x-test4"] - p.name == "test" - p.age == 1 - } -} diff --git a/springfox-swagger2/src/test/groovy/springfox/documentation/swagger2/web/Swagger2ControllerSpec.groovy b/springfox-swagger2/src/test/groovy/springfox/documentation/swagger2/web/Swagger2ControllerSpec.groovy deleted file mode 100644 index f556eaf523a..00000000000 --- a/springfox-swagger2/src/test/groovy/springfox/documentation/swagger2/web/Swagger2ControllerSpec.groovy +++ /dev/null @@ -1,174 +0,0 @@ -package springfox.documentation.swagger2.web - -import com.fasterxml.classmate.TypeResolver -import org.springframework.mock.env.MockEnvironment -import org.springframework.plugin.core.PluginRegistry -import org.springframework.web.util.WebUtils -import spock.lang.Unroll -import springfox.documentation.spi.DocumentationType -import springfox.documentation.spi.service.contexts.Defaults -import springfox.documentation.spring.web.DocumentationCache -import springfox.documentation.spring.web.json.JsonSerializer -import springfox.documentation.spring.web.mixins.ApiListingSupport -import springfox.documentation.spring.web.mixins.AuthSupport -import springfox.documentation.spring.web.mixins.JsonSupport -import springfox.documentation.spring.web.paths.DefaultPathProvider -import springfox.documentation.spring.web.plugins.DefaultConfiguration -import springfox.documentation.spring.web.plugins.DocumentationContextSpec -import springfox.documentation.spring.web.scanners.ApiDocumentationScanner -import springfox.documentation.spring.web.scanners.ApiListingReferenceScanResult -import springfox.documentation.spring.web.scanners.ApiListingReferenceScanner -import springfox.documentation.spring.web.scanners.ApiListingScanner -import springfox.documentation.swagger2.configuration.Swagger2JacksonModule -import springfox.documentation.swagger2.mappers.MapperSupport - -import jakarta.servlet.ServletContext -import jakarta.servlet.http.HttpServletRequest - -import static java.util.Collections.* -import static springfox.documentation.spi.service.contexts.Orderings.* - -class Swagger2ControllerSpec extends DocumentationContextSpec - implements MapperSupport, - JsonSupport, - AuthSupport, - ApiListingSupport { - - Swagger2ControllerWebMvc controller = new Swagger2ControllerWebMvc( - mockEnvironment(), - new DocumentationCache(), - swagger2Mapper(), - new JsonSerializer([new Swagger2JacksonModule()]), - PluginRegistry.of(new WebMvcBasePathAndHostnameTransformationFilter(env))) - - ApiListingReferenceScanner listingReferenceScanner - ApiListingScanner listingScanner - HttpServletRequest request - - def setup() { - listingReferenceScanner = Mock(ApiListingReferenceScanner) - listingReferenceScanner.scan(_) >> new ApiListingReferenceScanResult(new HashMap<>()) - listingScanner = Mock(ApiListingScanner) - listingScanner.scan(_) >> new HashMap<>() - - request = servletRequest() - } - - def mockEnvironment() { - def environment = new MockEnvironment() - environment.withProperty("springfox.documentation.swagger.v1.path", "/v1") - environment.withProperty("springfox.documentation.swagger.v2.path", "/v2") - environment - } - - - @Unroll - def "should return #expectedStatus for group #group"() { - given: - ApiDocumentationScanner scanner = - new ApiDocumentationScanner(listingReferenceScanner, listingScanner) - controller.documentationCache.addDocumentation(scanner.scan(documentationContext())) - - when: - def result = controller.getDocumentation(group, request) - - then: - result.getStatusCode().value() == expectedStatus - - where: - group | expectedStatus - null | 200 - "default" | 200 - "unknown" | 404 - } - - @Unroll("x-forwarded-prefix: #prefix") - def "should respect proxy headers ('X-Forwarded-*') when setting host, port and basePath"() { - given: - def req = servletRequestWithXHeaders(prefix) - - def defaultConfiguration = new DefaultConfiguration( - new Defaults(), - new TypeResolver(), - new DefaultPathProvider()) - - this.contextBuilder = defaultConfiguration.create(DocumentationType.SWAGGER_12) - .requestHandlers([]) - .operationOrdering(nickNameComparator()) - - ApiDocumentationScanner swaggerApiResourceListing = - new ApiDocumentationScanner(listingReferenceScanner, listingScanner) - controller.documentationCache.addDocumentation(swaggerApiResourceListing.scan(documentationContext())) - - when: - def result = jsonBodyResponse(controller.getDocumentation(null, req).getBody().value()) - - then: - result.basePath == expectedPath - - where: - prefix | expectedPath - "/fooservice" | "/fooservice/servletPath" - "/" | "/servletPath" - "" | "/servletPath" - } - - def "Should omit port number if it is -1"() { - given: - ApiDocumentationScanner swaggerApiResourceListing = - new ApiDocumentationScanner(listingReferenceScanner, listingScanner) - controller.documentationCache.addDocumentation(swaggerApiResourceListing.scan(documentationContext())) - - when: - def result = controller.getDocumentation(null, request) - - and: - //Need to find out why jsonPath mvc result matcher doesn't work - def slurped = jsonBodyResponse(result.getBody().value()) - - then: - slurped.host == "localhost" - result.getStatusCode().value() == 200 - } - - - def servletRequest() { - def contextPath = "/contextPath" - - HttpServletRequest request = Mock(HttpServletRequest) - request.contextPath >> contextPath - request.servletPath >> "/servletPath" - request.getAttribute(WebUtils.INCLUDE_REQUEST_URI_ATTRIBUTE) >> "http://localhost:8080/api-docs" - request.requestURL >> new StringBuffer("http://localhost/api-docs") - request.headerNames >> enumeration([]) - request.servletContext >> servletContext(contextPath) - - request - } - - def servletRequestWithXHeaders(prefix) { - def contextPath = "/contextPath" - - HttpServletRequest request = Mock(HttpServletRequest) - request.contextPath >> contextPath - request.servletPath >> "/servletPath" - request.getAttribute(WebUtils.INCLUDE_REQUEST_URI_ATTRIBUTE) >> "http://localhost:8080/api-docs" - request.requestURL >> new StringBuffer("http://localhost/api-docs") - request.headerNames >>> [enumeration(["X-Forwarded-Host", "X-Forwarded-Prefix"]), - enumeration(["X-Forwarded-Host", "X-Forwarded-Prefix"])] - request.getHeader("X-Forwarded-Host") >> "myhost:6060" - request.getHeader("X-Forwarded-Prefix") >> prefix - request.getHeaders("X-Forwarded-Host") >> enumeration(["myhost:6060"]) - request.getHeaders("X-Forwarded-Prefix") >> enumeration([prefix]) - request.servletContext >> servletContext(contextPath) - - request - } - - def servletContext(String contextPath) { - ServletContext servletContext = Mock(ServletContext) - servletContext.contextPath >> contextPath - - servletContext - } -} \ No newline at end of file diff --git a/springfox-swagger2/src/test/groovy/springfox/documentation/swagger2/web/Swagger2ControllerWebFluxSpec.groovy b/springfox-swagger2/src/test/groovy/springfox/documentation/swagger2/web/Swagger2ControllerWebFluxSpec.groovy deleted file mode 100644 index e2264ba285f..00000000000 --- a/springfox-swagger2/src/test/groovy/springfox/documentation/swagger2/web/Swagger2ControllerWebFluxSpec.groovy +++ /dev/null @@ -1,91 +0,0 @@ -package springfox.documentation.swagger2.web - -import com.fasterxml.classmate.TypeResolver -import org.springframework.http.server.RequestPath -import org.springframework.http.server.reactive.ServerHttpRequest -import org.springframework.mock.env.MockEnvironment -import org.springframework.plugin.core.PluginRegistry -import spock.lang.Unroll -import springfox.documentation.spi.DocumentationType -import springfox.documentation.spi.service.contexts.Defaults -import springfox.documentation.spring.web.DocumentationCache -import springfox.documentation.spring.web.json.JsonSerializer -import springfox.documentation.spring.web.mixins.ApiListingSupport -import springfox.documentation.spring.web.mixins.AuthSupport -import springfox.documentation.spring.web.mixins.JsonSupport -import springfox.documentation.spring.web.paths.DefaultPathProvider -import springfox.documentation.spring.web.plugins.DefaultConfiguration -import springfox.documentation.spring.web.plugins.DocumentationContextSpec -import springfox.documentation.spring.web.scanners.ApiDocumentationScanner -import springfox.documentation.spring.web.scanners.ApiListingReferenceScanResult -import springfox.documentation.spring.web.scanners.ApiListingReferenceScanner -import springfox.documentation.spring.web.scanners.ApiListingScanner -import springfox.documentation.swagger2.configuration.Swagger2JacksonModule -import springfox.documentation.swagger2.mappers.MapperSupport - -import static springfox.documentation.spi.service.contexts.Orderings.* - -class Swagger2ControllerWebFluxSpec extends DocumentationContextSpec - implements MapperSupport, - JsonSupport, - AuthSupport, - ApiListingSupport { - - Swagger2ControllerWebFlux controller = new Swagger2ControllerWebFlux(new DocumentationCache(), - swagger2Mapper(), - new JsonSerializer([new Swagger2JacksonModule()]), - PluginRegistry.of(new WebFluxBasePathAndHostnameTransformationFilter()) - ) - - ApiListingReferenceScanner listingReferenceScanner - ApiListingScanner listingScanner - - def setup() { - listingReferenceScanner = Mock(ApiListingReferenceScanner) - listingReferenceScanner.scan(_) >> new ApiListingReferenceScanResult(new HashMap<>()) - listingScanner = Mock(ApiListingScanner) - listingScanner.scan(_) >> new HashMap<>() - } - - @Unroll("x-forwarded-prefix: #prefix") - def "should respect proxy headers ('X-Forwarded-*') when setting host, port and basePath"() { - given: - def req = serverRequestWithXHeaders(prefix) - - def defaultConfiguration = new DefaultConfiguration( - new Defaults(), - new TypeResolver(), - new DefaultPathProvider()) - - this.contextBuilder = defaultConfiguration.create(DocumentationType.SWAGGER_12) - .requestHandlers([]) - .operationOrdering(nickNameComparator()) - - ApiDocumentationScanner swaggerApiResourceListing = - new ApiDocumentationScanner(listingReferenceScanner, listingScanner) - controller.documentationCache.addDocumentation(swaggerApiResourceListing.scan(documentationContext())) - - when: - def result = jsonBodyResponse(controller.getDocumentation(null, req).getBody().value()) - - then: - result.basePath == expectedPath - - where: - prefix | expectedPath - "/fooservice" | "/fooservice" - "/" | "/" - "" | "/" - } - - def serverRequestWithXHeaders(String prefix) { - ServerHttpRequest request = Mock() - request.path >> RequestPath.parse(new URI("http://localhost${-> prefix}/api"), prefix) - request.URI >> URI.create("http://localhost/api-docs") - request - } - - def mockEnvironment() { - new MockEnvironment() - } -} diff --git a/springfox-swagger2/src/test/java/springfox/documentation/swagger2/configuration/PropertyExampleSerializerTest.java b/springfox-swagger2/src/test/java/springfox/documentation/swagger2/configuration/PropertyExampleSerializerTest.java deleted file mode 100644 index 807dd22765f..00000000000 --- a/springfox-swagger2/src/test/java/springfox/documentation/swagger2/configuration/PropertyExampleSerializerTest.java +++ /dev/null @@ -1,109 +0,0 @@ -/* - * - * Copyright 2015-2019 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.documentation.swagger2.configuration; - -import com.fasterxml.jackson.databind.ObjectMapper; -import io.swagger.models.properties.ArrayProperty; -import io.swagger.models.properties.BooleanProperty; -import io.swagger.models.properties.DecimalProperty; -import io.swagger.models.properties.MapProperty; -import io.swagger.models.properties.StringProperty; -import org.junit.BeforeClass; -import org.junit.Test; - -import static org.junit.Assert.*; - -public class PropertyExampleSerializerTest { - - private static final ObjectMapper SUT = new ObjectMapper(); - - @BeforeClass - public static void setupClass() { - SUT.registerModule(new Swagger2JacksonModule()); - } - - @Test - public void serializePropertyExampleBoolean() throws Exception { - BooleanProperty booleanPropertyTrue = new BooleanProperty(); - booleanPropertyTrue.setExample("true"); - BooleanProperty booleanPropertyFalse = new BooleanProperty(); - booleanPropertyFalse.setExample("false"); - - String serializedTrue = SUT.writeValueAsString(booleanPropertyTrue); - assertTrue(serializedTrue.contains("\"example\":true")); - String serializedFalse = SUT.writeValueAsString(booleanPropertyFalse); - assertTrue(serializedFalse.contains("\"example\":false")); - } - - @Test - public void serializePropertyExampleNumber() throws Exception { - DecimalProperty decimalProperty = new DecimalProperty(); - decimalProperty.setExample("-0.42"); - - String serialized = SUT.writeValueAsString(decimalProperty); - assertTrue(serialized.contains("\"example\":-0.42")); - } - - @Test - public void serializePropertyExampleArray() throws Exception { - ArrayProperty arrayProperty = new ArrayProperty(); - arrayProperty.setExample("[42, \"foo\", true]"); - - String serialized = SUT.writeValueAsString(arrayProperty); - assertTrue(serialized.contains("[42, \"foo\", true]")); - } - - @Test - public void serializePropertyExampleObject() throws Exception { - MapProperty mapProperty = new MapProperty(); - mapProperty.setExample("{\"0\": {\"name\": \"foo\", \"age\": 42}, \"1\": {\"name\": \"bar\", \"valid\": true}}"); - - String serialized = SUT.writeValueAsString(mapProperty); - assertTrue(serialized.contains( - "\"example\":{\"0\": {\"name\": \"foo\", \"age\": 42}, \"1\": {\"name\": \"bar\", \"valid\": true}}")); - } - - @Test - public void serializePropertyExampleString() throws Exception { - StringProperty stringProperty = new StringProperty(); - stringProperty.setExample("2017-07-30"); - - String serialized = SUT.writeValueAsString(stringProperty); - assertTrue(serialized.contains("\"example\":\"2017-07-30\"")); - } - - @Test - public void serializePropertyExampleNull() throws Exception { - StringProperty stringProperty = new StringProperty(); - - String serialized = SUT.writeValueAsString(stringProperty); - assertFalse(serialized.contains("\"example\":")); - } - - @Test - public void serializePropertyExampleEmpty() throws Exception { - StringProperty stringProperty = new StringProperty(); - stringProperty.setExample(" "); - - String serialized = SUT.writeValueAsString(stringProperty); - assertFalse(serialized.contains("\"example\":")); - } - -} \ No newline at end of file diff --git a/swagger-contract-tests-webflux/README.md b/swagger-contract-tests-webflux/README.md deleted file mode 100644 index 0d1b7f6e27b..00000000000 --- a/swagger-contract-tests-webflux/README.md +++ /dev/null @@ -1,9 +0,0 @@ -### swagger-contract-tests - -```bash -./gradlew swagger-contract-tests-webflux:bootRun -``` - -- http://localhost:8080/sdoc.jsp - -To view the petstore APIs http://localhost:8080/api-docs?group=petstore \ No newline at end of file diff --git a/swagger-contract-tests-webflux/build.gradle b/swagger-contract-tests-webflux/build.gradle deleted file mode 100644 index f241af0c417..00000000000 --- a/swagger-contract-tests-webflux/build.gradle +++ /dev/null @@ -1,43 +0,0 @@ -buildscript { - ext { - springBootVersion = '3.0.0' - } - repositories { - mavenCentral() - } - dependencies { - classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}") - } -} - -apply plugin: 'org.springframework.boot' -apply plugin: 'io.spring.dependency-management' - -configurations { - //Logback causing spring boot errors - all*.exclude group: 'ch.qos.logback' -} - -dependencies { - implementation "org.springframework.boot:spring-boot-starter-webflux" - implementation project(':springfox-swagger2') - implementation project(':springfox-petstore-webflux') - implementation project(':springfox-spring-webflux') - implementation libs.clientProvided - implementation 'org.slf4j:slf4j-simple:1.7.30' - - implementation(project(path: ':springfox-swagger-ui')) { - exclude group: 'org.springframework', module: 'spring-web' - } - - testImplementation libs.testNoHateoas - testImplementation "org.skyscreamer:jsonassert:${jsonAssert}" - testImplementation "org.springframework.boot:spring-boot-starter-test" -} -// tag::update-contract-tests[] -// NOTE: Uncomment to bulk update contracts -//test { -// systemProperty("contract.tests.root", "$projectDir/src/test/resources") -// systemProperty("contract.tests.update", true) -//} -// end::update-contract-tests[] \ No newline at end of file diff --git a/swagger-contract-tests-webflux/src/main/java/springfox/test/contract/swagger/webflux/FeatureDemonstrationController.java b/swagger-contract-tests-webflux/src/main/java/springfox/test/contract/swagger/webflux/FeatureDemonstrationController.java deleted file mode 100644 index 157f5cfd35f..00000000000 --- a/swagger-contract-tests-webflux/src/main/java/springfox/test/contract/swagger/webflux/FeatureDemonstrationController.java +++ /dev/null @@ -1,45 +0,0 @@ -package springfox.test.contract.swagger.webflux; - -import org.springframework.http.MediaType; -import org.springframework.http.ResponseEntity; -import org.springframework.http.codec.multipart.FilePart; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestPart; -import org.springframework.web.bind.annotation.RestController; -import reactor.core.publisher.Flux; -import reactor.core.publisher.Mono; - -import java.util.List; -import java.util.Optional; - -@RestController -@RequestMapping("/features") -public class FeatureDemonstrationController { - @GetMapping("/response-mono") - public ResponseEntity> helloMono() { - return ResponseEntity.ok(Mono.fromSupplier(() -> "Hello SpringFox!")); - } - - @GetMapping("/mono") - public Mono helloPerson(String name) { - return Mono.just("Hello " + name + "!"); - } - - @GetMapping("/flux") - public Flux helloPeople(String... names) { - return Flux.fromArray(names).map(name -> "Hello " + name); - } - - @GetMapping("/response-flux") - public ResponseEntity> helloPeople(List names) { - return ResponseEntity.of(Optional.of(Flux.fromStream(names.stream().map(name -> "Hello " + name)))); - } - - @PostMapping(value = "/3364/{name}", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) - public boolean feature3364(@RequestPart("files") Flux filePartFlux, @PathVariable final String name) { - return true; - } -} diff --git a/swagger-contract-tests-webflux/src/main/java/springfox/test/contract/swagger/webflux/SecuritySupport.java b/swagger-contract-tests-webflux/src/main/java/springfox/test/contract/swagger/webflux/SecuritySupport.java deleted file mode 100644 index c814966d865..00000000000 --- a/swagger-contract-tests-webflux/src/main/java/springfox/test/contract/swagger/webflux/SecuritySupport.java +++ /dev/null @@ -1,41 +0,0 @@ -package springfox.test.contract.swagger.webflux; - -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import springfox.documentation.builders.ImplicitGrantBuilder; -import springfox.documentation.builders.OAuthBuilder; -import springfox.documentation.service.ApiKey; -import springfox.documentation.service.AuthorizationScope; -import springfox.documentation.service.GrantType; -import springfox.documentation.service.LoginEndpoint; -import springfox.documentation.service.SecurityScheme; - -import java.util.Collections; -import java.util.List; -import java.util.stream.Collectors; -import java.util.stream.Stream; - -@Configuration -public class SecuritySupport { - @Bean - public SecurityScheme oauth() { - return new OAuthBuilder().name("petstore_auth").grantTypes(grantTypes()).scopes(scopes()).build(); - } - - @Bean - public SecurityScheme apiKey() { - return new ApiKey("api_key", "api_key", "header"); - } - - public List scopes() { - return Stream.of(new AuthorizationScope("write:pets", "modify pets in your account"), - new AuthorizationScope("read:pets", - "read your pets")).collect(Collectors.toList()); - } - - public List grantTypes() { - return Collections.singletonList(new ImplicitGrantBuilder().loginEndpoint(new LoginEndpoint( - "http://petstore.swagger.io/api/oauth/dialog")).build()); - } - -} diff --git a/swagger-contract-tests-webflux/src/main/java/springfox/test/contract/swagger/webflux/Swagger2WebFluxConfig.java b/swagger-contract-tests-webflux/src/main/java/springfox/test/contract/swagger/webflux/Swagger2WebFluxConfig.java deleted file mode 100644 index 8e9c6dae1b3..00000000000 --- a/swagger-contract-tests-webflux/src/main/java/springfox/test/contract/swagger/webflux/Swagger2WebFluxConfig.java +++ /dev/null @@ -1,72 +0,0 @@ -package springfox.test.contract.swagger.webflux; - -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.ComponentScan; -import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.Import; -import springfox.documentation.builders.PathSelectors; -import springfox.documentation.service.SecurityScheme; -import springfox.documentation.spi.DocumentationType; -import springfox.documentation.spring.web.plugins.Docket; - -import java.util.Arrays; -import java.util.HashSet; -import java.util.List; - -@Configuration -@Import({springfox.petstore.webflux.PetStoreConfiguration.class}) -@ComponentScan({ - "springfox.test.contract.swagger", - "springfox.petstore.webflux.controller" -}) -public class Swagger2WebFluxConfig { - - @Bean - public Docket petstoreWithUriTemplating(List authorizationTypes) { - return new Docket(DocumentationType.SWAGGER_2) - .groupName("petstoreTemplated") - .useDefaultResponseMessages(false) - .securitySchemes(authorizationTypes) - .produces(new HashSet<>(Arrays.asList("application/xml", - "application/json"))) - .select() - .paths(PathSelectors.regex("/api/store/search.*")) - .build() - .enableUrlTemplating(true) - .host("petstore.swagger.io") - .protocols(new HashSet<>(Arrays.asList("http", "https"))); - } - - @Bean - public Docket features(List authorizationTypes) { - return new Docket(DocumentationType.SWAGGER_2) - .groupName("features") - .useDefaultResponseMessages(false) - .securitySchemes(authorizationTypes) - .produces(new HashSet<>(Arrays.asList("application/xml", - "application/json"))) - .select() - .paths(PathSelectors.regex("/features/.*")) - .build() - .enableUrlTemplating(true) - .host("petstore.swagger.io") - .protocols(new HashSet<>(Arrays.asList("http", "https"))); - } - - @Bean - public Docket bugs(List authorizationTypes) { - return new Docket(DocumentationType.SWAGGER_2) - .groupName("bugs") - .useDefaultResponseMessages(false) - .securitySchemes(authorizationTypes) - .produces(new HashSet<>(Arrays.asList("application/xml", - "application/json"))) - .select() - .paths(PathSelectors.regex("/bugs/.*")) - .build() - .enableUrlTemplating(true) - .host("petstore.swagger.io") - .protocols(new HashSet<>(Arrays.asList("http", "https"))); - } - -} diff --git a/swagger-contract-tests-webflux/src/main/java/springfox/test/contract/swagger/webflux/SwaggerWebfluxApplication.java b/swagger-contract-tests-webflux/src/main/java/springfox/test/contract/swagger/webflux/SwaggerWebfluxApplication.java deleted file mode 100644 index 011f3cb924c..00000000000 --- a/swagger-contract-tests-webflux/src/main/java/springfox/test/contract/swagger/webflux/SwaggerWebfluxApplication.java +++ /dev/null @@ -1,33 +0,0 @@ -/* - * - * Copyright 2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.test.contract.swagger.webflux; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import springfox.documentation.swagger2.annotations.EnableSwagger2; - -@SpringBootApplication -@SuppressWarnings("HideUtilityClassConstructor") -@EnableSwagger2 -public class SwaggerWebfluxApplication { - public static void main(String[] args) { - SpringApplication.run(SwaggerWebfluxApplication.class, args); - } -} diff --git a/swagger-contract-tests-webflux/src/main/java/springfox/test/contract/swagger/webflux/bugs/Bug3343.java b/swagger-contract-tests-webflux/src/main/java/springfox/test/contract/swagger/webflux/bugs/Bug3343.java deleted file mode 100644 index e388c2208ca..00000000000 --- a/swagger-contract-tests-webflux/src/main/java/springfox/test/contract/swagger/webflux/bugs/Bug3343.java +++ /dev/null @@ -1,36 +0,0 @@ -package springfox.test.contract.swagger.webflux.bugs; - -public class Bug3343 { - public static class Payload { - private String content; - - public String getContent() { - return content; - } - - public void setContent(String content) { - this.content = content; - } - } - - public static class SuccessResponse { - private int code; - private T payload; - - public T getPayload() { - return payload; - } - - public void setPayload(T payload) { - this.payload = payload; - } - - public int getCode() { - return code; - } - - public void setCode(int code) { - this.code = code; - } - } -} diff --git a/swagger-contract-tests-webflux/src/main/java/springfox/test/contract/swagger/webflux/bugs/WebFluxBugController.java b/swagger-contract-tests-webflux/src/main/java/springfox/test/contract/swagger/webflux/bugs/WebFluxBugController.java deleted file mode 100644 index afbda8f6bb8..00000000000 --- a/swagger-contract-tests-webflux/src/main/java/springfox/test/contract/swagger/webflux/bugs/WebFluxBugController.java +++ /dev/null @@ -1,31 +0,0 @@ -package springfox.test.contract.swagger.webflux.bugs; - -import io.swagger.annotations.ApiOperation; -import io.swagger.annotations.ApiResponse; -import io.swagger.annotations.ApiResponses; -import org.springframework.http.MediaType; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.ResponseBody; -import org.springframework.web.bind.annotation.RestController; -import reactor.core.publisher.Mono; - -@RestController -@RequestMapping("/bugs") -public class WebFluxBugController { - @ApiOperation( - value = "List all projects" - ) - @ApiResponses(value = { - @ApiResponse( - code = 200, - message = "Content ready" - ) - }) - @GetMapping(path = "/bug3343", produces = MediaType.APPLICATION_JSON_VALUE) - @ResponseBody - Mono>> getAll() { - return Mono.justOrEmpty(null); - } -} diff --git a/swagger-contract-tests-webflux/src/main/java/springfox/test/contract/swagger/webflux/listeners/ObjectMapperEventListener.java b/swagger-contract-tests-webflux/src/main/java/springfox/test/contract/swagger/webflux/listeners/ObjectMapperEventListener.java deleted file mode 100644 index 2c371ca11dd..00000000000 --- a/swagger-contract-tests-webflux/src/main/java/springfox/test/contract/swagger/webflux/listeners/ObjectMapperEventListener.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * - * Copyright 2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.test.contract.swagger.webflux.listeners; - -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.databind.ObjectMapper; -import org.springframework.context.ApplicationListener; -import org.springframework.core.Ordered; -import springfox.documentation.schema.configuration.ObjectMapperConfigured; - -public class ObjectMapperEventListener implements ApplicationListener, Ordered { - @Override - public void onApplicationEvent(ObjectMapperConfigured event) { - ObjectMapper objectMapper = event.getObjectMapper(); - objectMapper.setSerializationInclusion(JsonInclude.Include.ALWAYS); - } - - @Override - public int getOrder() { - //Always runs last so it's the effective ObjectMapper configuration - return LOWEST_PRECEDENCE; - } -} diff --git a/swagger-contract-tests-webflux/src/main/resources/simplelogger.properties b/swagger-contract-tests-webflux/src/main/resources/simplelogger.properties deleted file mode 100644 index 4441a0b2802..00000000000 --- a/swagger-contract-tests-webflux/src/main/resources/simplelogger.properties +++ /dev/null @@ -1 +0,0 @@ -org.slf4j.simpleLogger.defaultLogLevel=info diff --git a/swagger-contract-tests-webflux/src/test/groovy/springfox/test/contract/swaggertests/webflux/FileAccess.groovy b/swagger-contract-tests-webflux/src/test/groovy/springfox/test/contract/swaggertests/webflux/FileAccess.groovy deleted file mode 100644 index 7d3a6ea9664..00000000000 --- a/swagger-contract-tests-webflux/src/test/groovy/springfox/test/contract/swaggertests/webflux/FileAccess.groovy +++ /dev/null @@ -1,54 +0,0 @@ -/* - * - * Copyright 2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.test.contract.swaggertests.webflux - -import groovy.json.StringEscapeUtils -import org.codehaus.groovy.runtime.ResourceGroovyMethods - -import static groovy.json.JsonOutput.* - -trait FileAccess { - String fileContents(String fileName) { - def resource = this.getClass().getResource("$fileName") - return ResourceGroovyMethods.getText(resource, 'UTF-8') - } - - def maybeWriteToFile(fileName, String contents) { - def root = System.properties.get("contract.tests.root") - def updateContracts = System.properties.get("contract.tests.update", false) - System.out.println("Update contracts? $updateContracts, root -> $root") - if (updateContracts) { - System.out.println("Writing file ${root}${File.separator}${fileName}...") - def file - def writer - try { - file = new FileOutputStream("${root}${File.separator}${fileName}") - writer = new OutputStreamWriter(file, "UTF-8") - writer.write(StringEscapeUtils.unescapeJava(prettyPrint(contents))) - } catch (Exception e) { - System.err.println("**** ERROR WRITING FILE: " + e.getMessage()) - } finally { - writer.flush() - writer.close() - } - } - true - } -} \ No newline at end of file diff --git a/swagger-contract-tests-webflux/src/test/groovy/springfox/test/contract/swaggertests/webflux/ObjectMapperSanityCheck.groovy b/swagger-contract-tests-webflux/src/test/groovy/springfox/test/contract/swaggertests/webflux/ObjectMapperSanityCheck.groovy deleted file mode 100644 index 2f79b183bcb..00000000000 --- a/swagger-contract-tests-webflux/src/test/groovy/springfox/test/contract/swaggertests/webflux/ObjectMapperSanityCheck.groovy +++ /dev/null @@ -1,105 +0,0 @@ -/* - * - * - * - * - * Copyright 2017 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.test.contract.swaggertests.webflux - -import com.fasterxml.jackson.annotation.JsonInclude -import com.fasterxml.jackson.databind.ObjectMapper -import groovy.json.JsonSlurper -import org.springframework.beans.factory.annotation.Value -import org.springframework.boot.test.context.SpringBootTest -import org.springframework.boot.test.web.client.TestRestTemplate -import org.springframework.context.annotation.Bean -import org.springframework.context.annotation.ComponentScan -import org.springframework.context.annotation.Configuration -import org.springframework.context.annotation.Primary -import org.springframework.context.support.PropertySourcesPlaceholderConfigurer -import org.springframework.http.MediaType -import org.springframework.http.RequestEntity -import org.springframework.test.context.ContextConfiguration -import spock.lang.Specification -import springfox.documentation.spi.DocumentationType -import springfox.documentation.spring.web.plugins.Docket -import springfox.documentation.swagger2.annotations.EnableSwagger2 -import springfox.test.contract.swagger.webflux.SwaggerWebfluxApplication -import springfox.test.contract.swagger.webflux.listeners.ObjectMapperEventListener - -import static org.springframework.boot.test.context.SpringBootTest.* - -@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT) -@ContextConfiguration(classes = Config) -class ObjectMapperSanityCheck extends Specification { - - @Value('${local.server.port}') - int port - - def "should produce valid swagger json regardless of object mapper configuration"() { - - given: "A customized object mapper always serializing empty attributes" - def http = new TestRestTemplate() - RequestEntity request = RequestEntity.get(new URI("http://localhost:$port/v2/api-docs?group=default")) - .accept(MediaType.APPLICATION_JSON) - .build() - - when: "swagger json is produced" - def response = http.exchange(request, String) - - then: "There should not be a null schemes element" - def slurper = new JsonSlurper() - def swagger = slurper.parseText(response.body) - !swagger.containsKey('schemes') - } - - @Configuration - @EnableSwagger2 - @ComponentScan(basePackageClasses = [SwaggerWebfluxApplication.class]) - static class Config { - @Bean - public Docket testCases() { - return new Docket(DocumentationType.SWAGGER_2).select().build() - } - - @Bean - @Primary - public ObjectMapper objectMapperWithIncludeAlways(){ - /* Replaces Spring Boot's object mapper - * http://docs.spring.io/spring-boot/docs/current/reference/html/howto-spring-mvc.html - */ - ObjectMapper objectMapper = new ObjectMapper(); - objectMapper.configure(com.fasterxml.jackson.databind.SerializationFeature.WRITE_EMPTY_JSON_ARRAYS, true ) - objectMapper.setSerializationInclusion(JsonInclude.Include.ALWAYS) - return objectMapper - } - - @Bean - public ObjectMapperEventListener objectMapperEventListener(){ - //Register an ObjectMapperConfigured event listener - return new ObjectMapperEventListener() - } - - - @Bean - static PropertySourcesPlaceholderConfigurer properties() throws Exception { - return new PropertySourcesPlaceholderConfigurer() - } - } -} diff --git a/swagger-contract-tests-webflux/src/test/groovy/springfox/test/contract/swaggertests/webflux/WebFluxFunctionContractSpec.groovy b/swagger-contract-tests-webflux/src/test/groovy/springfox/test/contract/swaggertests/webflux/WebFluxFunctionContractSpec.groovy deleted file mode 100644 index 7ccbc610066..00000000000 --- a/swagger-contract-tests-webflux/src/test/groovy/springfox/test/contract/swaggertests/webflux/WebFluxFunctionContractSpec.groovy +++ /dev/null @@ -1,112 +0,0 @@ -/* - * - * Copyright 2017-2019 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.test.contract.swaggertests.webflux - - -import groovy.json.JsonSlurper -import org.skyscreamer.jsonassert.JSONAssert -import org.springframework.beans.factory.annotation.Value -import org.springframework.boot.test.context.SpringBootTest -import org.springframework.boot.test.web.client.TestRestTemplate -import org.springframework.http.HttpStatus -import org.springframework.http.MediaType -import org.springframework.http.RequestEntity -import spock.lang.Shared -import spock.lang.Specification -import spock.lang.Unroll -import springfox.test.contract.swagger.webflux.SwaggerWebfluxApplication - -import static org.skyscreamer.jsonassert.JSONCompareMode.* -import static org.springframework.boot.test.context.SpringBootTest.* - -@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT, classes = SwaggerWebfluxApplication) -class WebFluxFunctionContractSpec extends Specification implements FileAccess { - - @Shared - def http = new TestRestTemplate() - - @Value('${local.server.port}') - int port - - @Unroll - def 'should honor swagger v2 resource listing #groupName'() { - given: - RequestEntity request = RequestEntity.get( - new URI("http://localhost:$port/v2/api-docs?group=$groupName")) - .accept(MediaType.APPLICATION_JSON) - .build() - String contract = fileContents("/contract/swagger2/$contractFile") - - when: - def response = http.exchange(request, String) - then: - String raw = response.body - response.statusCode == HttpStatus.OK - - def withPortReplaced = contract.replaceAll("__PORT__", "$port") - maybeWriteToFile( - "/contract/swagger2/$contractFile", - raw.replace("localhost:$port", "localhost:__PORT__")) - JSONAssert.assertEquals(withPortReplaced, raw, NON_EXTENSIBLE) - - where: - contractFile | groupName - 'swagger.json' | 'petstore' - 'swaggerTemplated.json' | 'petstoreTemplated' - 'feature-demonstration.json' | 'features' - 'bug-demonstration.json' | 'bugs' - - } - - def "should list swagger resources for swagger 2.0"() { - given: - def http = new TestRestTemplate() - RequestEntity request = RequestEntity.get(new URI("http://localhost:$port/swagger-resources")) - .accept(MediaType.APPLICATION_JSON) - .build() - - when: - def response = http.exchange(request, String) - def slurper = new JsonSlurper() - def result = slurper.parseText(response.body) - - then: - result.find { - it.name == 'petstore' && - it.url == '/v2/api-docs?group=petstore' && - it.swaggerVersion == '2.0' - } - result.find { - it.name == 'petstoreTemplated' && - it.url == '/v2/api-docs?group=petstoreTemplated' && - it.swaggerVersion == '2.0' - } - result.find { - it.name == 'bugs' && - it.url == '/v2/api-docs?group=bugs' && - it.swaggerVersion == '2.0' - } - result.find { - it.name == 'features' && - it.url == '/v2/api-docs?group=features' && - it.swaggerVersion == '2.0' - } - } -} \ No newline at end of file diff --git a/swagger-contract-tests-webflux/src/test/resources/contract/swagger2/bug-demonstration.json b/swagger-contract-tests-webflux/src/test/resources/contract/swagger2/bug-demonstration.json deleted file mode 100644 index 85a90e82e85..00000000000 --- a/swagger-contract-tests-webflux/src/test/resources/contract/swagger2/bug-demonstration.json +++ /dev/null @@ -1,94 +0,0 @@ -{ - "swagger": "2.0", - "info": { - "description": "Api Documentation", - "version": "1.0", - "title": "Api Documentation", - "termsOfService": "urn:tos", - "contact": { - - }, - "license": { - "name": "Apache 2.0", - "url": "http://www.apache.org/licenses/LICENSE-2.0" - } - }, - "host": "petstore.swagger.io", - "basePath": "/", - "tags": [ - { - "name": "web-flux-bug-controller", - "description": "Web Flux Bug Controller" - } - ], - "schemes": [ - "http", - "https" - ], - "produces": [ - "application/json", - "application/xml" - ], - "paths": { - "/bugs/bug3343": { - "get": { - "tags": [ - "web-flux-bug-controller" - ], - "summary": "List all projects", - "operationId": "getAllUsingGET", - "produces": [ - "application/json" - ], - "responses": { - "200": { - "description": "Content ready", - "schema": { - "$ref": "#/definitions/SuccessResponse«Payload»" - } - } - } - } - } - }, - "securityDefinitions": { - "api_key": { - "type": "apiKey", - "name": "api_key", - "in": "header" - }, - "petstore_auth": { - "type": "oauth2", - "authorizationUrl": "http://petstore.swagger.io/api/oauth/dialog", - "flow": "implicit", - "scopes": { - "write:pets": "modify pets in your account", - "read:pets": "read your pets" - } - } - }, - "definitions": { - "Payload": { - "type": "object", - "properties": { - "content": { - "type": "string" - } - }, - "title": "Payload" - }, - "SuccessResponse«Payload»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32" - }, - "payload": { - "$ref": "#/definitions/Payload" - } - }, - "title": "SuccessResponse«Payload»" - } - } -} \ No newline at end of file diff --git a/swagger-contract-tests-webflux/src/test/resources/contract/swagger2/feature-demonstration.json b/swagger-contract-tests-webflux/src/test/resources/contract/swagger2/feature-demonstration.json deleted file mode 100644 index 358f6ee03ac..00000000000 --- a/swagger-contract-tests-webflux/src/test/resources/contract/swagger2/feature-demonstration.json +++ /dev/null @@ -1,198 +0,0 @@ -{ - "swagger": "2.0", - "info": { - "description": "Api Documentation", - "version": "1.0", - "title": "Api Documentation", - "termsOfService": "urn:tos", - "contact": { - - }, - "license": { - "name": "Apache 2.0", - "url": "http://www.apache.org/licenses/LICENSE-2.0" - } - }, - "host": "petstore.swagger.io", - "basePath": "/", - "tags": [ - { - "name": "feature-demonstration-controller", - "description": "Feature Demonstration Controller" - } - ], - "schemes": [ - "http", - "https" - ], - "produces": [ - "application/json", - "application/xml" - ], - "paths": { - "/features/3364/{name}": { - "post": { - "tags": [ - "feature-demonstration-controller" - ], - "summary": "feature3364", - "operationId": "feature3364UsingPOST", - "consumes": [ - "multipart/form-data" - ], - "parameters": [ - { - "name": "files", - "in": "formData", - "required": false, - "type": "array", - "items": { - "type": "file" - }, - "collectionFormat": "multi" - }, - { - "name": "name", - "in": "path", - "description": "name", - "required": true, - "type": "string" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "boolean" - } - } - } - } - }, - "/features/flux{?names}": { - "get": { - "tags": [ - "feature-demonstration-controller" - ], - "summary": "helloPeople", - "operationId": "helloPeopleUsingGET_1", - "parameters": [ - { - "name": "names", - "in": "query", - "description": "names", - "required": false, - "type": "array", - "items": { - "type": "string" - }, - "collectionFormat": "multi" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "array", - "items": { - "type": "string" - } - } - } - } - } - }, - "/features/mono{?name}": { - "get": { - "tags": [ - "feature-demonstration-controller" - ], - "summary": "helloPerson", - "operationId": "helloPersonUsingGET", - "parameters": [ - { - "name": "name", - "in": "query", - "description": "name", - "required": false, - "type": "string" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "string" - } - } - } - } - }, - "/features/response-flux{?names}": { - "get": { - "tags": [ - "feature-demonstration-controller" - ], - "summary": "helloPeople", - "operationId": "helloPeopleUsingGET", - "parameters": [ - { - "name": "names", - "in": "query", - "description": "names", - "required": false, - "type": "array", - "items": { - "type": "string" - }, - "collectionFormat": "multi" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "array", - "items": { - "type": "string" - } - } - } - } - } - }, - "/features/response-mono": { - "get": { - "tags": [ - "feature-demonstration-controller" - ], - "summary": "helloMono", - "operationId": "helloMonoUsingGET", - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "string" - } - } - } - } - } - }, - "securityDefinitions": { - "api_key": { - "type": "apiKey", - "name": "api_key", - "in": "header" - }, - "petstore_auth": { - "type": "oauth2", - "authorizationUrl": "http://petstore.swagger.io/api/oauth/dialog", - "flow": "implicit", - "scopes": { - "write:pets": "modify pets in your account", - "read:pets": "read your pets" - } - } - } -} \ No newline at end of file diff --git a/swagger-contract-tests-webflux/src/test/resources/contract/swagger2/swagger.json b/swagger-contract-tests-webflux/src/test/resources/contract/swagger2/swagger.json deleted file mode 100644 index 74e6cfd8b22..00000000000 --- a/swagger-contract-tests-webflux/src/test/resources/contract/swagger2/swagger.json +++ /dev/null @@ -1,1032 +0,0 @@ -{ - "swagger": "2.0", - "info": { - "description": "Api Documentation", - "version": "1.0", - "title": "Api Documentation", - "termsOfService": "urn:tos", - "contact": { - - }, - "license": { - "name": "Apache 2.0", - "url": "http://www.apache.org/licenses/LICENSE-2.0" - } - }, - "host": "petstore.swagger.io", - "basePath": "/", - "tags": [ - { - "name": "pet-controller", - "description": "Operations about pets" - }, - { - "name": "pet-store-resource", - "description": "Operations about store" - }, - { - "name": "user-controller", - "description": "Operations about user" - } - ], - "schemes": [ - "http", - "https" - ], - "produces": [ - "application/json", - "application/xml" - ], - "paths": { - "/api/pet": { - "post": { - "tags": [ - "pet-controller" - ], - "summary": "Add a new pet to the store", - "operationId": "addPetUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "application/json", - "application/xml" - ], - "parameters": [ - { - "in": "body", - "name": "pet", - "description": "Pet object that needs to be added to the store", - "required": true, - "schema": { - "$ref": "#/definitions/PetReq" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "string" - } - }, - "405": { - "description": "Invalid input" - } - }, - "security": [ - { - "petstore_auth": [ - "write:pets", - "read:pets" - ] - } - ] - }, - "put": { - "tags": [ - "pet-controller" - ], - "summary": "Update an existing pet", - "operationId": "updatePetUsingPUT", - "consumes": [ - "application/json" - ], - "produces": [ - "application/json", - "application/xml" - ], - "parameters": [ - { - "in": "body", - "name": "pet", - "description": "Pet object that needs to be added to the store", - "required": true, - "schema": { - "$ref": "#/definitions/PetReq" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "string" - } - }, - "400": { - "description": "Invalid ID supplied" - }, - "404": { - "description": "Pet not found" - }, - "405": { - "description": "Validation exception" - } - }, - "security": [ - { - "petstore_auth": [ - "write:pets", - "read:pets" - ] - } - ] - } - }, - "/api/pet/findByStatus": { - "get": { - "tags": [ - "pet-controller" - ], - "summary": "Finds Pets by status", - "description": "Multiple status values can be provided with comma-separated strings", - "operationId": "findPetsByStatusUsingGET", - "produces": [ - "application/json", - "application/xml" - ], - "parameters": [ - { - "name": "status", - "in": "query", - "description": "Status values that need to be considered for filter", - "required": true, - "type": "string", - "default": "available", - "enum": [ - "available", - "pending", - "sold" - ] - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/PetRes" - } - } - }, - "400": { - "description": "Invalid status value" - } - }, - "security": [ - { - "petstore_auth": [ - "write:pets", - "read:pets" - ] - } - ] - } - }, - "/api/pet/findByTags": { - "get": { - "tags": [ - "pet-controller" - ], - "summary": "Finds Pets by tags", - "description": "Multiple tags can be provided with comma-separated strings. Use tag1, tag2, tag3 for testing.", - "operationId": "findPetsByTagsUsingGET", - "produces": [ - "application/json", - "application/xml" - ], - "parameters": [ - { - "name": "tags", - "in": "query", - "description": "Tags to filter by", - "required": true, - "type": "string" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/PetRes" - } - } - }, - "400": { - "description": "Invalid tag value" - } - }, - "security": [ - { - "petstore_auth": [ - "write:pets", - "read:pets" - ] - } - ], - "deprecated": true - } - }, - "/api/pet/{petId}": { - "get": { - "tags": [ - "pet-controller" - ], - "summary": "Find pet by ID", - "description": "Returns a pet when ID < 10. ID > 10 or non-integers will simulate API error conditions", - "operationId": "getPetByIdUsingGET", - "produces": [ - "application/json", - "application/xml" - ], - "parameters": [ - { - "name": "petId", - "in": "path", - "description": "ID of pet that needs to be fetched", - "required": true, - "type": "string", - "maxLength": 5, - "minLength": 1 - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/PetRes" - } - }, - "400": { - "description": "Invalid ID supplied", - "headers": { - "header4": { - "type": "string" - }, - "header3": { - "type": "string" - }, - "header2": { - "type": "string" - }, - "header1": { - "type": "string" - } - } - }, - "404": { - "description": "Pet not found", - "headers": { - "header4": { - "type": "string" - }, - "header3": { - "type": "string" - } - } - } - }, - "security": [ - { - "petstore_auth": [ - "write:pets", - "read:pets" - ] - }, - { - "api_key": [ - - ] - } - ] - } - }, - "/api/store/order": { - "post": { - "tags": [ - "pet-store-resource" - ], - "summary": "Place an order for a pet", - "operationId": "placeOrderUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "application/json" - ], - "parameters": [ - { - "name": "complete", - "in": "query", - "required": false, - "type": "boolean" - }, - { - "name": "id", - "in": "query", - "required": false, - "type": "integer", - "format": "int64" - }, - { - "name": "identifier", - "in": "query", - "required": false, - "type": "integer", - "format": "int64" - }, - { - "name": "petId", - "in": "query", - "required": false, - "type": "integer", - "format": "int64" - }, - { - "name": "quantity", - "in": "query", - "required": false, - "type": "integer", - "format": "int32" - }, - { - "name": "shipDate", - "in": "query", - "required": false, - "type": "string", - "format": "date-time" - }, - { - "name": "status", - "in": "query", - "description": "Order Status", - "required": false, - "type": "string", - "enum": [ - "approved", - "delivered", - "placed" - ] - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "string" - } - }, - "400": { - "description": "Invalid Order" - } - } - } - }, - "/api/store/order/{orderId}": { - "get": { - "tags": [ - "Pet Store" - ], - "summary": "Find purchase order by ID", - "description": "For valid response try integer IDs with value <= 5 or > 10. Other values will generated exceptions", - "operationId": "getOrderByIdUsingGET", - "produces": [ - "application/json" - ], - "parameters": [ - { - "name": "orderId", - "in": "path", - "description": "ID of pet that needs to be fetched", - "required": true, - "type": "string", - "maxLength": 5, - "minLength": 1 - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/Order" - } - }, - "400": { - "description": "Invalid ID supplied" - }, - "404": { - "description": "Order not found" - } - } - }, - "delete": { - "tags": [ - "pet-store-resource" - ], - "summary": "Delete purchase order by ID", - "description": "For valid response try integer IDs with value < 1000. Anything above 1000 or non-integers will generate API errors", - "operationId": "deleteOrderUsingDELETE", - "produces": [ - "application/json" - ], - "parameters": [ - { - "name": "orderId", - "in": "path", - "description": "ID of the order that needs to be deleted", - "required": true, - "type": "string", - "minLength": 1 - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "string" - } - }, - "400": { - "description": "Invalid ID supplied" - }, - "404": { - "description": "Order not found" - } - } - } - }, - "/api/user": { - "post": { - "tags": [ - "user-controller" - ], - "summary": "Create user", - "description": "This can only be done by the logged in user.", - "operationId": "createUserUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "application/json" - ], - "parameters": [ - { - "in": "body", - "name": "user", - "description": "Created user object", - "required": true, - "schema": { - "$ref": "#/definitions/UserReq" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/UserRes" - } - } - } - } - }, - "/api/user/createWithArray": { - "post": { - "tags": [ - "user-controller" - ], - "summary": "Creates list of users with given input array", - "operationId": "createUsersWithArrayInputUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "application/json" - ], - "parameters": [ - { - "in": "body", - "name": "users", - "description": "List of user object", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/UserRes" - } - } - } - } - }, - "/api/user/createWithList": { - "post": { - "tags": [ - "user-controller" - ], - "summary": "Creates list of users with given input array", - "operationId": "createUsersWithListInputUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "application/json" - ], - "parameters": [ - { - "in": "body", - "name": "users", - "description": "List of user object", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "string" - } - } - } - } - }, - "/api/user/login": { - "get": { - "tags": [ - "user-controller" - ], - "summary": "Logs user into the system", - "operationId": "loginUserUsingGET", - "produces": [ - "application/json" - ], - "parameters": [ - { - "name": "password", - "in": "query", - "description": "The password for login in clear text", - "required": true, - "type": "string" - }, - { - "name": "username", - "in": "query", - "description": "The user name for login", - "required": true, - "type": "string" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "string" - } - }, - "400": { - "description": "Invalid username/password supplied" - } - } - } - }, - "/api/user/logout": { - "get": { - "tags": [ - "user-controller" - ], - "summary": "Logs out current logged in user session", - "operationId": "logoutUserUsingGET", - "produces": [ - "application/json" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "string" - } - } - } - } - }, - "/api/user/{username}": { - "get": { - "tags": [ - "user-controller" - ], - "summary": "Get user by user name", - "operationId": "getUserByNameUsingGET", - "produces": [ - "application/json" - ], - "parameters": [ - { - "name": "username", - "in": "path", - "description": "The name that needs to be fetched. Use user1 for testing. ", - "required": true, - "type": "string" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/UserRes" - } - }, - "400": { - "description": "Invalid username supplied" - }, - "404": { - "description": "User not found" - } - } - }, - "put": { - "tags": [ - "user-controller" - ], - "summary": "Updated user", - "description": "This can only be done by the logged in user.", - "operationId": "updateUserUsingPUT", - "consumes": [ - "application/json" - ], - "produces": [ - "application/json" - ], - "parameters": [ - { - "name": "email", - "in": "query", - "required": false, - "type": "string" - }, - { - "name": "firstName", - "in": "query", - "required": false, - "type": "string" - }, - { - "name": "id", - "in": "query", - "required": false, - "type": "integer", - "format": "int64" - }, - { - "name": "identifier", - "in": "query", - "required": false, - "type": "string" - }, - { - "name": "lastName", - "in": "query", - "required": false, - "type": "string" - }, - { - "name": "password", - "in": "query", - "required": false, - "type": "string" - }, - { - "name": "phone", - "in": "query", - "required": false, - "type": "string" - }, - { - "name": "username", - "in": "path", - "description": "name that need to be deleted", - "required": true, - "type": "string" - }, - { - "name": "userStatus", - "in": "query", - "description": "User Status", - "required": false, - "type": "integer", - "format": "int32", - "enum": [ - "1-registered", - "2-active", - "3-closed" - ] - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "string" - } - }, - "400": { - "description": "Invalid user supplied" - }, - "404": { - "description": "User not found" - } - } - }, - "delete": { - "tags": [ - "user-controller" - ], - "summary": "Delete user", - "description": "This can only be done by the logged in user.", - "operationId": "deleteUserUsingDELETE", - "produces": [ - "application/json" - ], - "parameters": [ - { - "name": "username", - "in": "path", - "description": "The name that needs to be deleted", - "required": true, - "type": "string" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "string" - } - }, - "400": { - "description": "Invalid username supplied" - }, - "404": { - "description": "User not found" - } - } - } - } - }, - "securityDefinitions": { - "api_key": { - "type": "apiKey", - "name": "api_key", - "in": "header" - }, - "petstore_auth": { - "type": "oauth2", - "authorizationUrl": "http://petstore.swagger.io/api/oauth/dialog", - "flow": "implicit", - "scopes": { - "write:pets": "modify pets in your account", - "read:pets": "read your pets" - } - } - }, - "definitions": { - "CategoryReq": { - "type": "object", - "required": [ - "id" - ], - "properties": { - "id": { - "type": "integer", - "format": "int64" - }, - "name": { - "type": "string" - } - }, - "title": "CategoryReq" - }, - "CategoryRes": { - "type": "object", - "properties": { - "id": { - "type": "integer", - "format": "int64" - }, - "name": { - "type": "string" - } - }, - "title": "CategoryRes" - }, - "Order": { - "type": "object", - "properties": { - "complete": { - "type": "boolean" - }, - "id": { - "type": "integer", - "format": "int64" - }, - "identifier": { - "type": "integer", - "format": "int64" - }, - "petId": { - "type": "integer", - "format": "int64" - }, - "quantity": { - "type": "integer", - "format": "int32" - }, - "shipDate": { - "type": "string", - "format": "date-time" - }, - "status": { - "type": "string", - "description": "Order Status", - "enum": [ - "approved", - "delivered", - "placed" - ] - } - }, - "title": "Order" - }, - "PetReq": { - "type": "object", - "properties": { - "category": { - "$ref": "#/definitions/CategoryReq" - }, - "id": { - "type": "integer", - "format": "int64" - }, - "name": { - "type": "string" - }, - "photoUrls": { - "type": "array", - "items": { - "type": "string" - } - }, - "status": { - "type": "string", - "description": "pet status in the store", - "enum": [ - "available", - "pending", - "sold" - ] - }, - "tags": { - "type": "array", - "items": { - "$ref": "#/definitions/Tag" - } - } - }, - "title": "PetReq" - }, - "PetRes": { - "type": "object", - "properties": { - "category": { - "$ref": "#/definitions/CategoryRes" - }, - "id": { - "type": "integer", - "format": "int64" - }, - "identifier": { - "type": "integer", - "format": "int64" - }, - "name": { - "type": "string" - }, - "photoUrls": { - "type": "array", - "items": { - "type": "string" - } - }, - "status": { - "type": "string", - "description": "pet status in the store", - "enum": [ - "available", - "pending", - "sold" - ] - }, - "tags": { - "type": "array", - "items": { - "$ref": "#/definitions/Tag" - } - } - }, - "title": "PetRes" - }, - "Tag": { - "type": "object", - "properties": { - "id": { - "type": "integer", - "format": "int64" - }, - "name": { - "type": "string" - } - }, - "title": "Tag" - }, - "UserReq": { - "type": "object", - "properties": { - "email": { - "type": "string" - }, - "firstName": { - "type": "string" - }, - "id": { - "type": "integer", - "format": "int64" - }, - "lastName": { - "type": "string" - }, - "password": { - "type": "string" - }, - "phone": { - "type": "string" - }, - "userStatus": { - "type": "integer", - "format": "int32", - "description": "User Status" - }, - "username": { - "type": "string" - } - }, - "title": "UserReq" - }, - "UserRes": { - "type": "object", - "properties": { - "email": { - "type": "string" - }, - "firstName": { - "type": "string" - }, - "id": { - "type": "integer", - "format": "int64" - }, - "identifier": { - "type": "string" - }, - "lastName": { - "type": "string" - }, - "password": { - "type": "string" - }, - "phone": { - "type": "string" - }, - "userStatus": { - "type": "integer", - "format": "int32", - "description": "User Status" - }, - "username": { - "type": "string" - } - }, - "title": "UserRes" - } - } -} \ No newline at end of file diff --git a/swagger-contract-tests-webflux/src/test/resources/contract/swagger2/swaggerTemplated.json b/swagger-contract-tests-webflux/src/test/resources/contract/swagger2/swaggerTemplated.json deleted file mode 100644 index fae3d462766..00000000000 --- a/swagger-contract-tests-webflux/src/test/resources/contract/swagger2/swaggerTemplated.json +++ /dev/null @@ -1,183 +0,0 @@ -{ - "swagger": "2.0", - "info": { - "description": "Api Documentation", - "version": "1.0", - "title": "Api Documentation", - "termsOfService": "urn:tos", - "contact": { - - }, - "license": { - "name": "Apache 2.0", - "url": "http://www.apache.org/licenses/LICENSE-2.0" - } - }, - "host": "petstore.swagger.io", - "basePath": "/", - "tags": [ - { - "name": "pet-store-resource", - "description": "Operations about store" - } - ], - "schemes": [ - "http", - "https" - ], - "produces": [ - "application/json", - "application/xml" - ], - "paths": { - "/api/store/search?x=CA": { - "get": { - "tags": [ - "pet-store-resource" - ], - "summary": "getPetInCA", - "operationId": "getPetInCAUsingGET", - "produces": [ - "application/json" - ], - "parameters": [ - { - "name": "x", - "in": "query", - "required": true, - "type": "string", - "default": "CA", - "enum": [ - "CA" - ] - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/Pet" - } - } - } - } - }, - "/api/store/search?x=TX": { - "get": { - "tags": [ - "pet-store-resource" - ], - "summary": "getPetInTx", - "operationId": "getPetInTxUsingGET", - "produces": [ - "application/json" - ], - "parameters": [ - { - "name": "x", - "in": "query", - "required": true, - "type": "string", - "default": "TX", - "enum": [ - "TX" - ] - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/Pet" - } - } - } - } - } - }, - "securityDefinitions": { - "api_key": { - "type": "apiKey", - "name": "api_key", - "in": "header" - }, - "petstore_auth": { - "type": "oauth2", - "authorizationUrl": "http://petstore.swagger.io/api/oauth/dialog", - "flow": "implicit", - "scopes": { - "write:pets": "modify pets in your account", - "read:pets": "read your pets" - } - } - }, - "definitions": { - "Category": { - "type": "object", - "properties": { - "id": { - "type": "integer", - "format": "int64" - }, - "name": { - "type": "string" - } - }, - "title": "Category" - }, - "Pet": { - "type": "object", - "properties": { - "category": { - "$ref": "#/definitions/Category" - }, - "id": { - "type": "integer", - "format": "int64" - }, - "identifier": { - "type": "integer", - "format": "int64" - }, - "name": { - "type": "string" - }, - "photoUrls": { - "type": "array", - "items": { - "type": "string" - } - }, - "status": { - "type": "string", - "description": "pet status in the store", - "enum": [ - "available", - "pending", - "sold" - ] - }, - "tags": { - "type": "array", - "items": { - "$ref": "#/definitions/Tag" - } - } - }, - "title": "Pet" - }, - "Tag": { - "type": "object", - "properties": { - "id": { - "type": "integer", - "format": "int64" - }, - "name": { - "type": "string" - } - }, - "title": "Tag" - } - } -} \ No newline at end of file diff --git a/swagger-contract-tests/README.md b/swagger-contract-tests/README.md deleted file mode 100644 index 0327875c728..00000000000 --- a/swagger-contract-tests/README.md +++ /dev/null @@ -1,9 +0,0 @@ -### swagger-contract-tests - -```bash -./gradlew swagger-contract-tests:bootRun -``` - -- http://localhost:8080/sdoc.jsp - -To view the petstore APIs http://localhost:8080/api-docs?group=petstore \ No newline at end of file diff --git a/swagger-contract-tests/build.gradle b/swagger-contract-tests/build.gradle deleted file mode 100644 index 70aa28fd962..00000000000 --- a/swagger-contract-tests/build.gradle +++ /dev/null @@ -1,48 +0,0 @@ -buildscript { - ext { - springBootVersion = '3.0.0' - } - repositories { - mavenCentral() - } - dependencies { - classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}") - } -} - -apply plugin: 'org.springframework.boot' -apply plugin: 'io.spring.dependency-management' - -configurations { - //Logback causing spring boot errors - all*.exclude group: 'ch.qos.logback' -} - -dependencies { - implementation "org.springframework.boot:spring-boot-starter-web" - implementation "org.springframework.boot:spring-boot-starter-data-rest" - implementation "org.springframework.boot:spring-boot-starter-data-jpa" - implementation "com.h2database:h2" - implementation "org.apache.groovy:groovy-all:$groovy" - implementation libs.clientProvided - implementation "javax.validation:validation-api:$validationApiVersion" - implementation 'org.slf4j:slf4j-simple:1.7.30' - - testImplementation libs.test - testImplementation "org.skyscreamer:jsonassert:${jsonAssert}" - testImplementation "org.springframework.boot:spring-boot-starter-test" - - implementation project(':springfox-swagger1') - implementation project(':springfox-swagger2') - implementation project(':springfox-data-rest') - implementation project(':springfox-petstore') - implementation project(':springfox-bean-validators') - -} -// tag::update-contract-tests[] -// NOTE: Uncomment to bulk update contracts -//test { -// systemProperty("contract.tests.root", "$projectDir/src/test/resources") -// systemProperty("contract.tests.update", true) -//} -// end::update-contract-tests[] \ No newline at end of file diff --git a/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/AbstractController.java b/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/AbstractController.java deleted file mode 100644 index f04da1153af..00000000000 --- a/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/AbstractController.java +++ /dev/null @@ -1,49 +0,0 @@ -/* - * - * Copyright 2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.test.contract.swagger; - -import io.swagger.annotations.ApiResponse; -import io.swagger.annotations.ApiResponses; -import org.springframework.hateoas.RepresentationModel; -import org.springframework.http.HttpEntity; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestMethod; - -public abstract class AbstractController { - - @RequestMapping(value = "/create-t", method = RequestMethod.PUT) - public void create(@RequestBody T toCreate) { - throw new UnsupportedOperationException(); - } - - @RequestMapping(value = "/get-t/{id}", method = RequestMethod.GET) - @ApiResponses(value = { @ApiResponse(code = 405, message = "Invalid input") }) - public T get(@PathVariable("id") ID id) { - throw new UnsupportedOperationException(); - } - - @RequestMapping(value = "/delete-t/{id}", method = RequestMethod.DELETE) - @ApiResponses(value = { @ApiResponse(code = 405, message = "Invalid input") }) - public HttpEntity delete(@PathVariable("id") ID id) { - throw new UnsupportedOperationException(); - } -} diff --git a/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/AbstractPetService.java b/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/AbstractPetService.java deleted file mode 100644 index 0f03f1729d3..00000000000 --- a/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/AbstractPetService.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * - * Copyright 2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.test.contract.swagger; - -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestMethod; -import org.springframework.web.bind.annotation.ResponseBody; -import springfox.test.contract.swagger.models.Pet; - -public abstract class AbstractPetService { - - // some dependency here - // some crud here - // e.g. - @RequestMapping(method = RequestMethod.POST) - @ResponseBody - public int createObject(@RequestBody T object) { - // do some logic here - return 1; - } -} - diff --git a/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/Bug1767ListingScanner.java b/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/Bug1767ListingScanner.java deleted file mode 100644 index 6bd3ffbc7af..00000000000 --- a/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/Bug1767ListingScanner.java +++ /dev/null @@ -1,176 +0,0 @@ -/* - * - * Copyright 2017-2019 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ -package springfox.test.contract.swagger; - -import com.fasterxml.classmate.TypeResolver; -import org.springframework.http.HttpMethod; -import org.springframework.http.MediaType; -import springfox.documentation.builders.OperationBuilder; -import springfox.documentation.builders.RequestParameterBuilder; -import springfox.documentation.builders.ResponseBuilder; -import springfox.documentation.schema.ScalarType; -import springfox.documentation.service.ApiDescription; -import springfox.documentation.service.ParameterType; -import springfox.documentation.service.Response; -import springfox.documentation.spi.DocumentationType; -import springfox.documentation.spi.service.ApiListingScannerPlugin; -import springfox.documentation.spi.service.contexts.DocumentationContext; -import springfox.documentation.spring.web.readers.operation.CachingOperationNameGenerator; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.Collections; -import java.util.List; -import java.util.Set; - -import static java.util.Collections.*; - -@SuppressWarnings({ - "WhitespaceAround", - "ParenPad", - "deprecation"}) -public class Bug1767ListingScanner implements ApiListingScannerPlugin { - - // tag::api-listing-plugin[] - private final CachingOperationNameGenerator operationNames; - - /** - * @param operationNames - CachingOperationNameGenerator is a component bean - * that is available to be autowired - */ - public Bug1767ListingScanner(CachingOperationNameGenerator operationNames) {//<9> - this.operationNames = operationNames; - } - - @Override - public List apply(DocumentationContext context) { - return new ArrayList<>( - Arrays.asList( //<1> - new ApiDescription( - "test", - "/bugs/1767", - "This is a bug summary", - "This is a bug", - Collections.singletonList( //<2> - new OperationBuilder(operationNames) - .authorizations(new ArrayList<>()) - .codegenMethodNameStem("bug1767GET") //<3> - .method(HttpMethod.GET) - .notes("This is a test method") - .parameters( - Collections.singletonList( //<4> - new springfox.documentation.builders.ParameterBuilder() - .description( - "search by " - + "description") - .type(new TypeResolver() - .resolve(String.class)) - .name("description") - .parameterType("query") - .parameterAccess("access") - .required(true) - .modelRef(new springfox.documentation.schema.ModelRef( - "string")) //<5> - .build())) - .requestParameters( - Collections.singletonList( //<4a> - new RequestParameterBuilder() - .description("search by description") - .name("description") - .required(true) - .in(ParameterType.QUERY) - .query(q -> q.model(m -> m.scalarModel(ScalarType.STRING))) //<5b> - .build())) - .responses(responseMessages()) //<6> - .responseModel(new springfox.documentation.schema.ModelRef("string")) //<7> - .responses(responses()) //<6b> - .build()), - false), - new ApiDescription( - "different-group", - //<8> - "/different/2219", - "This is a bug summary", - "This is a bug", - Collections.singletonList( - new OperationBuilder( - operationNames) - .authorizations(new ArrayList<>()) - .codegenMethodNameStem("bug2219GET") - .method(HttpMethod.GET) - .notes("This is a test method") - .parameters( - Collections.singletonList( - new springfox.documentation.builders.ParameterBuilder() - .description("description of bug 2219") - .type(new TypeResolver().resolve(String.class)) - .name("description") - .parameterType("query") - .parameterAccess("access") - .required(true) - .modelRef(new springfox.documentation.schema.ModelRef("string")) - .build())) - .requestParameters( - Collections.singletonList( - new RequestParameterBuilder() - .description("description of bug 2219") - .name("description") - .in("query") - .required(true) - .query(q -> q.model(m -> m.scalarModel(ScalarType.STRING))) - .build())) - .responses(responseMessages()) - .responseModel(new springfox.documentation.schema.ModelRef("string")) - .build()), - false))); - } - - /** - * @return Set of response messages that overide the default/global response messages - */ - private Set responseMessages() { //<8> - return singleton(new springfox.documentation.builders.ResponseBuilder() - .code("200") - .description("Successfully received bug 1767 or 2219 response") - .representation(MediaType.TEXT_PLAIN) - .apply(r -> r.model(m -> m.scalarModel(ScalarType.STRING))) - .build()); - } - - /** - * @return Set of response messages that overide the default/global response messages - */ - private Collection responses() { //<8b> - return singletonList(new ResponseBuilder() - .code("200") - .description("Successfully received bug 1767 or 2219 response") - .representation(MediaType.ALL) - .apply(r -> r.model(m -> m.scalarModel(ScalarType.STRING)) - .build()) - .build()); - } - // end::api-listing-plugin[] - - @Override - public boolean supports(DocumentationType delimiter) { - return DocumentationType.SWAGGER_2.equals(delimiter); - } - -} diff --git a/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/BugsController.java b/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/BugsController.java deleted file mode 100644 index 755d17a2939..00000000000 --- a/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/BugsController.java +++ /dev/null @@ -1,1205 +0,0 @@ -/* - * - * Copyright 2015-2019 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ -package springfox.test.contract.swagger; - -import com.fasterxml.jackson.annotation.JsonCreator; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.JsonUnwrapped; -import com.fasterxml.jackson.annotation.JsonView; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiImplicitParam; -import io.swagger.annotations.ApiImplicitParams; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import io.swagger.annotations.ApiOperation; -import io.swagger.annotations.ApiParam; -import io.swagger.annotations.ApiResponse; -import io.swagger.annotations.ApiResponses; -import io.swagger.annotations.Authorization; -import io.swagger.annotations.AuthorizationScope; -import io.swagger.annotations.ExampleProperty; -import io.swagger.annotations.ResponseHeader; -import org.springframework.hateoas.EntityModel; -import org.springframework.http.MediaType; -import org.springframework.http.ResponseEntity; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.ModelAttribute; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestMethod; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RequestPart; -import org.springframework.web.bind.annotation.RestController; -import org.springframework.web.multipart.MultipartFile; -import org.springframework.web.servlet.ModelAndView; -import springfox.documentation.annotations.ApiIgnore; -import springfox.test.contract.swagger.models.Bug1370; -import springfox.test.contract.swagger.models.Bug1749; -import springfox.test.contract.swagger.models.Bug2767; -import springfox.test.contract.swagger.models.Bug3087; -import springfox.test.contract.swagger.models.Bug3353; -import springfox.test.contract.swagger.models.EHDTOApplicatorUnits; -import springfox.test.contract.swagger.models.EnumType; -import springfox.test.contract.swagger.models.Example; -import springfox.test.contract.swagger.models.LanguageResponse; -import springfox.test.contract.swagger.models.Pet; - -import jakarta.servlet.http.HttpServletRequest; -import jakarta.servlet.http.HttpServletResponse; -import javax.validation.Valid; -import javax.validation.constraints.NotNull; -import javax.validation.constraints.Pattern; -import javax.validation.constraints.Size; -import javax.xml.bind.annotation.XmlAttribute; -import javax.xml.bind.annotation.XmlElement; -import javax.xml.bind.annotation.XmlType; -import javax.xml.ws.Response; -import java.beans.ConstructorProperties; -import java.net.MalformedURLException; -import java.net.URI; -import java.net.URL; -import java.nio.ByteBuffer; -import java.sql.Date; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.Optional; -import java.util.Set; -import java.util.UUID; - -import static org.springframework.http.MediaType.*; -import static org.springframework.web.bind.annotation.RequestMethod.*; - -@Api(tags = "Bugs") -@RestController -@RequestMapping("/bugs") -@SuppressWarnings("deprecation") -public class BugsController { - @RequestMapping(value = "1306", method = POST) - public ResponseEntity> bug1306(@RequestParam Map paramMap) { - return ResponseEntity.ok(null); - } - - @PostMapping(path = "/3351/{id}") - public ResponseEntity createPost( - @PathVariable final int id, - @RequestBody final Pet post) { - return ResponseEntity.ok("Success"); - } - - @ApiImplicitParams( - @ApiImplicitParam(name = "custom-header", - dataTypeClass = String.class, - allowMultiple = true, - paramType = "header") - ) - @RequestMapping(value = "1209", method = POST) - public ResponseEntity bug1209() { - return ResponseEntity.ok(""); - } - - @RequestMapping(value = "1162", method = POST) - public ResponseEntity bug1162() { - return ResponseEntity.ok(new Date(new java.util.Date().getTime())); - } - - @RequestMapping(value = "1376-bare", method = POST) - public URL issue1376Bare() throws MalformedURLException { - return new URL("http://example.org"); - } - - @RequestMapping(value = "1376-property", method = POST) - public Bug1376 issue1376Property() throws MalformedURLException { - return new Bug1376(new URL("http://example.org")); - } - - @RequestMapping(value = "1376-input-bare", method = POST) - public void issue1376Input(URL url) throws MalformedURLException { - } - - @RequestMapping(value = "1376-input-property", method = POST) - public void issue1376Input(Bug1376 bug) throws MalformedURLException { - } - - @RequestMapping(value = "1420", method = GET) - @ApiOperation(tags = {"foo"}, value = "issue1420") - public String issue1420() { - return "1420"; - } - - @RequestMapping(value = "1440", method = GET) - public EntityModel issue1440() { - return new EntityModel<>("1420"); - } - - @RequestMapping(value = "1475", method = GET) - public Map> mapOfLists() { - throw new UnsupportedOperationException(); - } - - @RequestMapping(value = "1475-example", method = GET) - public Map> mapOfListOfExample() { - throw new UnsupportedOperationException(); - } - - @RequestMapping(value = "1605", method = GET) - public byte[] byteArrayResponse() { - throw new UnsupportedOperationException(); - } - - @RequestMapping(value = "1676", method = GET) - public void apiModelProperty(@RequestBody Bug1676 value) { - throw new UnsupportedOperationException(); - } - - @RequestMapping(value = "1632", method = GET) - public void fileCustomType(@RequestBody File value) { - throw new UnsupportedOperationException(); - } - - @RequestMapping(value = "1632s", method = GET) - public void filesCustomType(@RequestBody List values) { - throw new UnsupportedOperationException(); - } - - @RequestMapping(value = "1697", method = GET) - public void payloadWithByteBuffer(@RequestBody Bug1697 body) { - throw new UnsupportedOperationException(); - } - - @RequestMapping(value = "1627", method = GET) - public void bug1627(@RequestBody Bug1627 body) { - throw new UnsupportedOperationException(); - } - - @RequestMapping(value = "2081", method = GET) - public void bug2081(Bug2081 criteria) { - throw new UnsupportedOperationException(); - } - - @ApiOperation(value = "Remove an apple from a user", notes = "Remove an apple from a user. You must specify the " - + "user name and the apple name.", response = Void.class, consumes = "application/json, application/xml", - produces = "application/json, application/xml") - @ApiResponses({@ApiResponse(code = 200, message = "The apple is removed")}) - @RequestMapping(value = "1722", method = POST) - public void bug1722(@RequestBody String test) { - } - - @RequestMapping(value = "1734", method = GET) - public void bug1734( - @ApiParam(name = "offset", value = "The value of offset", defaultValue = "0") - @RequestParam(value = "offset", defaultValue = "0", required = false) - int offset) { - throw new UnsupportedOperationException(); - } - - @RequestMapping(value = "1740", method = GET) - public Bug1740 bug1740() { - return new Bug1740(); - } - - @ApiResponses(value = { - @ApiResponse(code = 200, - message = "list of ids", - response = String.class), - @ApiResponse(code = 204, - message = "no ids found", - response = Void.class) - }) - @RequestMapping(value = "/1750a", method = GET) - public ResponseEntity bug1750a() { - throw new UnsupportedOperationException(); - } - - @ApiOperation(value = "1750b", response = String.class) - @ApiResponses(value = { - @ApiResponse(code = 200, - message = "list of ids", - response = String.class), - @ApiResponse(code = 204, - message = "no ids found", - response = Void.class) - }) - @RequestMapping(value = "/1750b", method = GET) - public ResponseEntity bug1750b() { - throw new UnsupportedOperationException(); - } - - @RequestMapping(value = "/1777", method = GET) - public ResponseEntity bug1777() { - throw new UnsupportedOperationException(); - } - - - @RequestMapping(value = "/1778", method = GET) - public ResponseEntity bug1778( - TestClass testClass, - TestClass2 testClass2) { - return ResponseEntity.ok().build(); - } - - @ApiOperation(value = "Retrieve all the companies") - @RequestMapping(value = "/1749", method = GET) - public List getAllPaged( - @Valid Bug1749 request, - HttpServletResponse response, - @RequestParam(required = false) String email, - @RequestParam(required = false) String companyName, - @RequestParam(required = false) Boolean like) throws Exception { - throw new UnsupportedOperationException(); - } - - @RequestMapping(value = "/1819a", method = PUT) - public void modelWithListOfEnumsAsJson(@RequestBody Model1819 model) { - } - - @RequestMapping(value = "/1819b", method = POST) - public void modelWithListOfEnumsAsModelAttribute(@ModelAttribute Model1819 model) { - } - - @GetMapping("/1864") - public void test(@Valid Model1864 req) { - - } - - @GetMapping(value = "/1841", produces = APPLICATION_ATOM_XML_VALUE) - public void method1() { - } - - @GetMapping(value = "/1841", produces = APPLICATION_JSON_UTF8_VALUE) - public void method2() { - } - - @RequestMapping(value = "/1939", - method = GET, - produces = "application/jwt") - @ApiOperation(value = "authenticate a user using a given set of " - + "credentials, producing a JWT token that may be " - + "used for future API operations if successful") - @Valid - public ResponseEntity - authenticate( - @RequestParam("username") - String username, - @RequestParam("password") - String password, - @RequestParam(required = false, name = "credential-source-id") - String credentialSourceID) { - return ResponseEntity.ok("Success!"); - } - - @GetMapping(value = "/1907", produces = APPLICATION_XML_VALUE) - public void xmlPayload(@RequestBody Model1907 xml) { - } - - @RequestMapping(path = "/2114", method = PUT) - ResponseEntity bug2114( - @PathVariable(value = "siteId") UUID siteId, - @RequestParam(value = "siteSecret") UUID siteSecret, - @RequestParam(value = "xmlUrl") URI xmlUrl, - @RequestParam(value = "stripHtmlTags", required = false, defaultValue = "false") Boolean stripHtmlTags, - @RequestParam(value = "clearIndex", required = false, defaultValue = "false") Boolean clearIndex - ) { - return null; - } - - @RequestMapping(value = "/2118", method = GET) - public String bug2118(@RequestBody @ModelAttribute Example person) { - return "ok"; - } - - @RequestMapping(method = GET, path = "{propertyKey}/{environmentKey}") - public ResponseEntity getProperty( - @ApiParam(name = "propertyKey", value = "Key of the property", required = true) - @PathVariable("propertyKey") Key propertyKey, - @ApiParam(name = "environmentKey", value = "Key of the environment", required = false) - @PathVariable("environmentKey") Key environmentKey - ) { - return ResponseEntity.ok(""); - } - - @ApiOperation(value = "2107") - @GetMapping(value = "/2107/{someId}", produces = APPLICATION_JSON_VALUE) - public String getSomeById( - @ApiParam(value = "This is the description", defaultValue = "1f1f1f", required = true, name = "someId", type = - "java.lang.String") - @PathVariable("someId") Id someId) { - return ""; - } - - @RequestMapping(value = "/1894", method = POST) - public void cacheEvict1() { - - } - - @RequestMapping(value = "/1894", method = POST, consumes = APPLICATION_FORM_URLENCODED_VALUE) - public void cacheEvict2() { - - } - - @PostMapping(value = "/1887/{env}/{list-id}/emails", - produces = APPLICATION_JSON_UTF8_VALUE, - consumes = APPLICATION_JSON_UTF8_VALUE) - @ApiOperation(value = "1887 example", response = Example.class) - public ResponseEntity>> addEmailsToList( - @PathVariable String env, - @PathVariable("list-id") String listId, - @RequestBody List emails) { - return ResponseEntity.ok(null); - } - - @PostMapping(path = "/1965-form-data", consumes = "multipart/form-data") - public ResponseEntity bug1965FormData(Example sfData) { - return ResponseEntity.ok(null); - } - - @PostMapping(path = "/1965", consumes = "multipart/form-data") - public ResponseEntity bug1965( - @Valid @RequestPart(name = "sfParamMap") @RequestParam Map paramMap, - @Valid @RequestPart(name = "sfId") @RequestParam Integer sfId, - @Valid @RequestPart(name = "sfData") Example sfData, - @RequestPart(name = "file", required = false) MultipartFile supportFile) { - return ResponseEntity.ok(null); - } - - @GetMapping("/1926/filtered") - public Lang filtered(@RequestBody LangNotFilteredWrapper wrapper) { - return null; - } - - @GetMapping("/1926/not-filtered") - public Lang notFiltered(@RequestBody LangFilteredWrapper wrapper) { - return null; - } - - @ApiOperation(value = "测试RequesetParam", notes = "测试RequesetParam") - @ApiImplicitParams({ - @ApiImplicitParam(name = "date", - value = "日期:2017-09-01", - required = true, - dataTypeClass = String.class, - paramType = - "path"), - @ApiImplicitParam(name = "name", value = "名称", required = false, dataTypeClass = String.class) - }) - @GetMapping("/2029") - public String bug2020( - @RequestParam(required = true, value = "date") String date, - @RequestParam(required = false, value = "name") String name) { - return date + name; - } - - @GetMapping(path = "/{bar}/2148") - @ApiImplicitParam(name = "bar", dataTypeClass = Long.class, paramType = "path", value = "example") - ResponseEntity bug2148( - @ApiIgnore @PathVariable("bar") Example example, - @RequestParam("year") Optional year) { - - return ResponseEntity.notFound().build(); - } - - @GetMapping(path = "/2161") - ResponseEntity bug2161And2249and2469(@RequestBody Status status) { - return ResponseEntity.ok(""); - } - - @GetMapping(path = "/1881") - ResponseEntity bug1881(@RequestBody Bug1881 container) { - return ResponseEntity.ok(""); - } - - @ApiOperation(value = "Get all examples", nickname = "bug2268", notes = "Get all examples ", response = Example.class, - responseContainer = "List", authorizations = { - @Authorization(value = "user_auth", scopes = { - @AuthorizationScope(scope = "ADMIN", description = "Manage users"), - @AuthorizationScope(scope = "USER", description = "Maintain own user") - }) - }, tags = {"example"}) - @ApiResponses(value = { - @ApiResponse(code = 200, message = "Success", response = Example.class, responseContainer = "List"), - }) - @RequestMapping(value = "/2268", - produces = {"application/json"}, - method = RequestMethod.GET) - ResponseEntity> bug2268( - @ApiParam(value = "Filter the list") - @Valid - @RequestParam(value = "$filter", required = false) String filter) { - return null; - } - - @RequestMapping(value = "/bug2203", method = RequestMethod.GET, - produces = MediaType.APPLICATION_JSON_UTF8_VALUE) - public ResponseEntity> bug2203() { - return ResponseEntity.ok(null); - } - - @GetMapping("/bug1827") - public String addBook( - @ModelAttribute Book book, - @RequestParam(required = false) String[] authorIds) { - return ""; - } - - @GetMapping("/bug2282") - @ApiOperation("/bug2282") - public String bug2282(User user) { - return ""; - } - - @PostMapping(value = "/bug2230", consumes = MediaType.APPLICATION_ATOM_XML_VALUE) - @ApiOperation("/bug2230") - public String bug2230( - @RequestBody EHDTOApplicatorUnits applicatorUnits) { - return ""; - } - - @GetMapping(value = "/bug2182") - @ApiOperation("/bug2182") - public ProductVO bug2182() { - return null; - } - - @GetMapping({"/bug2220", "/bug2220/{bar}"}) - public void bug2220(@PathVariable(value = "bar", required = false) String bar) { - } - - @ApiResponses({ - @ApiResponse(code = 404, message = "No object was found with the given ID"), - @ApiResponse(code = 200, message = "The object was deleted successfully.", - response = void.class) - }) - @GetMapping("/bug1944") - public void bug1944() { - } - - @PostMapping("/2378") - public void upperCaseField(@RequestBody UpperCasedField input) { - } - - @PostMapping("/2391") - public void bug2391(@ModelAttribute Bug2391 input) { - } - - @RequestMapping(value = "/2368", method = RequestMethod.GET) - public ResponseEntity bug2368(@ModelAttribute @Valid GenericRequest voidRequest) { - return ResponseEntity.ok(null); - } - - @PostMapping("/2479") - public void bug2479(@RequestBody Bug2479 input) { - } - - - @PostMapping("/2415") - public void bug2415(@RequestBody Bug2415 input) { - } - - @GetMapping("/2415") - public ResponseEntity bug2415( - @Pattern(regexp = "^[A-Za-z0-9]{8,16}$") - @Size(min = 8, max = 16) - @RequestParam String input) { - return ResponseEntity.ok("test"); - } - - @GetMapping("/2423") - public void bug2423(Bug2423 input) { - } - - @PostMapping("/2822") - public void bug2822(@ApiParam(example = "exampleMessage") @RequestBody String message) { - // Empty body is sufficient for testing - } - - @GetMapping("/3321") - public void bug3321( - @ApiParam(allowableValues = "one, two, three") - @RequestParam(name = "expand", required = false) Set numbers) { - } - - @ApiResponses(value = { - @ApiResponse(code = 400, message = "Not Found", - examples = @io.swagger.annotations.Example( - value = { - @ExampleProperty( - mediaType = "foo", - value = "{'invalidField': 'address'}"), - @ExampleProperty( - mediaType = "bar", - value = "The address was invalid")}), - response = Bug2767.ErrorResponse.class)}) - @GetMapping("/2767/swagger15") - public Bug2767.Response bug2767() { - return new Bug2767.Response(); - } - - - @ApiResponse( - code = 200, message = "OK", - responseHeaders = { - @ResponseHeader(name = "X-Hello-Bis", description = "X-Hello-Bis header description", response = String.class) - }) - @ApiOperation( - responseHeaders = { - @ResponseHeader(name = "X-Hello", description = "X-Hello header description", response = String.class) - }, - value = "Get test for response header", - nickname = "responseHeader", notes = "Notes 'bout test" - ) - @GetMapping(path = "/bug2684", produces = "text/plain") - public String bug2684( - HttpServletRequest req, - HttpServletResponse resp) { - resp.addHeader("X-Hello", "Hello!"); - resp.addHeader("X-Hello-Bis", "Hallo!"); - return "Hi!"; - } - - @GetMapping("/3380") - public String bug3380(@ApiIgnore ModelAndView modelAndView) { - return "success"; - } - - @GetMapping("/3371") - public Iterable bug3371() { - return new ArrayList<>(); - } - - @RequestMapping(value = "/bug3353", method = POST, consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE) - @JsonView({Bug3353.Response.class}) - public ResponseEntity bug3353( - @ModelAttribute - @Validated(Bug3353.IRequest.class) - @JsonView(Bug3353.Request.class) - Bug3353.WithdrawQueryRequestView view) { - return ResponseEntity.ok(null); - } - - @RequestMapping(value = "/bug1370", method = RequestMethod.POST, consumes = MULTIPART_FORM_DATA_VALUE) - @ApiOperation(value = "upload attach file", httpMethod = "POST") - public void bug1370(@ModelAttribute Bug1370 pojo) { - } - - @PostMapping("/bug3087") - public void bug3087(@RequestBody Bug3087 test) { - } - - @GetMapping("/bug3390") - @ApiImplicitParam(name = "range", allowableValues = "range[1,99]", dataTypeClass = Integer.class, paramType = "query") - public void bug3390() { - } - - public enum NumberEnum { - ONE, - TWO, - THREE - } - - @SuppressWarnings("VisibilityModifier") - public class Bug2423 { - public String from; - public String to; - } - - public class Bug2415 { - private String test; - - @Pattern(regexp = "^[A-Za-z0-9]{8,16}$") - @Size(min = 8, max = 16) - public String getTest() { - return test; - } - - public void setTest(String test) { - this.test = test; - } - } - - public class GenericRequest { - - @NotNull - private T parameters; - - public T getParameters() { - return parameters; - } - - public void setParameters(T parameters) { - this.parameters = parameters; - } - - } - - public class ProductVO { - private String name; - - @JsonUnwrapped(prefix = "specification_") - private Specification specification; - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public Specification getSpecification() { - return specification; - } - - public void setSpecification(Specification specification) { - this.specification = specification; - } - } - - public class Specification { - private String name; - @JsonUnwrapped(prefix = "child_") - private SpecificationChild child; - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public SpecificationChild getChild() { - return child; - } - - public void setChild(SpecificationChild child) { - this.child = child; - } - } - - public class SpecificationChild { - private String name; - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - } - - public class User { - private Office office; - - public Office getOffice() { - return office; - } - - public void setOffice(Office office) { - this.office = office; - } - } - - public class Office extends TreeEntity { - } - - public class TreeEntity { - // private T parent ; - private User user; - - public User getUser() { - return user; - } - - public void setUser(User user) { - this.user = user; - } - } - - public class Book { - private Long id; - private String name; - private Set authors; - - public Long getId() { - return id; - } - - public void setId(Long id) { - this.id = id; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public Set getAuthors() { - return authors; - } - - public void setAuthors(Set authors) { - this.authors = authors; - } - } - - public class Author { - private Long id; - private String name; - private List books; - - public Long getId() { - return id; - } - - public String getName() { - return name; - } - - public List getBooks() { - return books; - } - } - - public enum Lang { - zh, en - } - - @XmlType(name = "model1907", namespace = "urn:bugs") - public static class Model1907 { - - @NotNull - @XmlAttribute - private String somename; - @NotNull - @XmlElement - private Example example; - - public Model1907() { - } - - public String getSomename() { - return somename; - } - - public void setSomename(String somename) { - this.somename = somename; - } - - public Example getExample() { - return example; - } - - public void setExample(Example example) { - this.example = example; - } - } - - public static class Bug2081Filter { - private String importantField; - - public String getImportantField() { - return importantField; - } - - public void setImportantField(String importantField) { - this.importantField = importantField; - } - } - - public static class Bug2081 { - private Bug2081Filter a; - private Bug2081Filter b; - - public Bug2081Filter getA() { - return a; - } - - public void setA(Bug2081Filter a) { - this.a = a; - } - - public Bug2081Filter getB() { - return b; - } - - public void setB(Bug2081Filter b) { - this.b = b; - } - } - - public static class Bug1881 { - private Map data1; - private Map> data2; - - public Map getData1() { - return data1; - } - - public void setData1(Map data1) { - this.data1 = data1; - } - - public Map> getData2() { - return data2; - } - - public void setData2(Map> data2) { - this.data2 = data2; - } - } - - @JsonInclude(JsonInclude.Include.NON_NULL) - public class Status { - @ApiModelProperty(example = "false") - private final Boolean enabled; - @ApiModelProperty(example = "'1235'") - private final String integerString; - @ApiModelProperty(example = "'[test] n/a'") - private final String bug2469; - - @JsonProperty("bug_1964") - @ApiModelProperty(required = true) - private boolean bug1964; - - @JsonCreator - Status( - @JsonProperty("enabled") Boolean enabled, - @JsonProperty("integerString") String integerString, - @JsonProperty("bug2469") String bug2469) { - this.enabled = enabled; - this.integerString = integerString; - this.bug2469 = bug2469; - } - - @JsonProperty("enabled") - public Boolean isEnabled() { - return enabled; - } - - @JsonProperty("integerString") - public String getIntegerString() { - return integerString; - } - - @JsonProperty("bug_1964") - @ApiModelProperty(required = true) - public boolean isBug1964() { - return bug1964; - } - - public String getBug2469() { - return bug2469; - } - } - - public class LangNotFilteredWrapper { - private Lang lang; - - public LangNotFilteredWrapper(Lang lang) { - this.lang = lang; - } - - public Lang getLang() { - return lang; - } - } - - public class LangFilteredWrapper { - private Lang lang; - - @ConstructorProperties({"lang"}) - public LangFilteredWrapper(Lang lang) { - this.lang = lang; - } - - public Lang getLang() { - return lang; - } - } - - public class Id { - - private final Long id; - - public Id(Long id) { - this.id = id; - } - - public Long getId() { - return id; - } - } - - public class Key { - - // if enabled, name will be shown @ApiModelProperty(value = "my description") - private final String key; - - @JsonCreator - public Key(@JsonProperty("key") String keyContent) { - key = keyContent; - } - - public String getKey() { - return key; - } - } - - public class Model1864 { - @NotNull - private String somename; - - public String getSomename() { - return somename; - } - - public void setSomename(String somename) { - this.somename = somename; - } - } - - public class Model1819 { - - private List enumTypes; - - public List getEnumTypes() { - return enumTypes; - } - - public void setEnumTypes(List enumTypes) { - this.enumTypes = enumTypes; - } - } - - class TestClass { - - private String s; - - public String getS() { - return s; - } - - public void setS(String s) { - this.s = s; - } - } - - class TestClass2 { - - private String e; - - public String getE() { - return e; - } - - public void setE(String e) { - this.e = e; - } - } - - @ApiModel(description = "Test 1777") - public class Bug1777 { - @ApiModelProperty(value = "经度", required = true) - private Double longitude; - - public Double getLongitude() { - return longitude; - } - - public void setLongitude(Double longitude) { - this.longitude = longitude; - } - } - - public class Bug1627 { - private String name; - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - } - - class Bug1697 { - private ByteBuffer bar; - - public ByteBuffer getBar() { - return bar; - } - - public void setBar(ByteBuffer bar) { - this.bar = bar; - } - } - - class File { - private String name; - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - } - - class Bug1676 { - @ApiModelProperty(value = "Horizontal position", required = false, example = "200") - private float xAxis; - @ApiModelProperty(value = "Vertical position", required = false, example = "500") - private float yAxis; - - public float getxAxis() { - return xAxis; - } - - public void setxAxis(float xAxis) { - this.xAxis = xAxis; - } - - public float getyAxis() { - return yAxis; - } - - public void setyAxis(float yAxis) { - this.yAxis = yAxis; - } - } - - class Bug1376 { - - private URL url; - - Bug1376(URL url) { - this.url = url; - } - - public URL getUrl() { - return url; - } - - public void setUrl(URL url) { - this.url = url; - } - - } - - public class LinkAlternate { - private String href; - - public String getHref() { - return href; - } - - public void setHref(String href) { - this.href = href; - } - } - - public class Bug1740 { - private String value; - - @JsonUnwrapped - private Bug1740Inner inner; - - public String getValue() { - return value; - } - - public Bug1740Inner getInner() { - return inner; - } - - private final class Bug1740Inner { - private String innerValue; - - public String getInnerValue() { - return innerValue; - } - } - } - - private class UpperCasedField { - @ApiModelProperty(name = "AGE", value = "the age of person") - @SuppressWarnings("MemberName") - private Integer AGE; - - @SuppressWarnings({"MemberName", "VisibilityModifier"}) - public Integer YEAR; - - public Integer getAGE() { - return AGE; - } - - @SuppressWarnings("ParameterName") - public void setAGE(Integer AGE) { - this.AGE = AGE; - } - } - - public class Bug2391 { - @ApiModelProperty(name = "from_country_id", position = 1, required = true) - private Long fromCountryId; - - @ModelAttribute("from_country_id") - public Long getFromCountryId() { - return fromCountryId; - } - - public void setFromCountryId(Long fromCountryId) { - this.fromCountryId = fromCountryId; - } - } - - private class Bug2479 { - @ApiModelProperty("First") - private Example first; - - @ApiModelProperty("Second") - private Example second; - - public Example getFirst() { - return first; - } - - public void setFirst(Example first) { - this.first = first; - } - - public Example getSecond() { - return second; - } - - public void setSecond(Example second) { - this.second = second; - } - } -} diff --git a/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/BusinessService.java b/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/BusinessService.java deleted file mode 100644 index 674ae0b4a41..00000000000 --- a/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/BusinessService.java +++ /dev/null @@ -1,107 +0,0 @@ -/* - * - * Copyright 2015-2019 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.test.contract.swagger; - -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiOperation; -import io.swagger.annotations.ApiParam; -import io.swagger.annotations.ApiResponse; -import io.swagger.annotations.ApiResponses; -import io.swagger.annotations.Authorization; -import io.swagger.annotations.AuthorizationScope; -import org.springframework.http.HttpStatus; -import org.springframework.http.MediaType; -import org.springframework.http.ResponseEntity; -import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestMethod; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.ResponseBody; -import springfox.test.contract.swagger.models.Business; - -import java.util.ArrayList; -import java.util.List; - -import static org.springframework.http.HttpStatus.*; -import static org.springframework.http.MediaType.*; -import static org.springframework.web.bind.annotation.RequestMethod.*; - - -@Controller -@Api(value = "/", description = "Services to demonstrate path variable resolution") -@RequestMapping(produces = { MediaType.ALL_VALUE, MediaType.APPLICATION_JSON_VALUE }, - consumes = MediaType.APPLICATION_JSON_VALUE) -public class BusinessService { - - @RequestMapping(value = "/businesses/aliased/{otherId}", method = RequestMethod.GET) - @ApiOperation(value = "Find a business by its id", nickname = "findBusinessById") - public String getAliasedPathVariable( - @ApiParam(value = "ID of business", required = true) @PathVariable("otherId") String businessId) { - return "This is only a test"; - } - - @RequestMapping(value = "/businesses/non-aliased/{businessId}", method = RequestMethod.GET) - @ApiOperation(value = "Find a business by its id", nickname = "findBusinessById", - authorizations = @Authorization(value = "oauth2", - scopes = { @AuthorizationScope(scope = "scope", - description = "scope description") - })) - public String getNonAliasedPathVariable( - @ApiParam(value = "ID of business", required = true) @PathVariable("businessId") String businessId) { - return "This is only a test"; - } - - @RequestMapping(value = "/businesses/vanilla/{businessId}", method = RequestMethod.GET) - public String getVanillaPathVariable(@PathVariable String businessId) { - return "This is only a test"; - } - - @RequestMapping(value = "/businesses/responseEntity/{businessId}", method = RequestMethod.GET) - public ResponseEntity getResponseEntity(@PathVariable String businessId) { - return new ResponseEntity( - "This is only a test", - HttpStatus.OK); - } - - @RequestMapping(value = { "/businesses/typeEcho" }, method = POST, consumes = APPLICATION_JSON_VALUE, - produces = APPLICATION_JSON_VALUE) - @ResponseBody - public ResponseEntity businessTypeEcho(@RequestBody Business.BusinessType business) { - return new ResponseEntity<>( - Business.BusinessType.PRODUCT, - OK); - } - - @RequestMapping(value = { "/businesses/demonstratesApiModelName" }, method = POST, consumes = APPLICATION_JSON_VALUE, - produces = APPLICATION_JSON_VALUE) - @ResponseBody - @ApiResponses(value = { @ApiResponse(code = 200, message = "Business", response = Business.class) }) - public String businessAsString() { - return ""; - } - - @RequestMapping(value = { "/businesses/byTypes" }, method = GET, produces = APPLICATION_JSON_VALUE) - @ResponseBody - public List businessesByCategories(@RequestParam Business.BusinessType[] types) { - return new ArrayList<>(); - } -} \ No newline at end of file diff --git a/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/ConcreteController.java b/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/ConcreteController.java deleted file mode 100644 index 0009cc46123..00000000000 --- a/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/ConcreteController.java +++ /dev/null @@ -1,30 +0,0 @@ -/* - * - * Copyright 2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.test.contract.swagger; - -import org.springframework.hateoas.EntityModel; -import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.RequestMapping; -import springfox.test.contract.swagger.models.Pet; - -@Controller -@RequestMapping("/foo") -public class ConcreteController extends AbstractController, String> { -} diff --git a/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/ConsumesProducesService.java b/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/ConsumesProducesService.java deleted file mode 100644 index e9da5ec01ac..00000000000 --- a/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/ConsumesProducesService.java +++ /dev/null @@ -1,66 +0,0 @@ -/* - * - * Copyright 2015-2019 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.test.contract.swagger; - -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiOperation; -import org.springframework.http.MediaType; -import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; - -@Controller -@Api(description = "Services to demonstrate produces/consumes override behaviour on document and operation level") -@RequestMapping(path = "/consumes-produces") -public class ConsumesProducesService { - - @GetMapping("/without-operation-produces") - @ApiOperation("Does not have operation produces defined") - public String withoutOperationProduces() { - throw new UnsupportedOperationException(); - } - - @GetMapping(value = "/with-operation-produces", produces = MediaType.APPLICATION_XML_VALUE) - @ApiOperation("Does have operation produces defined") - public String withOperationProduces() { - throw new UnsupportedOperationException(); - } - - @PostMapping("/without-operation-consumes") - @ApiOperation("Does not have operation consumes defined") - public void withoutOperationConsumes(@RequestBody String test) { - throw new UnsupportedOperationException(); - } - - @PostMapping(value = "/with-operation-consumes", consumes = MediaType.APPLICATION_XML_VALUE) - @ApiOperation("Does have operation consumes defined") - public void withOperationConsumes(@RequestBody String test) { - throw new UnsupportedOperationException(); - } - - @PostMapping(value = "/with-operation-consumes-produces", consumes = MediaType.APPLICATION_XML_VALUE, produces = - MediaType.APPLICATION_XML_VALUE) - @ApiOperation("Does have operation consumes and produces defined") - public void withOperationConsumesAndProduces(@RequestBody String test) { - throw new UnsupportedOperationException(); - } -} diff --git a/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/CrossOriginFilter.java b/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/CrossOriginFilter.java deleted file mode 100644 index 0d4d80b6c6c..00000000000 --- a/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/CrossOriginFilter.java +++ /dev/null @@ -1,63 +0,0 @@ -/* - * - * Copyright 2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.test.contract.swagger; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.stereotype.Component; - -import jakarta.servlet.Filter; -import jakarta.servlet.FilterChain; -import jakarta.servlet.ServletException; -import jakarta.servlet.ServletRequest; -import jakarta.servlet.ServletResponse; -import jakarta.servlet.http.HttpServletResponse; -import java.io.IOException; - -/** - * Allows cross origin for testing swagger docs using swagger-ui from local file system - */ -@Component -public class CrossOriginFilter implements Filter { - private static final Logger LOGGER = LoggerFactory.getLogger(CrossOriginFilter.class); - - @Override - public void doFilter( - ServletRequest req, - ServletResponse resp, - FilterChain chain) throws IOException, - ServletException { - - LOGGER.debug("Applying CORS filter"); - HttpServletResponse response = (HttpServletResponse) resp; - response.setHeader( - "Access-Control-Allow-Origin", - "*"); - response.setHeader( - "Access-Control-Allow-Methods", - "POST, GET, OPTIONS, DELETE"); - response.setHeader( - "Access-Control-Max-Age", - "0"); - chain.doFilter( - req, - resp); - } -} \ No newline at end of file diff --git a/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/CyclicStructuresController.java b/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/CyclicStructuresController.java deleted file mode 100644 index 6c57c861369..00000000000 --- a/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/CyclicStructuresController.java +++ /dev/null @@ -1,56 +0,0 @@ -/* - * - * Copyright 2020 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ -package springfox.test.contract.swagger; - -import io.swagger.annotations.ApiResponse; -import io.swagger.annotations.ApiResponses; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestMethod; -import org.springframework.web.bind.annotation.RestController; -import springfox.test.contract.swagger.models.City; -import springfox.test.contract.swagger.models.Country; -import springfox.test.contract.swagger.models.District; -import springfox.test.contract.swagger.models.House; -import springfox.test.contract.swagger.models.Region; -import springfox.test.contract.swagger.models.Street; - -import java.util.List; - -@RestController -@RequestMapping("/cyclic-structures") -public class CyclicStructuresController { - - @RequestMapping(value = "/create-street", method = RequestMethod.PUT) - public List createCyclicStreet(@RequestBody Street street) { - throw new UnsupportedOperationException(); - } - - @RequestMapping(value = "/create-city", method = RequestMethod.PUT) - public List createCyclicCity(@RequestBody City city) { - throw new UnsupportedOperationException(); - } - - @RequestMapping(value = "/create-country", method = RequestMethod.PUT) - @ApiResponses(value = { @ApiResponse(code = 405, message = "Invalid input") }) - public List createCyclicCountry(@RequestBody Country country) { - throw new UnsupportedOperationException(); - } - -} diff --git a/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/EnumService.java b/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/EnumService.java deleted file mode 100644 index 9a3aa5b7f2d..00000000000 --- a/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/EnumService.java +++ /dev/null @@ -1,70 +0,0 @@ -/* - * - * Copyright 2015-2019 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.test.contract.swagger; - - -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiOperation; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestMethod; -import springfox.test.contract.swagger.models.EnumCollection; -import springfox.test.contract.swagger.models.EnumType; - -import java.util.Set; -import java.util.stream.Stream; - -import static java.util.Collections.*; -import static java.util.stream.Collectors.*; - -@Controller -@RequestMapping("/enums") -@Api(value = "", description = "Service that return enums") -public class EnumService { - - @RequestMapping(value = "/wrapped", method = RequestMethod.GET) - @ApiOperation(value = "Example with wrapped enum collection") - public EnumCollection getCollectionValue() { - EnumCollection result = new EnumCollection(); - result.setTypes(Stream.of( - EnumType.ONE, - EnumType.TWO).collect(toSet())); - return result; - } - - @RequestMapping(value = "/entity", method = RequestMethod.GET) - @ApiOperation(value = "Example with response entity single value") - public ResponseEntity getResponseEntityValue() { - return new ResponseEntity<>( - EnumType.ONE, - HttpStatus.OK); - } - - @RequestMapping(value = "/collection", method = RequestMethod.GET) - @ApiOperation(value = "Example with response entity collection") - public ResponseEntity> getResponseEntityCollection() { - return new ResponseEntity<>( - singleton(EnumType.ONE), - HttpStatus.OK); - } - -} diff --git a/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/FancyPetService.java b/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/FancyPetService.java deleted file mode 100644 index e603f9baa91..00000000000 --- a/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/FancyPetService.java +++ /dev/null @@ -1,64 +0,0 @@ -/* - * - * Copyright 2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.test.contract.swagger; - -import io.swagger.annotations.Api; -import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestMethod; -import org.springframework.web.bind.annotation.ResponseBody; -import springfox.test.contract.swagger.models.FancyPet; -import springfox.test.contract.swagger.models.Pet; - -@Controller -@RequestMapping("/fancypets") -@Api(value = "Fancy Pet Service", description = "Operations about fancy pets") -public class FancyPetService extends AbstractPetService { - - // some subclass dependency here - // override one of superclass - @Override - @ResponseBody - public int createObject(@RequestBody FancyPet object) { - int id = super.createObject(object); - // do some logic with sub class - return id; - } - - - //Example of generic type constraint - @RequestMapping(method = RequestMethod.PUT) - public void updatePet(@RequestBody T pet) { - throw new UnsupportedOperationException(); - } - - // overload one of superclass - @ResponseBody - @RequestMapping(method = RequestMethod.POST, value = "?{someId}") - public int createObject( - @RequestBody FancyPet object, - @PathVariable int someId) { - int id = super.createObject(object); - // do some logic with sub class - return id; - } -} diff --git a/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/FeatureDemonstrationService.java b/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/FeatureDemonstrationService.java deleted file mode 100644 index b1c420620e1..00000000000 --- a/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/FeatureDemonstrationService.java +++ /dev/null @@ -1,358 +0,0 @@ -/* - * - * Copyright 2016-2019 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.test.contract.swagger; - -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiImplicitParam; -import io.swagger.annotations.ApiImplicitParams; -import io.swagger.annotations.ApiOperation; -import io.swagger.annotations.ApiParam; -import io.swagger.annotations.ApiResponse; -import io.swagger.annotations.ApiResponses; -import io.swagger.annotations.ExampleProperty; -import io.swagger.annotations.Extension; -import io.swagger.annotations.ExtensionProperty; -import org.joda.time.LocalDate; -import org.springframework.http.HttpEntity; -import org.springframework.http.HttpStatus; -import org.springframework.http.MediaType; -import org.springframework.http.ResponseEntity; -import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.ModelAttribute; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestHeader; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestMethod; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RequestPart; -import org.springframework.web.bind.annotation.ResponseBody; -import org.springframework.web.multipart.MultipartFile; -import org.springframework.web.util.UriComponentsBuilder; -import springfox.test.contract.swagger.models.Feature3311; -import springfox.test.contract.swagger.models.Business; -import springfox.test.contract.swagger.models.EnumObjectType; -import springfox.test.contract.swagger.models.EnumType; -import springfox.test.contract.swagger.models.Example; -import springfox.test.contract.swagger.models.ExampleListWrapper; -import springfox.test.contract.swagger.models.FancyPet; -import springfox.test.contract.swagger.models.ModelAttributeExample; -import springfox.test.contract.swagger.models.ModelWithArrayOfArrays; -import springfox.test.contract.swagger.models.ModelWithMapProperty; -import springfox.test.contract.swagger.models.ModelWithObjectNode; -import springfox.test.contract.swagger.models.NestedType; -import springfox.test.contract.swagger.models.Pet; -import springfox.test.contract.swagger.models.PetWithSerializer; -import springfox.test.contract.swagger.models.Vehicle; - -import java.math.BigDecimal; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.Optional; - -import static java.util.Collections.*; - - -@Controller -@RequestMapping("/features") -@Api(value = "", description = "Demonstration of features", basePath = "features") -public class FeatureDemonstrationService { - - //Uses alternate listing path - @RequestMapping(value = "/{petId}", method = RequestMethod.GET) - @ApiOperation(value = "Find pet by ID", notes = "Returns a pet when ID < 10. " - + "ID > 10 or non-integers will simulate API error conditions", - response = Pet.class, - extensions = { - @Extension(properties = @ExtensionProperty(name = "x-test1", value = "value1")), - @Extension(name = "test2", properties = @ExtensionProperty(name = "name2", value = "value2")) - } - ) - public Pet getPetById( - @ApiParam( - value = "ID of pet that needs to be fetched", - allowableValues = "range[1,5]", - required = true, - example = "3") - @PathVariable("petId") String petId) { - throw new RuntimeException("NotImplementedException"); - } - - //Lists all http methods with this operation - @RequestMapping("/allMethodsAllowed") - public void allMethodAllowed() { - throw new RuntimeException("NotImplementedException"); - } - - //Calculates effective url and ignores UriComponentsBuilder - @RequestMapping(value = "/effective", method = RequestMethod.GET) - public ResponseEntity getEffective(UriComponentsBuilder builder) { - return new ResponseEntity( - new Example( - "Hello", - 1, - EnumType.ONE, - new NestedType("test")), - HttpStatus.OK); - } - - //Returns nested generic types - @RequestMapping(value = "/effectives", method = RequestMethod.GET) - private ResponseEntity> getEffectives() { - return new ResponseEntity>( - singletonList(new Example( - "Hello", - 1, - EnumType.ONE, - new NestedType("test"))), - HttpStatus.OK); - } - - //No request body annotation or swagger annotation - @RequestMapping(value = "/enumObject", method = RequestMethod.GET) - public ResponseEntity getEnumAsObject() { - return ResponseEntity.ok(EnumObjectType.ONE); - } - - //No request body annotation or swagger annotation - @RequestMapping(value = "/bare", method = RequestMethod.POST) - public void getBare(Example example) { - //No-op - } - - //Enum input - @RequestMapping(value = "/status", method = RequestMethod.POST) - public void updateBaz(EnumType enumType) { - //No-op - } - - //Generic collection input - @RequestMapping(value = "/statuses", method = RequestMethod.POST) - public void updateBazes(List enumType) { - //No-op - } - - //Generic collection input - @RequestMapping(value = "/integers", method = RequestMethod.PUT) - public void updateListOfIntegers(List integers) { - //No-op - } - - //Generic collection input - @RequestMapping(value = "/examples", method = RequestMethod.PUT) - public void updateListOfExamples(@ModelAttribute("exampleList") ExampleListWrapper examples) { - //No-op - } - - //LocalDate transformation - @RequestMapping(value = "/date", method = RequestMethod.POST) - public void updateDate(LocalDate localDate) { - //No-op - } - - //BigDecimal transformation - @RequestMapping(value = "/bigDecimal", method = RequestMethod.POST) - public void updateBigDecimal(BigDecimal input) { - //No-op - } - - //boolean transformation - @RequestMapping(value = "/boolean", method = RequestMethod.POST) - public void updateBoolean(Boolean input) { - //No-op - } - - @RequestMapping - @ApiOperation(value = "all") - public HttpEntity all() { - throw new UnsupportedOperationException(); - } - - @RequestMapping(value = "mapProperty", method = RequestMethod.GET) - public ModelWithMapProperty modelWithMapProperty() { - throw new UnsupportedOperationException(); - } - - @RequestMapping(value = "listOfMaps", method = RequestMethod.GET) - public List> listOfMaps() { - throw new UnsupportedOperationException(); - } - - - @RequestMapping(value = "mapOfMapOfExample", method = RequestMethod.GET) - public Map> mapOfMapOfExample() { - throw new UnsupportedOperationException(); - } - - @RequestMapping(value = "addFiles", method = RequestMethod.POST) - @ApiOperation(value = "Add a new contact with file attachment") - public ResponseEntity addFiles(@RequestPart("files") MultipartFile[] files) { - return new ResponseEntity<>(HttpStatus.OK); - } - - @PostMapping(path = "/3311", - consumes = MediaType.MULTIPART_FORM_DATA_VALUE, - produces = MediaType.APPLICATION_JSON_VALUE) - public ResponseEntity feature3311( - @RequestPart Feature3311 ticket, - @RequestPart(required = false) MultipartFile[] attachments) { - return ResponseEntity.ok(null); - } - - @RequestMapping(value = "/modelAttributes", method = RequestMethod.GET) - public void getModelAttribute(@ModelAttribute ModelAttributeExample example) { - //No-op - } - - @RequestMapping(value = "/arrayOfArrays", method = RequestMethod.POST) - public int[][] arrayOfArrays(@RequestBody Business.BusinessType[][] arrayOfEnums) { - return new int[0][0]; - } - - @RequestMapping(value = "/propertyWithArrayOfArrays", method = RequestMethod.POST) - public void propertyWithArrayOfArrays(@RequestBody ModelWithArrayOfArrays model) { - //No-op - } - - @RequestMapping(value = "/propertyWithObjectNode", method = RequestMethod.POST) - public void propertyWithObjectNode(@RequestBody ModelWithObjectNode model) { - //No-op - } - - @RequestMapping(value = "/1430-body", method = RequestMethod.POST) - public void base64EncodedBody(@RequestBody byte[] base64Encoded) { - //No-op - } - - @RequestMapping(value = "/1430-query", method = RequestMethod.POST) - public void proper(@RequestParam byte[] base64Encoded) { - //No-op - } - - @RequestMapping(value = "/1367/{itemId}", method = RequestMethod.GET, produces = "application/vnd.com.pet+json") - public ResponseEntity findIdentityById(@PathVariable String itemId) { - return new ResponseEntity( - new Pet(), - HttpStatus.OK); - } - - @RequestMapping(value = "/1367/{itemId}", method = RequestMethod.GET, produces = "application/vnd.com.fancy-pet+json") - public ResponseEntity findById(@PathVariable String itemId) { - return new ResponseEntity( - new FancyPet(), - HttpStatus.OK); - } - - @RequestMapping(value = "/1490/entity/{itemId}", method = RequestMethod.GET) - @ResponseBody - public ResponseEntity serializablePetEntity(@PathVariable String itemId) { - return new ResponseEntity( - new PetWithSerializer(), - HttpStatus.OK); - } - - @RequestMapping(value = "/1490/{itemId}", method = RequestMethod.GET) - @ResponseBody - public PetWithSerializer serializablePet(@PathVariable String itemId) { - return new PetWithSerializer(); - } - - @RequestMapping(value = "/1490/{itemId}", method = RequestMethod.PUT) - public void updateSerializablePet( - @PathVariable String itemId, - @RequestBody PetWithSerializer pet) { - } - - @GetMapping(value = "/inheritance") - public List findVehicles(@RequestParam("type") String type) { - return new ArrayList<>(); - } - - @GetMapping("/2831") - @ApiOperation( - value = "Demo", - notes = "Demo optional header error" - ) - @ApiResponses({ - @ApiResponse(code = 200, message = "okey"), - @ApiResponse(code = 403, message = "ko"), - @ApiResponse(code = 404, message = "ko") - }) - public ResponseEntity feature2831( - @ApiParam(value = "foo msg", example = "foo example", type = "header", required = true) - @RequestHeader("foo") Optional foo) { - return ResponseEntity.ok(new Object()); - } - - // tag::question-27[] - @RequestMapping(value = "/2031", method = RequestMethod.POST) - @ResponseBody - @ApiOperation(value = "/2031") - @ApiImplicitParams({ - @ApiImplicitParam( - name = "contents", - dataTypeClass = CustomTypeFor2031.class, - examples = @io.swagger.annotations.Example( - value = { - @ExampleProperty(value = "{'property': 'test'}", mediaType = "application/json") - })) //<1> - }) - public void save( - @PathVariable("keyId") String keyId, - @PathVariable("id") String id, - @RequestBody String contents - //<2> - ) { - } - - public static class CustomTypeFor2031 { //<3> - private String property; - - public String getProperty() { - return property; - } - - public void setProperty(String property) { - this.property = property; - } - } - // end::question-27[] - - @RequestMapping(value = "/1570", method = RequestMethod.POST) - @ApiOperation(value = "Demo using examples") - @ApiResponses(value = {@ApiResponse(code = 404, message = "User not found"), - @ApiResponse( - code = 405, - message = "Validation exception", - examples = @io.swagger.annotations.Example( - value = { - @ExampleProperty( - mediaType = "Example json", - value = "{'invalidField': 'address'}"), - @ExampleProperty( - mediaType = "Example string", - value = "The first name was invalid")}))}) - public void saveUser() { - //No-op - } -} diff --git a/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/InheritedService.java b/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/InheritedService.java deleted file mode 100644 index 2f07d10d226..00000000000 --- a/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/InheritedService.java +++ /dev/null @@ -1,50 +0,0 @@ -/* - * - * Copyright 2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.test.contract.swagger; - -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiParam; -import io.swagger.annotations.ApiResponse; -import io.swagger.annotations.ApiResponses; -import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestMethod; -import springfox.test.contract.swagger.models.Pet; - - -@Controller -@RequestMapping("child") -@Api(value = "inheritedService", description = "Interface API") -public interface InheritedService { - - @RequestMapping(value = "child-method", method = RequestMethod.GET) - String getSomething(String parameter); - - @ApiResponses(value = { - @ApiResponse(code = 200, message = "kkj", response = Pet.class) }) - @RequestMapping(value = "/1575", - produces = { "application/json" }, - method = RequestMethod.GET) - Pet demonstrateInheritanceWithAnnotations( - @ApiParam(value = "Parameter 1", required = true) @PathVariable("param1") String param1 - ); - -} \ No newline at end of file diff --git a/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/InheritedServiceImpl.java b/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/InheritedServiceImpl.java deleted file mode 100644 index c069897d628..00000000000 --- a/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/InheritedServiceImpl.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - * - * Copyright 2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.test.contract.swagger; - -import io.swagger.annotations.ApiParam; -import org.springframework.stereotype.Component; -import org.springframework.web.bind.annotation.PathVariable; -import springfox.test.contract.swagger.models.Pet; - - -@Component -public class InheritedServiceImpl implements InheritedService { - - @Override - public String getSomething(String parameter) { - return parameter; - } - - @Override - public Pet demonstrateInheritanceWithAnnotations( - @ApiParam(value = "", required = true) - @PathVariable("param1") String param1) { - return null; - } -} \ No newline at end of file diff --git a/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/PetGroomingService.java b/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/PetGroomingService.java deleted file mode 100644 index f799bc387c1..00000000000 --- a/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/PetGroomingService.java +++ /dev/null @@ -1,50 +0,0 @@ -/* - * - * Copyright 2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.test.contract.swagger; - -import io.swagger.annotations.Api; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestMethod; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.ResponseStatus; - -@Controller -//Demonstrates multiple request mappings at the controller level -@RequestMapping({ "/petgrooming", "/pets/grooming", "/pets" }) -@Api(value = "", description = "Grooming operations for pets") -public class PetGroomingService { - - @RequestMapping(method = RequestMethod.GET) - public ResponseEntity canGroom(@RequestParam String type) { - return new ResponseEntity(HttpStatus.OK); - } - - //void returns - @RequestMapping(value = "voidMethod/{input}", method = RequestMethod.DELETE, - headers = { "Accept=application/xml,application/json" }) - @ResponseStatus(value = HttpStatus.OK, reason = "Just testing") - public void groomingFunctionThatReturnsVoid(@PathVariable("input") String input) throws Exception { - } - -} diff --git a/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/PetService.java b/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/PetService.java deleted file mode 100644 index 711e1e344a3..00000000000 --- a/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/PetService.java +++ /dev/null @@ -1,211 +0,0 @@ -/* - * - * Copyright 2015-2019 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.test.contract.swagger; - -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiOperation; -import io.swagger.annotations.ApiParam; -import io.swagger.annotations.ApiResponse; -import io.swagger.annotations.ApiResponses; -import org.springframework.http.HttpEntity; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestMethod; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.ResponseBody; -import org.springframework.web.multipart.MultipartFile; -import springfox.test.contract.swagger.models.Pet; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - - -@Controller -@RequestMapping("/pets") -@Api(value = "", description = "Operations about pets") -public class PetService { - - @RequestMapping(value = "/{petId}", method = RequestMethod.GET) - @ApiOperation(value = "Find pet by ID", notes = "Returns a pet when ID < 10. " - + "ID > 10 or non-integers will simulate API error conditions", - response = Pet.class - ) - public Pet getPetById( - @ApiParam(value = "ID of pet that needs to be fetched", allowableValues = "range[1,5]", - required = true) @PathVariable("petId") String petId) { - throw new RuntimeException("NotImplementedException"); - } - - @RequestMapping(method = RequestMethod.POST) - @ApiOperation(value = "Add a new pet to the store", notes = "Add a new pet to the store") - @ApiResponses(value = { @ApiResponse(code = 405, message = "Invalid input") }) - public void addPet( - @ApiParam(value = "Pet object that needs to be added to the store", required = true) Pet pet) { - throw new RuntimeException("NotImplementedException"); - } - - @RequestMapping(method = RequestMethod.PUT) - @ApiOperation(value = "Update an existing pet") - @ApiResponses(value = { @ApiResponse(code = 400, message = "Invalid ID supplied"), - @ApiResponse(code = 404, message = "Pet not found"), - @ApiResponse(code = 405, message = "Validation exception") }) - public void updatePet( - @ApiParam(value = "Pet object that needs to be added to the store", required = true) @RequestBody Pet pet) { - throw new RuntimeException("NotImplementedException"); - } - - @RequestMapping(value = "/findByStatus", method = RequestMethod.GET, params = { "status" }) - @ApiOperation(value = "Find Pet by status", - notes = "Multiple status values can be provided with comma-separated strings", - response = Pet.class) - @ApiResponses(value = { @ApiResponse(code = 400, message = "Invalid status value") }) - public Pet findPetsByStatus( - @ApiParam(value = "Status values that need to be considered for filter", required = true, - defaultValue = "available", allowableValues = "available,pending,sold", allowMultiple = true) - @RequestParam("status") String status) { - throw new RuntimeException("NotImplementedException"); - } - - @RequestMapping(value = "/findByAge", method = RequestMethod.GET, params = { "age" }) - @ApiOperation(value = "Find Pet by age", - notes = "Exclusive range with infinity", - response = Pet.class) - public Pet findPetsByAge( - @ApiParam(value = "Age values that need to be considered for filter", - allowableValues = "range(0,infinity)") - @RequestParam("age") int age) { - throw new RuntimeException("NotImplementedException"); - } - - @RequestMapping(value = "/findByLegs", method = RequestMethod.GET, params = { "legs" }) - @ApiOperation(value = "Find Pet by legs", - notes = "Exclusive range should work", - response = Pet.class) - public Pet findPetsByLegs( - @ApiParam(value = "Legs values that need to be considered for filter", - allowableValues = "range(0,10)") - @RequestParam("legs") int legs) { - throw new RuntimeException("NotImplementedException"); - } - - @RequestMapping(value = "/findByStamina", method = RequestMethod.GET, params = { "stamina" }) - @ApiOperation(value = "Find Pet by stamina", - notes = "Exclusive range with -infinity", - response = Pet.class) - public Pet findPetsByStamina( - @ApiParam(value = "Stamina values", - allowableValues = "range[-infinity,12)") - @RequestParam("stamina") long stamina) { - throw new RuntimeException("NotImplementedException"); - } - - @RequestMapping(value = "/findByTags", method = RequestMethod.GET) - @ApiOperation(value = "Find Pet by tags", - notes = "Multiple tags can be provided with comma-separated strings. Use tag1, tag2, tag3 for testing.", - response = Pet.class) - @ApiResponses(value = { @ApiResponse(code = 400, message = "Invalid tag value") }) - @Deprecated - public Pet findPetsByTags( - @ApiParam(value = "Tags to filter by", required = true, allowMultiple = true) - @RequestParam("tags") String tags) { - throw new RuntimeException("NotImplementedException"); - } - - - @RequestMapping(value = "/siblings", method = RequestMethod.POST) - public List siblings(Pet pet) { - throw new RuntimeException("NotImplementedException"); - } - - @RequestMapping(method = RequestMethod.GET) - @ApiOperation(value = "List all pets") - //@ApiModel(type = Pet.class, collection = true) - public - @ResponseBody - List listPets() { - return new ArrayList<>(); - } - - @RequestMapping(value = "/{name}", method = RequestMethod.POST) - public HttpEntity petByName(@PathVariable String name) { - throw new RuntimeException("NotImplementedException"); - } - - @RequestMapping(value = "/echo", method = RequestMethod.POST) - @ResponseBody - public Map echo(@RequestBody Map someInput) { - throw new RuntimeException("NotImplementedException"); - } - - @RequestMapping(value = "/transformPetNameToPetMapToAny", method = RequestMethod.POST) - public Map transformPetNameToPetMapToAny(@RequestBody Map someInput) { - throw new RuntimeException("NotImplementedException"); - } - - @RequestMapping(value = "/transformPetNameToPetMapToGenericOpenMap", method = RequestMethod.POST) - public Map transformPetNameToPetMapToGenericOpenMap(@RequestBody Map someInput) { - throw new RuntimeException("NotImplementedException"); - } - - - @RequestMapping(value = "/transformPetNameToPetMapToOpenMap", method = RequestMethod.POST) - public Map transformPetNameToPetMapToOpenMap(@RequestBody Map someInput) { - throw new RuntimeException("NotImplementedException"); - } - - @RequestMapping(value = "/nameToNickNamesMap", method = RequestMethod.POST) - public Map> nameToNickNamesMap() { - throw new RuntimeException("NotImplementedException"); - } - - @RequestMapping(value = "byName/{name}", method = RequestMethod.POST) - public HttpEntity> petEntities(@PathVariable String name) { - return new ResponseEntity>( - new ArrayList(), - HttpStatus.OK); - } - - @RequestMapping(value = "{a}/{b}", method = RequestMethod.GET) - public ResponseEntity method( - @PathVariable("a") String a, - @PathVariable("b") String b) { - return new ResponseEntity(HttpStatus.OK); - } - - @RequestMapping(value = "{petId}/pic", method = RequestMethod.POST) - public ResponseEntity updatePic( - @PathVariable String petId, - MultipartFile pic) { - return new ResponseEntity(HttpStatus.OK); - } - - @RequestMapping(value = "{petId}/pic/{picId}", method = RequestMethod.GET) - public ResponseEntity updatePic( - @PathVariable String petId, - @PathVariable String picId) { - return new ResponseEntity(HttpStatus.OK); - } - -} diff --git a/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/SameController.java b/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/SameController.java deleted file mode 100644 index e2165c10896..00000000000 --- a/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/SameController.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * - * Copyright 2017 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.test.contract.swagger; - -import io.swagger.annotations.ApiResponse; -import io.swagger.annotations.ApiResponses; -import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestMethod; -import springfox.test.contract.swagger.models.ModelWithSameNameClasses; - -@Controller -@RequestMapping("/same") -public class SameController { - - @RequestMapping(value = "/create-same", method = RequestMethod.PUT) - public void create(@RequestBody ModelWithSameNameClasses toCreate) { - throw new UnsupportedOperationException(); - } - - @RequestMapping(value = "/get-same/{id}", method = RequestMethod.GET) - @ApiResponses(value = { @ApiResponse(code = 405, message = "Invalid input") }) - public ModelWithSameNameClasses get(@PathVariable("id") String id) { - throw new UnsupportedOperationException(); - } -} \ No newline at end of file diff --git a/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/SecuritySupport.java b/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/SecuritySupport.java deleted file mode 100644 index db3a62914b4..00000000000 --- a/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/SecuritySupport.java +++ /dev/null @@ -1,52 +0,0 @@ -package springfox.test.contract.swagger; - -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import springfox.documentation.builders.ImplicitGrantBuilder; -import springfox.documentation.builders.OAuthBuilder; -import springfox.documentation.service.ApiKey; -import springfox.documentation.service.AuthorizationScope; -import springfox.documentation.service.GrantType; -import springfox.documentation.service.LoginEndpoint; -import springfox.documentation.service.SecurityScheme; - -import java.util.Collections; -import java.util.List; -import java.util.stream.Collectors; -import java.util.stream.Stream; - -@Configuration -public class SecuritySupport { - @Bean - public SecurityScheme oauth() { - return new OAuthBuilder().name("petstore_auth").grantTypes(grantTypes()).scopes(scopes()).build(); - } - - @Bean - public SecurityScheme apiKey() { - return new ApiKey( - "api_key", - "api_key", - "header"); - } - - public List scopes() { - return Stream.of( - new AuthorizationScope( - "write:pets", - "modify pets in your account"), - new AuthorizationScope( - "read:pets", - "read your pets")) - .collect(Collectors.toList()); - } - - public List grantTypes() { - return Collections.singletonList( - new ImplicitGrantBuilder() - .loginEndpoint(new LoginEndpoint( - "http://petstore.swagger.io/api/oauth/dialog")) - .build()); - } - -} diff --git a/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/SortDirection.java b/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/SortDirection.java deleted file mode 100644 index a7d77fdb9c0..00000000000 --- a/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/SortDirection.java +++ /dev/null @@ -1,24 +0,0 @@ -/* - * - * Copyright 2017-2019 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ -package springfox.test.contract.swagger; - -public enum SortDirection { - ASC, - DESC -} diff --git a/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/Swagger2TestConfig.java b/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/Swagger2TestConfig.java deleted file mode 100644 index f7ca4a05929..00000000000 --- a/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/Swagger2TestConfig.java +++ /dev/null @@ -1,459 +0,0 @@ -package springfox.test.contract.swagger; - -import com.fasterxml.classmate.TypeResolver; -import groovy.lang.MetaClass; -import org.joda.time.LocalDate; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.ComponentScan; -import org.springframework.context.annotation.Configuration; -import org.springframework.hateoas.Link; -import org.springframework.http.HttpMethod; -import springfox.documentation.builders.ApiInfoBuilder; -import springfox.documentation.builders.AuthorizationScopeBuilder; -import springfox.documentation.builders.PathSelectors; -import springfox.documentation.schema.WildcardType; -import springfox.documentation.service.AuthorizationScope; -import springfox.documentation.service.SecurityReference; -import springfox.documentation.service.SecurityScheme; -import springfox.documentation.service.StringVendorExtension; -import springfox.documentation.service.Tag; -import springfox.documentation.spi.DocumentationType; -import springfox.documentation.spi.service.ApiListingScannerPlugin; -import springfox.documentation.spi.service.contexts.SecurityContext; -import springfox.documentation.spring.web.plugins.Docket; -import springfox.documentation.spring.web.readers.operation.CachingOperationNameGenerator; -import springfox.documentation.swagger2.annotations.EnableSwagger2; - -import java.net.URL; -import java.nio.ByteBuffer; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.function.Predicate; - -import static springfox.documentation.builders.PathSelectors.*; -import static springfox.documentation.schema.AlternateTypeRules.*; - -@Configuration -@ComponentScan({ - "springfox.documentation.spring.web.dummy.controllers", - "springfox.test.contract.swagger", - "springfox.petstore.webflux.controller" -}) -@EnableSwagger2 -public class Swagger2TestConfig { - @Bean - public Docket petstoreWithUriTemplating(List authorizationTypes) { - return new Docket(DocumentationType.SWAGGER_2) - .groupName("petstoreTemplated") - .useDefaultResponseMessages(false) - .securitySchemes(authorizationTypes) - .produces(new HashSet() {{ - add("application/xml"); - add("application/json"); - }}) - .select() - .paths(PathSelectors.regex(".*/api/store/search.*")) - .build() - .enableUrlTemplating(true) - .host("petstore.swagger.io") - .protocols(new HashSet<>(Arrays.asList( - "http", - "https"))); - } - - @Bean - public Docket business(List authorizationTypes) { - return new Docket(DocumentationType.SWAGGER_2) - .groupName("businessService") - .useDefaultResponseMessages(false) - .securitySchemes(authorizationTypes) - .produces(new HashSet<>(Arrays.asList( - "application/xml", - "application/json"))) - .select() - .paths(PathSelectors.regex(".*/business.*")) - .build(); - } - - @Bean - public Docket concrete(List authorizationTypes) { - return new Docket(DocumentationType.SWAGGER_2) - .groupName("concrete") - .useDefaultResponseMessages(false) - .securitySchemes(authorizationTypes) - .produces(new HashSet<>(Arrays.asList( - "application/xml", - "application/json"))) - .select() - .paths(PathSelectors.regex(".*/foo/.*")) - .build(); - } - - @Bean - public Docket noRequestMapping(List authorizationTypes) { - return new Docket(DocumentationType.SWAGGER_2) - .groupName("noRequestMapping") - .useDefaultResponseMessages(false) - .securitySchemes(authorizationTypes) - .produces(new HashSet<>(Arrays.asList( - "application/xml", - "application/json"))) - .select() - .paths(PathSelectors.regex(".*/no-request-mapping/.*")) - .build(); - } - - @Bean - public Docket fancyPetstore(List authorizationTypes) { - return new Docket(DocumentationType.SWAGGER_2) - .groupName("fancyPetstore") - .useDefaultResponseMessages(false) - .securitySchemes(authorizationTypes) - .produces(new HashSet<>(Arrays.asList( - "application/xml", - "application/json"))) - .select() - .paths(PathSelectors.regex(".*/fancypets/.*")) - .build(); - } - - @Bean - public Docket featureService( - TypeResolver resolver, - List authorizationTypes) { - // tag::question-27-config[] - return new Docket(DocumentationType.SWAGGER_2) - .groupName("featureService") - .useDefaultResponseMessages(false) - .additionalModels(resolver.resolve(FeatureDemonstrationService.CustomTypeFor2031.class)) //<1> - .securitySchemes(authorizationTypes) - .produces(new HashSet<>( - Arrays.asList( - "application/xml", - "application/json"))) - .alternateTypeRules(newRule( - LocalDate.class, - String.class)) - .select().paths(PathSelectors.regex(".*/features/.*")) - .build(); - // end::question-27-config[] - } - - @Bean - public Docket inheritedService(List authorizationTypes) { - return new Docket(DocumentationType.SWAGGER_2) - .groupName("inheritedService") - .useDefaultResponseMessages(false) - .securitySchemes(authorizationTypes) - .produces(new HashSet<>(Arrays.asList( - "application/xml", - "application/json"))) - .select() - .paths(PathSelectors.regex(".*/child/.*")) - .build(); - } - - @Bean - public Docket pet(List authorizationTypes) { - return new Docket(DocumentationType.SWAGGER_2) - .groupName("petService") - .useDefaultResponseMessages(false) - .securitySchemes(authorizationTypes) - .produces(new HashSet<>(Arrays.asList( - "application/xml", - "application/json"))) - .enableUrlTemplating(true) - .select() - .paths(PathSelectors.regex(".*/pets/.*")) - .build(); - } - - @Bean - public Docket bugs( - TypeResolver resolver, - List authorizationTypes) { - AuthorizationScope[] scopes = - new AuthorizationScope[]{ - new AuthorizationScopeBuilder() - .scope("read") - .description("Read access") - .build() - }; - return new Docket(DocumentationType.SWAGGER_2).groupName("bugs") - .apiInfo(new ApiInfoBuilder().version("1.0") - .title("bugs API") - .description("bugs API") - .extensions(Collections.singletonList(new StringVendorExtension( - "test", - "testValue"))) - .build()) - .useDefaultResponseMessages(false) - .securitySchemes(authorizationTypes) - .tags(new Tag( - "foo", - "Foo Description")) - .produces(new HashSet<>( - Arrays.asList( - "application/xml", - "application/json"))) - .enableUrlTemplating(true) - .securityContexts(Collections.singletonList( - SecurityContext.builder() - .securityReferences( - Collections.singletonList( - new SecurityReference( - "petstore_auth", - scopes))) - .forPaths(PathSelectors.regex("/bugs/2268")) - .forHttpMethods(Predicate.isEqual(HttpMethod.GET)) - .build())) - .alternateTypeRules( - newRule(URL.class, String.class), - newRule(resolver.resolve( - List.class, - Link.class), - resolver.resolve( - Map.class, - String.class, - BugsController.LinkAlternate.class)), - newRule(resolver.resolve(Iterable.class, WildcardType.class), - resolver.resolve(List.class, WildcardType.class))) - .directModelSubstitute( - ByteBuffer.class, - String.class) - .select() - .paths(PathSelectors.regex(".*/bugs/.*")) - .build(); - } - - @Bean - public Docket bugsDifferent( - TypeResolver resolver, - List authorizationTypes) { - return new Docket(DocumentationType.SWAGGER_2).groupName("bugsDifferent") - .useDefaultResponseMessages(false) - .securitySchemes(authorizationTypes) - .tags(new Tag( - "foo", - "Foo Description")) - .produces(new HashSet<>( - Arrays.asList( - "application/xml", - "application/json"))) - .enableUrlTemplating(true) - .alternateTypeRules( - newRule( - URL.class, - String.class), - newRule( - resolver.resolve( - List.class, - Link.class), - resolver.resolve( - Map.class, - String.class, - BugsController.LinkAlternate.class)), - newRule(resolver.resolve(Iterable.class, WildcardType.class), - resolver.resolve(List.class, WildcardType.class))) - .directModelSubstitute( - ByteBuffer.class, - String.class) - .ignoredParameterTypes( - BugsController.Bug1627.class, - BugsController.Lang.class) - .select() - .paths(PathSelectors.regex(".*/bugs/.*")) - .build(); - } - - @Bean - public Docket differentGroup(TypeResolver resolver) { - return new Docket(DocumentationType.SWAGGER_2).groupName("different-group") - .useDefaultResponseMessages(false) - .tags(new Tag( - "Different", - "Different Group")) - .produces(new HashSet<>( - Arrays.asList( - "application/xml", - "application/json"))) - .enableUrlTemplating(true) - .alternateTypeRules( - newRule( - URL.class, - String.class), - newRule( - resolver.resolve( - List.class, - Link.class), - resolver.resolve( - Map.class, - String.class, - BugsController.LinkAlternate.class))) - .directModelSubstitute( - ByteBuffer.class, - String.class) - .select() - .paths(PathSelectors.regex(".*/different/.*")) - .build(); - } - - @Bean - public Docket petGrooming(List authorizationTypes) { - return new Docket(DocumentationType.SWAGGER_2).groupName("petGroomingService") - .useDefaultResponseMessages(false) - .securitySchemes(authorizationTypes) - .produces(new HashSet<>( - Arrays.asList( - "application/xml", - "application/json"))) - .select() - .paths(PathSelectors.regex(".*/petgrooming/.*")) - .build(); - } - - @Bean - public Docket root(List authorizationTypes) { - return new Docket(DocumentationType.SWAGGER_2).groupName("root") - .useDefaultResponseMessages(false) - .securitySchemes(authorizationTypes) - .produces(new HashSet<>( - Arrays.asList( - "application/xml", - "application/json"))) - .ignoredParameterTypes(MetaClass.class) - .select() - .paths(PathSelectors.regex(".*/.*")) - .build(); - } - - @Bean - public Docket groovyServiceBean(List authorizationTypes) { - return new Docket(DocumentationType.SWAGGER_2).groupName("groovyService") - .useDefaultResponseMessages(false) - .securitySchemes(authorizationTypes) - .forCodeGeneration(true) - .produces(new HashSet<>( - Arrays.asList( - "application/xml", - "application/json"))) - .select() - .paths(PathSelectors.regex(".*/groovy/.*")) - .build() - .ignoredParameterTypes(MetaClass.class); - } - - @Bean - public Docket enumServiceBean(List authorizationTypes) { - return new Docket(DocumentationType.SWAGGER_2).groupName("enumService") - .useDefaultResponseMessages(false) - .securitySchemes(authorizationTypes) - .produces(new HashSet<>( - Arrays.asList( - "application/xml", - "application/json"))) - .select() - .paths(PathSelectors.regex(".*/enums/.*")) - .build(); - } - - @Bean - public Docket featureServiceForCodeGen( - TypeResolver resolver, - List authorizationTypes) { - return new Docket(DocumentationType.SWAGGER_2).groupName("featureService-codeGen") - .additionalModels(resolver.resolve(FeatureDemonstrationService.CustomTypeFor2031.class)) - . - useDefaultResponseMessages(false) - .securitySchemes(authorizationTypes) - .forCodeGeneration(true) - .produces(new HashSet<>( - Arrays.asList( - "application/xml", - "application/json"))) - .select() - .paths(PathSelectors.regex(".*/features/.*")) - .build(); - } - - @Bean - public Docket consumesProducesNotOnDocumentContext(List authorizationTypes) { - return new Docket(DocumentationType.SWAGGER_2).groupName("consumesProducesNotOnDocumentContext") - .useDefaultResponseMessages(false) - .securitySchemes(authorizationTypes) - .select() - .paths(PathSelectors.regex(".*/consumes-produces/.*")) - .build(); - } - - @Bean - public Docket consumesProducesOnDocumentContext(List authorizationTypes) { - return new Docket(DocumentationType.SWAGGER_2) - .groupName("consumesProducesOnDocumentContext") - .useDefaultResponseMessages(false) - .securitySchemes(authorizationTypes) - .consumes(new HashSet() {{ - add("text/plain"); - }}) - .produces(new HashSet() {{ - add("application/json"); - }}) - .select().paths(PathSelectors.regex("/consumes-produces/.*")).build(); - } - - @Bean - public ApiListingScannerPlugin listingScanner(CachingOperationNameGenerator operationNames) { - return new Bug1767ListingScanner(operationNames); - } - - @Bean - public Docket springDataRest() { - return new Docket(DocumentationType.SWAGGER_2).groupName("spring-data-rest") - .useDefaultResponseMessages(false) - .enableUrlTemplating(true) - .securitySchemes(new ArrayList<>()) - .forCodeGeneration(true) - .produces(new HashSet<>( - Arrays.asList( - "application/xml", - "application/json"))) - .select() - .paths(PathSelectors.regex("/rest/people.*") - .or(PathSelectors.regex("/rest/tags.*")) - .or(PathSelectors.regex("/rest/categories.*")) - .or(PathSelectors.regex("/rest/addresses.*"))) - .build(); - } - - @Bean - public Docket same(List authorizationTypes) { - return new Docket(DocumentationType.SWAGGER_2).groupName("same") - .useDefaultResponseMessages(false) - .securitySchemes(authorizationTypes) - .produces(new HashSet<>( - Arrays.asList( - "application/xml", - "application/json"))) - .select() - .paths(PathSelectors.regex("/same/.*")) - .build(); - - } - - @Bean - public Docket cyclic(List authorizationTypes) { - return new Docket(DocumentationType.SWAGGER_2) - .groupName("cyclic") - .useDefaultResponseMessages(false) - .securitySchemes(authorizationTypes) - .produces(new HashSet<>( - Arrays.asList("application/xml", "application/json"))) - .select() - .paths(regex("/cyclic-structures/.*")) - .build(); - } -} diff --git a/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/SwaggerApplication.java b/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/SwaggerApplication.java deleted file mode 100644 index 5aba63f90b1..00000000000 --- a/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/SwaggerApplication.java +++ /dev/null @@ -1,48 +0,0 @@ -/* - * - * Copyright 2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.test.contract.swagger; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.context.annotation.ComponentScan; -import org.springframework.context.annotation.Import; -import org.springframework.hateoas.config.EnableHypermediaSupport; -import springfox.bean.validators.configuration.BeanValidatorPluginsConfiguration; -import springfox.documentation.spring.data.rest.configuration.SpringDataRestConfiguration; -import springfox.petstore.PetStoreConfiguration; - -@SpringBootApplication -@SuppressWarnings("HideUtilityClassConstructor") -@EnableHypermediaSupport(type = EnableHypermediaSupport.HypermediaType.HAL) -@ComponentScan(basePackages = { - "springfox.test.contract.swagger", - "springfox.petstore.controller" -}) -@Import(value = { - SpringDataRestConfiguration.class, - PetStoreConfiguration.class, - BeanValidatorPluginsConfiguration.class }) -public class SwaggerApplication { - public static void main(String[] args) { - SpringApplication.run( - SwaggerApplication.class, - args); - } -} diff --git a/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/data/rest/Address.java b/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/data/rest/Address.java deleted file mode 100644 index b317289656d..00000000000 --- a/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/data/rest/Address.java +++ /dev/null @@ -1,96 +0,0 @@ -/* - * - * Copyright 2017-2019 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ -package springfox.test.contract.swagger.data.rest; - -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.Id; -import javax.persistence.OneToOne; - -@Entity -public class Address { - - @Id - @GeneratedValue - private long id; - private String address1; - private String address2; - private String city; - private String state; - private String zip; - - @OneToOne(mappedBy = "address") - private Person person; - - public long getId() { - return id; - } - - public void setId(long id) { - this.id = id; - } - - public String getAddress1() { - return address1; - } - - public void setAddress1(String address1) { - this.address1 = address1; - } - - public String getAddress2() { - return address2; - } - - public void setAddress2(String address2) { - this.address2 = address2; - } - - public String getCity() { - return city; - } - - public void setCity(String city) { - this.city = city; - } - - public String getState() { - return state; - } - - public void setState(String state) { - this.state = state; - } - - public String getZip() { - return zip; - } - - public void setZip(String zip) { - this.zip = zip; - } - - public Person getPerson() { - return person; - } - - public void setPerson(Person person) { - this.person = person; - } -} diff --git a/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/data/rest/AddressRepository.java b/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/data/rest/AddressRepository.java deleted file mode 100644 index 89a70f81ab2..00000000000 --- a/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/data/rest/AddressRepository.java +++ /dev/null @@ -1,26 +0,0 @@ -/* - * - * Copyright 2017-2019 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ -package springfox.test.contract.swagger.data.rest; - -import org.springframework.data.repository.CrudRepository; -import org.springframework.data.rest.core.annotation.RepositoryRestResource; - -@RepositoryRestResource(path = "addresses") -public interface AddressRepository extends CrudRepository { -} \ No newline at end of file diff --git a/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/data/rest/BasePathConfigurer.java b/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/data/rest/BasePathConfigurer.java deleted file mode 100644 index 3cc63045698..00000000000 --- a/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/data/rest/BasePathConfigurer.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - * - * Copyright 2017-2019 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ -package springfox.test.contract.swagger.data.rest; - -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.data.rest.core.config.RepositoryRestConfiguration; -import org.springframework.data.rest.webmvc.config.RepositoryRestConfigurer; - -@Configuration -public class BasePathConfigurer { - @Bean - public RepositoryRestConfigurer repositoryRestConfigurer() { - return new RepositoryRestConfigurer() { - @Override - public void configureRepositoryRestConfiguration(RepositoryRestConfiguration config) { - config.setBasePath("/rest"); - } - }; - } -} \ No newline at end of file diff --git a/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/data/rest/Category.java b/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/data/rest/Category.java deleted file mode 100644 index 51c2341304e..00000000000 --- a/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/data/rest/Category.java +++ /dev/null @@ -1,62 +0,0 @@ -/* - * - * Copyright 2017-2019 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ -package springfox.test.contract.swagger.data.rest; - -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.OneToMany; -import java.util.List; - -@Entity -public class Category { - @Id - @GeneratedValue(strategy = GenerationType.AUTO) - private long id; - - private String name; - - @OneToMany(mappedBy = "category") - private List people; - - public long getId() { - return id; - } - - public void setId(long id) { - this.id = id; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public List getPeople() { - return people; - } - - public void setPeople(List people) { - this.people = people; - } -} diff --git a/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/data/rest/CategoryRepository.java b/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/data/rest/CategoryRepository.java deleted file mode 100644 index 4618ba11552..00000000000 --- a/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/data/rest/CategoryRepository.java +++ /dev/null @@ -1,26 +0,0 @@ -/* - * - * Copyright 2017-2019 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ -package springfox.test.contract.swagger.data.rest; - -import org.springframework.data.repository.CrudRepository; -import org.springframework.data.rest.core.annotation.RepositoryRestResource; - -@RepositoryRestResource(path = "categories", exported = false) -public interface CategoryRepository extends CrudRepository { -} \ No newline at end of file diff --git a/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/data/rest/Person.java b/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/data/rest/Person.java deleted file mode 100644 index f31e18d2121..00000000000 --- a/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/data/rest/Person.java +++ /dev/null @@ -1,102 +0,0 @@ -/* - * - * Copyright 2017-2019 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ -package springfox.test.contract.swagger.data.rest; - -import org.springframework.data.rest.core.annotation.RestResource; - -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.JoinColumn; -import javax.persistence.ManyToMany; -import javax.persistence.ManyToOne; -import javax.persistence.OneToOne; -import java.util.List; - -@Entity -public class Person { - - @Id - @GeneratedValue(strategy = GenerationType.AUTO) - private long id; - - private String firstName; - private String lastName; - - @OneToOne - @JoinColumn(name = "address_id") - @RestResource(path = "personAddress", rel = "address") - private Address address; - - @ManyToOne - @JoinColumn(name = "category_id") - private Category category; - - @ManyToMany(mappedBy = "people") - private List tags; - - public String getFirstName() { - return firstName; - } - - public void setFirstName(String firstName) { - this.firstName = firstName; - } - - public String getLastName() { - return lastName; - } - - public void setLastName(String lastName) { - this.lastName = lastName; - } - - public long getId() { - return id; - } - - public void setId(long id) { - this.id = id; - } - - public Address getAddress() { - return address; - } - - public void setAddress(Address address) { - this.address = address; - } - - public Category getCategory() { - return category; - } - - public void setCategory(Category category) { - this.category = category; - } - - public List getTags() { - return tags; - } - - public void setTags(List tags) { - this.tags = tags; - } -} \ No newline at end of file diff --git a/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/data/rest/PersonController.java b/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/data/rest/PersonController.java deleted file mode 100644 index c0aa711cf7f..00000000000 --- a/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/data/rest/PersonController.java +++ /dev/null @@ -1,48 +0,0 @@ -/* - * - * Copyright 2017-2019 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ -package springfox.test.contract.swagger.data.rest; - -import io.swagger.annotations.ApiOperation; -import io.swagger.annotations.ApiParam; -import org.springframework.data.domain.Pageable; -import org.springframework.data.rest.webmvc.BasePathAwareController; -import org.springframework.data.web.PageableDefault; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.PatchMapping; -import org.springframework.web.bind.annotation.RequestParam; - -import java.util.Map; - -@BasePathAwareController -public class PersonController { - @ApiOperation(value = "updateLastName", notes = "Updates the persons last name") - @PatchMapping("/people/{id}") - ResponseEntity updateLastName( - @ApiParam(name = "lastName", value = "lastName parameter") - @RequestParam("lastName") String lastName) { - return ResponseEntity.ok(null); - } - - @PatchMapping("/people/pageable") - public ResponseEntity> pageableResults( - final @PageableDefault(size = 20, sort = "id") Pageable pageable) { - return ResponseEntity.ok(null); - } - -} diff --git a/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/data/rest/PersonRepository.java b/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/data/rest/PersonRepository.java deleted file mode 100644 index a37068c7244..00000000000 --- a/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/data/rest/PersonRepository.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * - * Copyright 2017-2019 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ -package springfox.test.contract.swagger.data.rest; - -import io.swagger.annotations.ApiOperation; -import io.swagger.annotations.ApiParam; -import org.springframework.data.repository.PagingAndSortingRepository; -import org.springframework.data.repository.query.Param; -import org.springframework.data.rest.core.annotation.RepositoryRestResource; -import org.springframework.web.bind.annotation.RequestParam; - -import java.util.List; - -@RepositoryRestResource(collectionResourceRel = "people", path = "people") -public interface PersonRepository extends PagingAndSortingRepository { - - @ApiOperation(value = "findByLastName", notes = "Finds persons by last name") - List findByLastName( - @RequestParam - @ApiParam(name = "name", value = "name parameter") - @Param("name") String name); - - List findByFirstName(@Param("firstName") String firstName); - -} \ No newline at end of file diff --git a/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/data/rest/Tag.java b/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/data/rest/Tag.java deleted file mode 100644 index 1df658748b9..00000000000 --- a/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/data/rest/Tag.java +++ /dev/null @@ -1,69 +0,0 @@ -/* - * - * Copyright 2017-2019 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ -package springfox.test.contract.swagger.data.rest; - -import javax.persistence.CascadeType; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.JoinColumn; -import javax.persistence.JoinTable; -import javax.persistence.ManyToMany; -import java.util.List; - -@Entity -public class Tag { - @Id - @GeneratedValue(strategy = GenerationType.AUTO) - private long id; - - private String name; - - @ManyToMany(cascade = CascadeType.ALL) - @JoinTable(name = "person_tag", - joinColumns = @JoinColumn(name = "person_id", referencedColumnName = "id"), - inverseJoinColumns = @JoinColumn(name = "tag_id", - referencedColumnName = "id")) - private List people; - - public long getId() { - return id; - } - - public void setId(long id) { - this.id = id; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public List getPeople() { - return people; - } - - public void setPeople(List people) { - this.people = people; - } -} diff --git a/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/data/rest/TagRepository.java b/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/data/rest/TagRepository.java deleted file mode 100644 index 98a1cf3aa64..00000000000 --- a/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/data/rest/TagRepository.java +++ /dev/null @@ -1,26 +0,0 @@ -/* - * - * Copyright 2017-2019 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ -package springfox.test.contract.swagger.data.rest; - -import org.springframework.data.repository.CrudRepository; -import org.springframework.data.rest.core.annotation.RepositoryRestResource; - -@RepositoryRestResource(path = "tags") -public interface TagRepository extends CrudRepository { -} \ No newline at end of file diff --git a/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/models/AccountType.java b/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/models/AccountType.java deleted file mode 100644 index 13cd4212909..00000000000 --- a/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/models/AccountType.java +++ /dev/null @@ -1,46 +0,0 @@ -/* - * - * Copyright 2017-2019 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ -package springfox.test.contract.swagger.models; - -public enum AccountType { - CASH( - "现金账户", - 2), - BANK( - "银行账户", - 3); - - private String name; - private int code; - - AccountType( - String name, - int code) { - this.name = name; - this.code = code; - } - - public String getName() { - return name; - } - - public int getCode() { - return code; - } -} diff --git a/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/models/ApplicationLang.java b/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/models/ApplicationLang.java deleted file mode 100644 index cf49d5ab979..00000000000 --- a/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/models/ApplicationLang.java +++ /dev/null @@ -1,28 +0,0 @@ -/* - * - * Copyright 2017-2019 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ -package springfox.test.contract.swagger.models; - -import java.io.Serializable; -import java.util.HashMap; -import java.util.Map; - -public class ApplicationLang extends HashMap - implements Map, Serializable { - -} diff --git a/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/models/Bug1370.java b/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/models/Bug1370.java deleted file mode 100644 index 42579712814..00000000000 --- a/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/models/Bug1370.java +++ /dev/null @@ -1,24 +0,0 @@ -package springfox.test.contract.swagger.models; - -import org.springframework.web.multipart.MultipartFile; - -public class Bug1370 { - private MultipartFile fileToUpload; - private String name; - - public MultipartFile getFileToUpload() { - return fileToUpload; - } - - public void setFileToUpload(MultipartFile fileToUpload) { - this.fileToUpload = fileToUpload; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } -} diff --git a/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/models/Bug1749.java b/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/models/Bug1749.java deleted file mode 100644 index 8feb644cac3..00000000000 --- a/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/models/Bug1749.java +++ /dev/null @@ -1,143 +0,0 @@ -/* - * - * Copyright 2017-2019 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ -package springfox.test.contract.swagger.models; - -import com.fasterxml.jackson.annotation.JsonIgnore; - -import javax.validation.constraints.Max; -import javax.validation.constraints.Min; -import javax.validation.constraints.NotNull; -import java.util.HashMap; -import java.util.Map; - -public class Bug1749 { - @NotNull - @Min(value = 1, message = "must be > 1") - private Integer pageNumber = 1; - @NotNull - @Max(value = 50, message = "must be < 50") - private Integer pageSize = 20; - private SortDirection sortDirection; - private String sortField; - - public Bug1749( - int pageNumber, - int pageSize) { - this.pageNumber = pageNumber; - this.pageSize = pageSize; - } - - public Bug1749( - int pageNumber, - int pageSize, - String sortField) { - this( - pageNumber, - pageSize); - this.sortField = sortField; - } - - public Bug1749( - int pageNumber, - int pageSize, - String sortField, - SortDirection sortDirection) { - this( - pageNumber, - pageSize, - sortField); - this.sortDirection = sortDirection; - } - - public Map toMap() { - Map map = new HashMap(); - map.put( - "pageNumber", - Integer.toString(pageNumber)); - map.put( - "pageSize", - Integer.toString(pageSize)); - if (sortDirection != null) { - map.put( - "sortDirection", - sortDirection.toString()); - } - if (sortField != null) { - map.put( - "sortField", - sortField); - } - return map; - } - - // region Auto-generated code - public Bug1749() { - } - - @JsonIgnore - public boolean isAscending() { - return sortDirection == SortDirection.ASC; - } - - @JsonIgnore - public boolean isSet() { - return pageNumber != null && pageSize != null; - } - - public Bug1749 setSort( - String field, - SortDirection direction) { - this.sortField = field; - this.sortDirection = direction; - return this; - } - - public Integer getPageNumber() { - return pageNumber; - } - - public void setPageNumber(Integer pageNumber) { - this.pageNumber = pageNumber; - } - - public Integer getPageSize() { - return pageSize; - } - - public void setPageSize(Integer pageSize) { - this.pageSize = pageSize; - } - - public SortDirection getSortDirection() { - return sortDirection; - } - - public void setSortDirection(SortDirection sortDirection) { - this.sortDirection = sortDirection; - } - - public String getSortField() { - return sortField; - } - - public void setSortField(String sortField) { - this.sortField = sortField; - } - // endregion -} \ No newline at end of file diff --git a/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/models/Bug2767.java b/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/models/Bug2767.java deleted file mode 100644 index 99574d1d67d..00000000000 --- a/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/models/Bug2767.java +++ /dev/null @@ -1,31 +0,0 @@ -package springfox.test.contract.swagger.models; - -import io.swagger.annotations.ApiModelProperty; - -public class Bug2767 { - public static class ErrorResponse { - @ApiModelProperty(required = true, example = "address") - private String invalidField; - - public String getInvalidField() { - return invalidField; - } - - public void setInvalidField(String invalidField) { - this.invalidField = invalidField; - } - } - - public static class Response { - @ApiModelProperty(required = true, example = "some data") - private String data; - - public String getData() { - return data; - } - - public void setData(String data) { - this.data = data; - } - } -} diff --git a/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/models/Bug3087.java b/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/models/Bug3087.java deleted file mode 100644 index 2e4c6bd895a..00000000000 --- a/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/models/Bug3087.java +++ /dev/null @@ -1,29 +0,0 @@ -package springfox.test.contract.swagger.models; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; - -@ApiModel -public class Bug3087 { - @ApiModelProperty(required = true, position = 2) - private String user; - - @ApiModelProperty(required = true, position = 1) - private String password; - - public String getUser() { - return user; - } - - public void setUser(String user) { - this.user = user; - } - - public String getPassword() { - return password; - } - - public void setPassword(String password) { - this.password = password; - } -} \ No newline at end of file diff --git a/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/models/Bug3353.java b/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/models/Bug3353.java deleted file mode 100644 index 445807a1eb9..00000000000 --- a/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/models/Bug3353.java +++ /dev/null @@ -1,206 +0,0 @@ -package springfox.test.contract.swagger.models; - -import com.fasterxml.jackson.annotation.JsonAlias; -import com.fasterxml.jackson.annotation.JsonAnySetter; -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.JsonPropertyOrder; -import com.fasterxml.jackson.annotation.JsonView; -import io.swagger.annotations.ApiParam; -import org.springframework.util.StringUtils; - -import javax.validation.constraints.Digits; -import javax.validation.constraints.NotBlank; -import javax.validation.constraints.NotNull; -import javax.validation.constraints.Positive; -import javax.validation.constraints.Size; -import java.math.BigDecimal; - -public class Bug3353 { - @JsonInclude() - @JsonIgnoreProperties(ignoreUnknown = true) - @JsonPropertyOrder({"agentCode", "orderNo", "timestamp"}) - public class WithdrawQueryRequestView extends BaseView { - - @JsonView({Request.class, QueryParam.class, QueryParamDes.class, KeyHint.class}) - @JsonProperty("AgentCode") - @JsonAlias("MerCode") - @NotBlank(groups = {IRequest.class}, message = "AgentCode {javax.validation.constraints.NotBlank.message}") - private String agentCode; - - @JsonView({Request.class, QueryParam.class}) - @JsonProperty("Timestamp") - @NotNull(groups = {IRequest.class}, message = "Timestamp {javax.validation.constraints.NotNull.message}") - @Digits(groups = {IRequest.class}, fraction = 0, integer = 13, - message = "Timestamp {javax.validation.constraints.Digits.message}") - @Positive(groups = {IRequest.class}, message = "Timestamp {javax.validation.constraints.Positive.message}") - private BigDecimal timestamp; - - @JsonView({Request.class, QueryParam.class, QueryParamDes.class}) - @JsonProperty("OrderNo") - @NotBlank(groups = {IRequest.class}, message = "OrderNo {javax.validation.constraints.NotBlank.message}") - @Size(min = 13, max = 30, groups = {IRequest.class}, message = "{javax.validation.constraints.Size.message}") - private String orderNo; - - public WithdrawQueryRequestView( - @NotNull(groups = {Request.class}) String sign, - String key) { - super(sign, key); - } - - public WithdrawQueryRequestView( - @NotNull(groups = {Request.class}) String sign, - String key, - @NotBlank(groups = {IRequest.class}, message = "AgentCode {javax.validation.constraints.NotBlank.message}") - String agentCode, - @NotNull(groups = {IRequest.class}, message = "Timestamp {javax.validation.constraints.NotNull.message}") - @Digits(groups = {IRequest.class}, fraction = 0, integer = 13, - message = "Timestamp {javax.validation.constraints.Digits.message}") - @Positive(groups = {IRequest.class}, message = "Timestamp {javax.validation.constraints.Positive.message}") - BigDecimal timestamp, - @NotBlank(groups = {IRequest.class}, message = "OrderNo {javax.validation.constraints.NotBlank.message}") - @Size(min = 13, max = 30, groups = {IRequest.class}, - message = "{javax.validation.constraints.Size.message}") String orderNo) { - super(sign, key); - this.agentCode = agentCode; - this.timestamp = timestamp; - this.orderNo = orderNo; - } - - public String getAgentCode() { - return agentCode; - } - - public void setAgentCode(String agentCode) { - this.agentCode = agentCode; - } - - public BigDecimal getTimestamp() { - return timestamp; - } - - public void setTimestamp(BigDecimal timestamp) { - this.timestamp = timestamp; - } - - public String getOrderNo() { - return orderNo; - } - - public void setOrderNo(String orderNo) { - this.orderNo = orderNo; - } - } - - - @JsonInclude(JsonInclude.Include.ALWAYS) - @JsonIgnoreProperties(ignoreUnknown = true) - public abstract class BaseView { - - @JsonView({Request.class}) - @JsonProperty("Sign") - @NotNull(groups = {Request.class}) - private String sign; - - @JsonView({QueryParam.class}) - @JsonProperty("key") - @ApiParam(hidden = true) - private String key; - - - public BaseView( - @NotNull(groups = {Request.class}) String sign, - String key) { - this.sign = sign; - this.key = key; - } - - public String getSign() { - return sign; - } - - public void setSign(String sign) { - this.sign = sign; - } - - public String getKey() { - return key; - } - - public void setKey(String key) { - this.key = key; - } - } - - public static class KeyHintBuilder { - private StringBuilder builder; - - public KeyHintBuilder() { - this.builder = new StringBuilder(); - } - - @JsonAnySetter - public void addProperty( - String name, - Object property) { - if (StringUtils.hasLength(property)) { - this.builder.append(property); - } - } - - @Override - public String toString() { - return this.builder.toString(); - } - } - - public interface IRequest { - } - - public interface IResponse { - } - - public static class Request { - } - - public static class RequestDes { - } - - public static class Response { - } - - public static class QueryParam { - } - - public static class QueryParamDes { - } - - public static class KeyHint { - } - - public static class QueryParamsBuilder { - private StringBuilder builder; - - public QueryParamsBuilder() { - this.builder = new StringBuilder(); - } - - @JsonAnySetter - public void addToUri( - String name, - Object property) { - if (StringUtils.hasLength(property)) { - if (this.builder.length() > 0) { - this.builder.append("&"); - } - this.builder.append(name).append("=").append(property); - } - } - - @Override - public String toString() { - return this.builder.toString(); - } - } -} diff --git a/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/models/Business.java b/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/models/Business.java deleted file mode 100644 index ffb7c17f0dd..00000000000 --- a/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/models/Business.java +++ /dev/null @@ -1,60 +0,0 @@ -/* - * - * Copyright 2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.test.contract.swagger.models; - -import com.fasterxml.jackson.annotation.JsonProperty; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import org.joda.time.LocalDate; - -import java.util.Date; - - -@ApiModel(value = "Biz") -@SuppressWarnings("VisibilityModifier") -public class Business { - @ApiModelProperty(hidden = true) - @JsonProperty(value = "_meta") - public String meta = "Hello"; - - //not private - just for testing - public int id; - public String name; - public String owner; - public LocalDate inception; - public BusinessType businessType = BusinessType.PRODUCT; - public Date taxDate = new Date(); - - public enum BusinessType { - PRODUCT(1), - SERVICE(2); - private int value; - - BusinessType(int value) { - this.value = value; - } - - public int getValue() { - return value; - } - } -} - - diff --git a/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/models/Car.java b/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/models/Car.java deleted file mode 100644 index 650c5767b54..00000000000 --- a/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/models/Car.java +++ /dev/null @@ -1,55 +0,0 @@ -/* - * - * Copyright 2017-2019 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ -package springfox.test.contract.swagger.models; - -public class Car extends Vehicle { - private int seatingCapacity; - private double topSpeed; - - public Car() { - } - - public Car( - String make, - String model, - int seatingCapacity, - double topSpeed) { - super( - make, - model); - this.seatingCapacity = seatingCapacity; - this.topSpeed = topSpeed; - } - - public int getSeatingCapacity() { - return seatingCapacity; - } - - public void setSeatingCapacity(int seatingCapacity) { - this.seatingCapacity = seatingCapacity; - } - - public double getTopSpeed() { - return topSpeed; - } - - public void setTopSpeed(double topSpeed) { - this.topSpeed = topSpeed; - } -} \ No newline at end of file diff --git a/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/models/Category.java b/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/models/Category.java deleted file mode 100644 index 3ab9fe73ebb..00000000000 --- a/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/models/Category.java +++ /dev/null @@ -1,36 +0,0 @@ -/* - * - * Copyright 2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.test.contract.swagger.models; - -public class Category { - private String name; - - public Category(String name) { - this.name = name; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } -} diff --git a/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/models/City.java b/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/models/City.java deleted file mode 100644 index b8c0d5c6cc5..00000000000 --- a/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/models/City.java +++ /dev/null @@ -1,55 +0,0 @@ -/* - * - * Copyright 2020 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ -package springfox.test.contract.swagger.models; - -import java.util.List; - -public class City { - - private List districts; - - private Region region; - - private Country country; - - public List getDistricts() { - return districts; - } - - public void setDistricts(List districts) { - this.districts = districts; - } - - public Region getRegion() { - return region; - } - - public void setRegion(Region region) { - this.region = region; - } - - public Country getCountry() { - return country; - } - - public void setCountry(Country country) { - this.country = country; - } - -} diff --git a/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/models/Country.java b/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/models/Country.java deleted file mode 100644 index 62b0aed0950..00000000000 --- a/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/models/Country.java +++ /dev/null @@ -1,49 +0,0 @@ -/* - * - * Copyright 2020 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ -package springfox.test.contract.swagger.models; - -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.JsonProperty.Access; - -import java.util.List; - -public class Country { - - @JsonProperty(access = Access.READ_ONLY) - private Long populatuion; - - private List regions; - - public Long getPopulatuion() { - return populatuion; - } - - public void setPopulatuion(Long populatuion) { - this.populatuion = populatuion; - } - - public List getRegions() { - return regions; - } - - public void setRegions(List regions) { - this.regions = regions; - } - -} diff --git a/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/models/CustomAllCapsStringHashSet.java b/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/models/CustomAllCapsStringHashSet.java deleted file mode 100644 index 45ea61c26a0..00000000000 --- a/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/models/CustomAllCapsStringHashSet.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * - * Copyright 2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ -package springfox.test.contract.swagger.models; - -import java.util.Collection; -import java.util.HashSet; -import java.util.Locale; - -public class CustomAllCapsStringHashSet extends HashSet { - - private static final long serialVersionUID = -5157313869620411257L; - private static final Locale EN_LOCALE = new Locale("en_US"); - - @Override - public boolean add(final String e) { - return super.add(e.toUpperCase(EN_LOCALE)); - } - - @Override - public boolean addAll(final Collection c) { - - boolean isChanged = false; - - for (String value : c) { - if (add(value.toUpperCase(EN_LOCALE))) { - isChanged = true; - } - } - return isChanged; - } -} diff --git a/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/models/District.java b/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/models/District.java deleted file mode 100644 index 903e768bae5..00000000000 --- a/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/models/District.java +++ /dev/null @@ -1,65 +0,0 @@ -/* - * - * Copyright 2020 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ -package springfox.test.contract.swagger.models; - -import java.util.List; - -public class District { - - private List streets; - - private City city; - - private Region region; - - private Country country; - - public List getStreets() { - return streets; - } - - public void setStreets(List streets) { - this.streets = streets; - } - - public City getCity() { - return city; - } - - public void setCity(City city) { - this.city = city; - } - - public Region getRegion() { - return region; - } - - public void setRegion(Region region) { - this.region = region; - } - - public Country getCountry() { - return country; - } - - public void setCountry(Country country) { - this.country = country; - } - -} diff --git a/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/models/EHDTOApplicatorUnits.java b/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/models/EHDTOApplicatorUnits.java deleted file mode 100644 index 948b04290b5..00000000000 --- a/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/models/EHDTOApplicatorUnits.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * - * Copyright 2017-2019 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ -package springfox.test.contract.swagger.models; - -import javax.xml.bind.annotation.XmlAccessType; -import javax.xml.bind.annotation.XmlAccessorType; -import javax.xml.bind.annotation.XmlElement; -import javax.xml.bind.annotation.XmlRootElement; -import java.util.List; - -@XmlRootElement(name = "ApplicatorUnits") -@XmlAccessorType(XmlAccessType.FIELD) -public class EHDTOApplicatorUnits { - @XmlElement(name = "UnitGroup") - private List ehdtoUnitGroups; - - public List getEhdtoUnitGroups() { - return ehdtoUnitGroups; - } - - public void setEhdtoUnitGroups(List ehdtoUnitGroups) { - this.ehdtoUnitGroups = ehdtoUnitGroups; - } -} \ No newline at end of file diff --git a/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/models/EHDTOUnit.java b/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/models/EHDTOUnit.java deleted file mode 100644 index 33cb625088a..00000000000 --- a/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/models/EHDTOUnit.java +++ /dev/null @@ -1,59 +0,0 @@ -/* - * - * Copyright 2017-2019 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ -package springfox.test.contract.swagger.models; - -import javax.xml.bind.annotation.XmlAccessType; -import javax.xml.bind.annotation.XmlAccessorType; -import javax.xml.bind.annotation.XmlAttribute; -import javax.xml.bind.annotation.XmlRootElement; - -@XmlRootElement(name = "Unit") -@XmlAccessorType(XmlAccessType.FIELD) -public class EHDTOUnit { - @XmlAttribute(name = "id") - private String id; - @XmlAttribute(name = "name") - private String name; - @XmlAttribute(name = "unitSystem") - private String unitSystem; - - public String getId() { - return id; - } - - public void setId(String id) { - this.id = id; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public String getUnitSystem() { - return unitSystem; - } - - public void setUnitSystem(String unitSystem) { - this.unitSystem = unitSystem; - } -} diff --git a/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/models/EHDTOUnitGroup.java b/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/models/EHDTOUnitGroup.java deleted file mode 100644 index f6fd2a8ee63..00000000000 --- a/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/models/EHDTOUnitGroup.java +++ /dev/null @@ -1,52 +0,0 @@ -/* - * - * Copyright 2017-2019 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ -package springfox.test.contract.swagger.models; - -import javax.xml.bind.annotation.XmlAccessType; -import javax.xml.bind.annotation.XmlAccessorType; -import javax.xml.bind.annotation.XmlAttribute; -import javax.xml.bind.annotation.XmlElement; -import javax.xml.bind.annotation.XmlRootElement; -import java.util.List; - -@XmlRootElement(name = "UnitGroup") -@XmlAccessorType(XmlAccessType.FIELD) -public class EHDTOUnitGroup { - @XmlAttribute(name = "name") - private String name; - - @XmlElement(name = "unit") - private List ehdtoUnits; - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public List getEhdtoUnits() { - return ehdtoUnits; - } - - public void setEhdtoUnits(List ehdtoUnits) { - this.ehdtoUnits = ehdtoUnits; - } -} \ No newline at end of file diff --git a/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/models/EnumCollection.java b/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/models/EnumCollection.java deleted file mode 100644 index e24afb096ac..00000000000 --- a/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/models/EnumCollection.java +++ /dev/null @@ -1,34 +0,0 @@ -/* - * - * Copyright 2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ -package springfox.test.contract.swagger.models; - -import java.util.Set; - -public class EnumCollection { - - private Set types; - - public Set getTypes() { - return types; - } - - public void setTypes(Set types) { - this.types = types; - } -} diff --git a/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/models/EnumObjectType.java b/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/models/EnumObjectType.java deleted file mode 100644 index deb18a715f7..00000000000 --- a/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/models/EnumObjectType.java +++ /dev/null @@ -1,53 +0,0 @@ -/* - * - * Copyright 2015-2016 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.test.contract.swagger.models; - -import com.fasterxml.jackson.annotation.JsonFormat; - -/** - * Created by yeh on 22.05.2017. - */ - -@JsonFormat(shape = JsonFormat.Shape.OBJECT) -public enum EnumObjectType { - ONE( - "One", - "This in an enum for number 1"), TWO( - "Two", - "This in an enum for number 2"); - - private String name; - private String description; - - EnumObjectType( - String name, - String description) { - this.name = name; - this.description = description; - } - - public String getName() { - return name; - } - - public String getDescription() { - return description; - } -} diff --git a/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/models/EnumType.java b/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/models/EnumType.java deleted file mode 100644 index e06280d4f49..00000000000 --- a/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/models/EnumType.java +++ /dev/null @@ -1,25 +0,0 @@ -/* - * - * Copyright 2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.test.contract.swagger.models; - -public enum EnumType { - ONE, - TWO -} diff --git a/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/models/Example.java b/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/models/Example.java deleted file mode 100644 index 09daeacef06..00000000000 --- a/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/models/Example.java +++ /dev/null @@ -1,154 +0,0 @@ -/* - * - * Copyright 2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.test.contract.swagger.models; - -import com.fasterxml.jackson.annotation.JsonProperty; -import io.swagger.annotations.ApiModelProperty; -import io.swagger.annotations.ApiParam; -import org.joda.time.LocalDateTime; - -import java.io.Serializable; - -public class Example extends Parent implements Serializable { - - private static final long serialVersionUID = -8084678021874483017L; - - @ApiParam(value = "description of foo", required = true, allowableValues = "man,chu") - private String foo; - - @ApiModelProperty(value = "description of bar", required = false, example = "10") - private int bar; - - private EnumType enumType; - - @ApiModelProperty(value = "A read only string", readOnly = true) - private String readOnlyString; - - @ApiParam(value = "description of annotatedEnumType", required = false) - private EnumType annotatedEnumType; - - private NestedType nestedType; - - @JsonProperty("propertyWithNoGetterMethod") - private String propertyWithNoGetterMethod; - private String propertyWithNoSetterMethod; - - @ApiParam(value = "local date time desc dd-MM-yyyy hh:mm:ss", required = true) - private LocalDateTime localDateTime; - @ApiParam(value = "description of allCapsSet", required = false) - private CustomAllCapsStringHashSet allCapsSet; - - private Void voidParam; - - public Example( - String foo, - int bar, - EnumType enumType, - NestedType nestedType) { - this.foo = foo; - this.bar = bar; - this.enumType = enumType; - this.nestedType = nestedType; - } - - public String getFoo() { - return foo; - } - - public void setFoo(String foo) { - this.foo = foo; - } - - public int getBar() { - return bar; - } - - public void setBar(int bar) { - this.bar = bar; - } - - public EnumType getEnumType() { - return enumType; - } - - public void setEnumType(EnumType enumType) { - this.enumType = enumType; - } - - public EnumType getAnnotatedEnumType() { - return annotatedEnumType; - } - - public void setAnnotatedEnumType(EnumType annotatedEnumType) { - this.annotatedEnumType = annotatedEnumType; - } - - public NestedType getNestedType() { - return nestedType; - } - - public void setNestedType(NestedType nestedType) { - this.nestedType = nestedType; - } - - public void setPropertyWithNoGetterMethod(String propertyWithNoGetterMethod) { - this.propertyWithNoGetterMethod = propertyWithNoGetterMethod; - } - - public String getPropertyWithNoSetterMethod() { - return this.propertyWithNoSetterMethod; - } - - public CustomAllCapsStringHashSet getAllCapsSet() { - return allCapsSet; - } - - public void setAllCapsSet(CustomAllCapsStringHashSet allCapsSet) { - this.allCapsSet = allCapsSet; - } - - public LocalDateTime getLocalDateTime() { - return localDateTime; - } - - public void setLocalDateTime(LocalDateTime localDateTime) { - this.localDateTime = localDateTime; - } - - public String getReadOnlyString() { - return readOnlyString; - } - - public void setReadOnlyString(String readOnlyString) { - this.readOnlyString = readOnlyString; - } - - public Void getVoidParam() { - return voidParam; - } - - public void setVoidParam(Void voidParam) { - this.voidParam = voidParam; - } - - class InnerSynthetic { - } -} - diff --git a/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/models/ExampleListWrapper.java b/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/models/ExampleListWrapper.java deleted file mode 100644 index 97593fd7637..00000000000 --- a/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/models/ExampleListWrapper.java +++ /dev/null @@ -1,16 +0,0 @@ -package springfox.test.contract.swagger.models; - -import java.util.List; - -//From stack overflow answer https://stackoverflow.com/a/10518009 -public class ExampleListWrapper { - private List exampleList; - - public List getExampleList() { - return exampleList; - } - - public void setExampleList(List exampleList) { - this.exampleList = exampleList; - } -} diff --git a/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/models/FancyPet.java b/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/models/FancyPet.java deleted file mode 100644 index ca346bff81b..00000000000 --- a/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/models/FancyPet.java +++ /dev/null @@ -1,34 +0,0 @@ -/* - * - * Copyright 2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.test.contract.swagger.models; - -import java.util.List; - -public class FancyPet extends Pet { - private List categories; - - public List getCategories() { - return categories; - } - - public void setCategories(List categories) { - this.categories = categories; - } -} diff --git a/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/models/Feature3311.java b/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/models/Feature3311.java deleted file mode 100644 index 10baba3b953..00000000000 --- a/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/models/Feature3311.java +++ /dev/null @@ -1,13 +0,0 @@ -package springfox.test.contract.swagger.models; - -public class Feature3311 { - private String value; - - public String getValue() { - return value; - } - - public void setValue(String value) { - this.value = value; - } -} diff --git a/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/models/House.java b/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/models/House.java deleted file mode 100644 index 2aad6214217..00000000000 --- a/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/models/House.java +++ /dev/null @@ -1,83 +0,0 @@ -/* - * - * Copyright 2020 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ -package springfox.test.contract.swagger.models; - -public class House { - - private Integer number; - - private Street street; - - private District district; - - private City city; - - private Region region; - - private Country country; - - public Integer getNumber() { - return number; - } - - public void setNumber(Integer number) { - this.number = number; - } - - public Street getStreet() { - return street; - } - - public void setStreet(Street street) { - this.street = street; - } - - public District getDistrict() { - return district; - } - - public void setDistrict(District district) { - this.district = district; - } - - public City getCity() { - return city; - } - - public void setCity(City city) { - this.city = city; - } - - public Region getRegion() { - return region; - } - - public void setRegion(Region region) { - this.region = region; - } - - public Country getCountry() { - return country; - } - - public void setCountry(Country country) { - this.country = country; - } - -} diff --git a/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/models/Language.java b/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/models/Language.java deleted file mode 100644 index 9c494cb7d65..00000000000 --- a/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/models/Language.java +++ /dev/null @@ -1,28 +0,0 @@ -/* - * - * Copyright 2017-2019 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ -package springfox.test.contract.swagger.models; - -import java.io.Serializable; -import java.util.HashMap; -import java.util.Map; - -public class Language extends HashMap - implements Map, Serializable { - -} diff --git a/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/models/LanguageResponse.java b/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/models/LanguageResponse.java deleted file mode 100644 index c86e102a91e..00000000000 --- a/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/models/LanguageResponse.java +++ /dev/null @@ -1,28 +0,0 @@ -/* - * - * Copyright 2017-2019 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ -package springfox.test.contract.swagger.models; - -import java.io.Serializable; -import java.util.HashMap; -import java.util.Map; - -public class LanguageResponse extends HashMap - implements Map, Serializable { - -} diff --git a/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/models/LanguageText.java b/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/models/LanguageText.java deleted file mode 100644 index 05ec03c494a..00000000000 --- a/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/models/LanguageText.java +++ /dev/null @@ -1,38 +0,0 @@ -/* - * - * Copyright 2017-2019 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ -package springfox.test.contract.swagger.models; - -import com.fasterxml.jackson.annotation.JsonProperty; - -import java.io.Serializable; - -public class LanguageText implements Serializable { - - @JsonProperty("TEXT") - private String text; - - public String getText() { - return text; - } - - public void setText(String text) { - this.text = text; - } - -} diff --git a/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/models/ModelAttributeExample.java b/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/models/ModelAttributeExample.java deleted file mode 100644 index caa9d10e961..00000000000 --- a/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/models/ModelAttributeExample.java +++ /dev/null @@ -1,78 +0,0 @@ -/* - * - * Copyright 2015-2019 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ -package springfox.test.contract.swagger.models; - -import java.util.List; - -public class ModelAttributeExample { - private String stringProp; - private int intProp; - private List listProp; - private int[] arrayProp; - private Category complexProp; - private List accountTypes; - - public String getStringProp() { - return stringProp; - } - - public void setStringProp(String stringProp) { - this.stringProp = stringProp; - } - - public int getIntProp() { - return intProp; - } - - public void setIntProp(int intProp) { - this.intProp = intProp; - } - - public List getListProp() { - return listProp; - } - - public void setListProp(List listProp) { - this.listProp = listProp; - } - - public int[] getArrayProp() { - return arrayProp; - } - - public void setArrayProp(int[] arrayProp) { - this.arrayProp = arrayProp; - } - - public Category getComplexProp() { - return complexProp; - } - - public void setComplexProp(Category complexProp) { - this.complexProp = complexProp; - } - - public List getAccountTypes() { - return accountTypes; - } - - public void setAccountTypes(List accountTypes) { - this.accountTypes = accountTypes; - } -} diff --git a/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/models/ModelWithArrayOfArrays.java b/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/models/ModelWithArrayOfArrays.java deleted file mode 100644 index f7384194546..00000000000 --- a/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/models/ModelWithArrayOfArrays.java +++ /dev/null @@ -1,31 +0,0 @@ -/* - * - * Copyright 2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ -package springfox.test.contract.swagger.models; - -public class ModelWithArrayOfArrays { - private int[][] arrayOfArrayOfInts; - - public int[][] getArrayOfArrayOfInts() { - return arrayOfArrayOfInts; - } - - public void setArrayOfArrayOfInts(int[][] arrayOfArrayOfInts) { - this.arrayOfArrayOfInts = arrayOfArrayOfInts; - } -} diff --git a/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/models/ModelWithMapProperty.java b/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/models/ModelWithMapProperty.java deleted file mode 100644 index 81a29a7b39d..00000000000 --- a/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/models/ModelWithMapProperty.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - * - * Copyright 2015-2019 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.test.contract.swagger.models; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; - -import java.util.HashMap; -import java.util.Map; - - -@ApiModel(description = "Describes model with map property") -public class ModelWithMapProperty { - @ApiModelProperty(value = "Map of params to be sent") - private final Map params = new HashMap<>(); - - public Map getParams() { - return params; - } -} diff --git a/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/models/ModelWithObjectNode.java b/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/models/ModelWithObjectNode.java deleted file mode 100644 index 56efa66295a..00000000000 --- a/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/models/ModelWithObjectNode.java +++ /dev/null @@ -1,33 +0,0 @@ -/* - * - * Copyright 2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ -package springfox.test.contract.swagger.models; - -import com.fasterxml.jackson.databind.node.ObjectNode; - -public class ModelWithObjectNode { - private ObjectNode anyObject; - - public ObjectNode getAnyObject() { - return anyObject; - } - - public void setAnyObject(ObjectNode anyObject) { - this.anyObject = anyObject; - } -} diff --git a/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/models/ModelWithSameNameClasses.java b/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/models/ModelWithSameNameClasses.java deleted file mode 100644 index a0f13046059..00000000000 --- a/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/models/ModelWithSameNameClasses.java +++ /dev/null @@ -1,98 +0,0 @@ -/* - * - * Copyright 2017 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.test.contract.swagger.models; - -import java.util.List; -import java.util.Map; - -public class ModelWithSameNameClasses { - - private FancyPet fancyPet; - - private SameFancyPet moreFancyPet; - - private List fancyPets; - - private Map fancyPetsMap; - - private List>> crazyFancyPets; - - private List>> weirdFancyPets; - - private Map>> madFancyPets; - - public FancyPet getFancyPet() { - return fancyPet; - } - - public void setFancyPet(FancyPet fancyPet) { - this.fancyPet = fancyPet; - } - - public SameFancyPet getMoreFancyPet() { - return moreFancyPet; - } - - public void setMoreFancyPet(SameFancyPet moreFancyPet) { - this.moreFancyPet = moreFancyPet; - } - - public List getFancyPets() { - return fancyPets; - } - - public void setFancyPets(List fancyPets) { - this.fancyPets = fancyPets; - } - - public Map getFancyPetsMap() { - return fancyPetsMap; - } - - public void setFancyPetsMap(Map fancyPetsMap) { - this.fancyPetsMap = fancyPetsMap; - } - - public List>> getCrazyFancyPets() { - return crazyFancyPets; - } - - public void setCrazyFancyPets(List>> crazyFancyPets) { - this.crazyFancyPets = crazyFancyPets; - } - - public List>> getWeirdFancyPets() { - return weirdFancyPets; - } - - public void setWeirdFancyPets( - List>> weirdFancyPets) { - this.weirdFancyPets = weirdFancyPets; - } - - public Map>> getMadFancyPets() { - return madFancyPets; - } - - public void setMadFancyPets( - Map>> madFancyPets) { - this.madFancyPets = madFancyPets; - } -} diff --git a/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/models/NestedType.java b/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/models/NestedType.java deleted file mode 100644 index 9b2809b27aa..00000000000 --- a/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/models/NestedType.java +++ /dev/null @@ -1,36 +0,0 @@ -/* - * - * Copyright 2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.test.contract.swagger.models; - -public class NestedType { - private String name; - - public NestedType(String name) { - this.name = name; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } -} diff --git a/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/models/Parent.java b/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/models/Parent.java deleted file mode 100644 index 98fb4a521ca..00000000000 --- a/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/models/Parent.java +++ /dev/null @@ -1,34 +0,0 @@ -/* - * - * Copyright 2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.test.contract.swagger.models; - -public class Parent { - - private String parentBeanProperty; - - public String getParentBeanProperty() { - return parentBeanProperty; - } - - public void setParentBeanProperty(final String parentBeanProperty) { - this.parentBeanProperty = parentBeanProperty; - } - -} diff --git a/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/models/Pet.java b/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/models/Pet.java deleted file mode 100644 index 076521ff311..00000000000 --- a/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/models/Pet.java +++ /dev/null @@ -1,50 +0,0 @@ -/* - * - * Copyright 2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.test.contract.swagger.models; - -public class Pet { - private String id; - private String name; - private int age; - - public String getId() { - return id; - } - - public void setId(String id) { - this.id = id; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public int getAge() { - return age; - } - - public void setAge(int age) { - this.age = age; - } -} diff --git a/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/models/PetWithSerializer.java b/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/models/PetWithSerializer.java deleted file mode 100644 index ff5740a392b..00000000000 --- a/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/models/PetWithSerializer.java +++ /dev/null @@ -1,25 +0,0 @@ -/* - * - * Copyright 2017-2019 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ -package springfox.test.contract.swagger.models; - -import com.fasterxml.jackson.databind.annotation.JsonSerialize; - -@JsonSerialize(as = Pet.class) -public class PetWithSerializer { -} diff --git a/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/models/Region.java b/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/models/Region.java deleted file mode 100644 index 698f54c37f2..00000000000 --- a/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/models/Region.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * - * Copyright 2020 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ -package springfox.test.contract.swagger.models; - -import java.util.List; - -public class Region { - - private List cities; - - private Country country; - - public List getCities() { - return cities; - } - - public void setCities(List cities) { - this.cities = cities; - } - - public Country getCountry() { - return country; - } - - public void setCountry(Country country) { - this.country = country; - } - -} diff --git a/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/models/SameCategory.java b/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/models/SameCategory.java deleted file mode 100644 index 053983eac18..00000000000 --- a/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/models/SameCategory.java +++ /dev/null @@ -1,60 +0,0 @@ -/* - * - * Copyright 2017 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.test.contract.swagger.models; - -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.JsonProperty.Access; -import io.swagger.annotations.ApiModelProperty; - -public class SameCategory extends Category { - - @ApiModelProperty(value = "Id field", required = true) - private Integer id; - - @ApiModelProperty(value = "Type field", readOnly = true) - private String type; - - public SameCategory( - String name, - Integer id, - String type) { - super(name); - this.id = id; - this.type = type; - } - - @JsonProperty(value = "_id", access = Access.WRITE_ONLY) - public Integer getId() { - return id; - } - - public void setId(Integer id) { - this.id = id; - } - - @JsonProperty(value = "_type", access = Access.READ_ONLY) - public String getType() { - return type; - } - - public void setType(String type) { - this.type = type; - } -} \ No newline at end of file diff --git a/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/models/SameFancyPet.java b/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/models/SameFancyPet.java deleted file mode 100644 index cdc7b96143e..00000000000 --- a/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/models/SameFancyPet.java +++ /dev/null @@ -1,33 +0,0 @@ -/* - * - * Copyright 2017 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.test.contract.swagger.models; - -public class SameFancyPet extends SamePet { - - private SameCategory extendedCategory; - - public SameCategory getExtendedCategory() { - return extendedCategory; - } - - public void setExtendedCategory(SameCategory extendedCategories) { - this.extendedCategory = extendedCategories; - } -} \ No newline at end of file diff --git a/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/models/SamePet.java b/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/models/SamePet.java deleted file mode 100644 index 1d1be50e1bc..00000000000 --- a/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/models/SamePet.java +++ /dev/null @@ -1,73 +0,0 @@ -/* - * - * Copyright 2017 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.test.contract.swagger.models; - -import com.fasterxml.jackson.annotation.JsonIgnore; -import com.fasterxml.jackson.annotation.JsonProperty; - -public class SamePet { - private String id; - private String name; - private int age; - private String color; - private Double weight; - - public String getId() { - return id; - } - - public void setId(String id) { - this.id = id; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public int getAge() { - return age; - } - - public void setAge(int age) { - this.age = age; - } - - public String getColor() { - return color; - } - - public void setColor(String color) { - this.color = color; - } - - @JsonIgnore - public Double getWeight() { - return weight; - } - - @JsonProperty("pet_weight") - public void setWeight(Double weight) { - this.weight = weight; - } -} \ No newline at end of file diff --git a/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/models/SortDirection.java b/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/models/SortDirection.java deleted file mode 100644 index c7b57aa3207..00000000000 --- a/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/models/SortDirection.java +++ /dev/null @@ -1,24 +0,0 @@ -/* - * - * Copyright 2017-2019 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ -package springfox.test.contract.swagger.models; - -public enum SortDirection { - ASC, - DESC -} diff --git a/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/models/Street.java b/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/models/Street.java deleted file mode 100644 index 8e75ddbe109..00000000000 --- a/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/models/Street.java +++ /dev/null @@ -1,75 +0,0 @@ -/* - * - * Copyright 2020 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ -package springfox.test.contract.swagger.models; - -import java.util.List; - -public class Street { - - private List houses; - - private District district; - - private City city; - - private Region region; - - private Country country; - - public List getHouses() { - return houses; - } - - public void setHouses(List houses) { - this.houses = houses; - } - - public District getDistrict() { - return district; - } - - public void setDistrict(District district) { - this.district = district; - } - - public City getCity() { - return city; - } - - public void setCity(City city) { - this.city = city; - } - - public Region getRegion() { - return region; - } - - public void setRegion(Region region) { - this.region = region; - } - - public Country getCountry() { - return country; - } - - public void setCountry(Country country) { - this.country = country; - } - -} diff --git a/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/models/Treeish.java b/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/models/Treeish.java deleted file mode 100644 index c31da3e1512..00000000000 --- a/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/models/Treeish.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * - * Copyright 2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.test.contract.swagger.models; - -public class Treeish implements java.io.Serializable { - private Treeish example; - private String treeishField; - - public Treeish getExample() { - return example; - } - - public void setExample(Treeish example) { - this.example = example; - } - - public Treeish(Treeish example) { - this.example = example; - } - - public String getTreeishField() { - return treeishField; - } - - public void setTreeishField(String treeishField) { - this.treeishField = treeishField; - } -} diff --git a/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/models/Truck.java b/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/models/Truck.java deleted file mode 100644 index f881643dcff..00000000000 --- a/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/models/Truck.java +++ /dev/null @@ -1,44 +0,0 @@ -/* - * - * Copyright 2017-2019 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ -package springfox.test.contract.swagger.models; - -public class Truck extends Vehicle { - private double payloadCapacity; - - public Truck() { - } - - public Truck( - String make, - String model, - double payloadCapacity) { - super( - make, - model); - this.payloadCapacity = payloadCapacity; - } - - public double getPayloadCapacity() { - return payloadCapacity; - } - - public void setPayloadCapacity(double payloadCapacity) { - this.payloadCapacity = payloadCapacity; - } -} \ No newline at end of file diff --git a/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/models/Vehicle.java b/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/models/Vehicle.java deleted file mode 100644 index 3e2f5d8760c..00000000000 --- a/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/models/Vehicle.java +++ /dev/null @@ -1,61 +0,0 @@ -/* - * - * Copyright 2017-2019 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ -package springfox.test.contract.swagger.models; - -import com.fasterxml.jackson.annotation.JsonSubTypes; -import com.fasterxml.jackson.annotation.JsonTypeInfo; - -@JsonTypeInfo( - use = JsonTypeInfo.Id.NAME, - include = JsonTypeInfo.As.PROPERTY, - property = "type") -@JsonSubTypes({ - @JsonSubTypes.Type(value = Car.class, name = "car"), - @JsonSubTypes.Type(value = Truck.class, name = "truck") - }) -public abstract class Vehicle { - private String make; - private String model; - - public Vehicle() { - } - - protected Vehicle( - String make, - String model) { - this.make = make; - this.model = model; - } - - public String getMake() { - return make; - } - - public void setMake(String make) { - this.make = make; - } - - public String getModel() { - return model; - } - - public void setModel(String model) { - this.model = model; - } -} \ No newline at end of file diff --git a/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/webflux/listeners/ObjectMapperEventListener.java b/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/webflux/listeners/ObjectMapperEventListener.java deleted file mode 100644 index 2c371ca11dd..00000000000 --- a/swagger-contract-tests/src/main/java/springfox/test/contract/swagger/webflux/listeners/ObjectMapperEventListener.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * - * Copyright 2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.test.contract.swagger.webflux.listeners; - -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.databind.ObjectMapper; -import org.springframework.context.ApplicationListener; -import org.springframework.core.Ordered; -import springfox.documentation.schema.configuration.ObjectMapperConfigured; - -public class ObjectMapperEventListener implements ApplicationListener, Ordered { - @Override - public void onApplicationEvent(ObjectMapperConfigured event) { - ObjectMapper objectMapper = event.getObjectMapper(); - objectMapper.setSerializationInclusion(JsonInclude.Include.ALWAYS); - } - - @Override - public int getOrder() { - //Always runs last so it's the effective ObjectMapper configuration - return LOWEST_PRECEDENCE; - } -} diff --git a/swagger-contract-tests/src/main/resources/application.properties b/swagger-contract-tests/src/main/resources/application.properties deleted file mode 100644 index eafdd036aa7..00000000000 --- a/swagger-contract-tests/src/main/resources/application.properties +++ /dev/null @@ -1,4 +0,0 @@ -spring.jpa.hibernate.ddl-auto=none -logging.level.springfox.documentation=DEBUG -#server.servlet.context-path=/context -spring.activemq.broker-url= diff --git a/swagger-contract-tests/src/main/resources/simplelogger.properties b/swagger-contract-tests/src/main/resources/simplelogger.properties deleted file mode 100644 index 534726693fe..00000000000 --- a/swagger-contract-tests/src/main/resources/simplelogger.properties +++ /dev/null @@ -1 +0,0 @@ -org.slf4j.simpleLogger.defaultLogLevel=DEBUG diff --git a/swagger-contract-tests/src/test/groovy/springfox/test/contract/swaggertests/FileAccess.groovy b/swagger-contract-tests/src/test/groovy/springfox/test/contract/swaggertests/FileAccess.groovy deleted file mode 100644 index 85de599ed8f..00000000000 --- a/swagger-contract-tests/src/test/groovy/springfox/test/contract/swaggertests/FileAccess.groovy +++ /dev/null @@ -1,54 +0,0 @@ -/* - * - * Copyright 2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.test.contract.swaggertests - -import groovy.json.StringEscapeUtils -import org.codehaus.groovy.runtime.ResourceGroovyMethods - -import static groovy.json.JsonOutput.* - -trait FileAccess { - String fileContents(String fileName) { - def resource = this.getClass().getResource("$fileName") - return ResourceGroovyMethods.getText(resource, 'UTF-8') - } - - def maybeWriteToFile(fileName, String contents) { - def root = System.properties.get("contract.tests.root") - def updateContracts = System.properties.get("contract.tests.update", false) - System.out.println("Update contracts? $updateContracts, root -> $root") - if (updateContracts) { - System.out.println("Writing file ${root}${File.separator}${fileName}...") - def file - def writer - try { - file = new FileOutputStream("${root}${File.separator}${fileName}") - writer = new OutputStreamWriter(file, "UTF-8") - writer.write(StringEscapeUtils.unescapeJava(prettyPrint(contents))) - } catch (Exception e) { - System.err.println("**** ERROR WRITING FILE: " + e.getMessage()) - } finally { - writer.flush() - writer.close() - } - } - true - } -} \ No newline at end of file diff --git a/swagger-contract-tests/src/test/groovy/springfox/test/contract/swaggertests/FunctionContractSpec.groovy b/swagger-contract-tests/src/test/groovy/springfox/test/contract/swaggertests/FunctionContractSpec.groovy deleted file mode 100644 index 1927ca304e8..00000000000 --- a/swagger-contract-tests/src/test/groovy/springfox/test/contract/swaggertests/FunctionContractSpec.groovy +++ /dev/null @@ -1,217 +0,0 @@ -/* - * - * Copyright 2017-2019 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.test.contract.swaggertests - -import com.fasterxml.classmate.TypeResolver -import groovy.json.JsonSlurper -import org.skyscreamer.jsonassert.JSONAssert -import org.springframework.beans.factory.annotation.Value -import org.springframework.boot.test.context.SpringBootTest -import org.springframework.boot.test.context.TestConfiguration -import org.springframework.boot.test.web.client.TestRestTemplate -import org.springframework.boot.web.client.RestTemplateBuilder -import org.springframework.context.annotation.Bean -import org.springframework.http.HttpStatus -import org.springframework.http.MediaType -import org.springframework.http.RequestEntity -import org.springframework.http.converter.StringHttpMessageConverter -import spock.lang.Ignore -import spock.lang.Shared -import spock.lang.Specification -import spock.lang.Unroll -import springfox.documentation.schema.AlternateTypeRuleConvention -import springfox.documentation.spring.web.plugins.JacksonSerializerConvention -import springfox.test.contract.swagger.SwaggerApplication - -import static java.nio.charset.StandardCharsets.* -import static org.skyscreamer.jsonassert.JSONCompareMode.* -import static org.springframework.boot.test.context.SpringBootTest.* - -@SpringBootTest( - webEnvironment = WebEnvironment.RANDOM_PORT, - classes = SwaggerApplication, - properties = ["logging.level.springfox.documentation=DEBUG"] -) -class FunctionContractSpec extends Specification implements FileAccess { - - @Shared - def http = new TestRestTemplate(new RestTemplateBuilder().additionalMessageConverters(new StringHttpMessageConverter(UTF_8))) - - @Value('${local.server.port}') - int port - - @Unroll - def 'should honor swagger v2 resource listing #groupName'() { - given: - RequestEntity request = RequestEntity.get( - new URI("http://localhost:$port/v2/api-docs?group=$groupName")) - .accept(MediaType.APPLICATION_JSON) - .build() - String contract = fileContents("/contract/swagger2/$contractFile") - - when: - def response = http.exchange(request, String) - then: - String raw = response.body - response.statusCode == HttpStatus.OK - - def withPortReplaced = contract.replaceAll("__PORT__", "$port") - maybeWriteToFile( - "/contract/swagger2/$contractFile", - raw.replace("localhost:$port", "localhost:__PORT__")) - JSONAssert.assertEquals(withPortReplaced, raw, NON_EXTENSIBLE) - - where: - contractFile | groupName - 'swagger.json' | 'petstore' - 'swaggerTemplated.json' | 'petstoreTemplated' - 'declaration-bugs-service.json' | 'bugs' - 'declaration-bugs-different-service.json' | 'bugsDifferent' - 'declaration-business-service.json' | 'businessService' - 'declaration-concrete-controller.json' | 'concrete' - 'declaration-controller-with-no-request-mapping-service.json' | 'noRequestMapping' - 'declaration-fancy-pet-service.json' | 'fancyPetstore' - 'declaration-feature-demonstration-service.json' | 'featureService' - 'declaration-feature-demonstration-service-codeGen.json' | 'featureService-codeGen' - 'declaration-inherited-service-impl.json' | 'inheritedService' - 'declaration-pet-grooming-service.json' | 'petGroomingService' - 'declaration-pet-service.json' | 'petService' - 'declaration-groovy-service.json' | 'groovyService' - 'declaration-enum-service.json' | 'enumService' - 'declaration-spring-data-rest.json' | 'spring-data-rest' - 'declaration-consumes-produces-not-on-document-context.json' | 'consumesProducesNotOnDocumentContext' - 'declaration-consumes-produces-on-document-context.json' | 'consumesProducesOnDocumentContext' - 'declaration-same-controller.json' | 'same' - 'declaration-cyclic-controller.json' | 'cyclic' - } - - def "should list swagger resources for swagger 2.0"() { - given: - RequestEntity request = RequestEntity.get(new URI("http://localhost:$port/swagger-resources")) - .accept(MediaType.APPLICATION_JSON) - .build() - - when: - def response = http.exchange(request, String) - def slurper = new JsonSlurper() - def result = slurper.parseText(response.body) - - then: - result.find { - it.name == 'petstore' && - it.url == '/v2/api-docs?group=petstore' && - it.swaggerVersion == '2.0' - } - result.find { - it.name == 'businessService' && - it.url == '/v2/api-docs?group=businessService' && - it.swaggerVersion == '2.0' - } - result.find { - it.name == 'concrete' && - it.url == '/v2/api-docs?group=concrete' && - it.swaggerVersion == '2.0' - } - } - - @Ignore - def 'should honor swagger resource listing'() { - given: - RequestEntity request = RequestEntity.get(new URI("http://localhost:$port/api-docs")) - .accept(MediaType.APPLICATION_JSON) - .build() - String contract = fileContents('/contract/swagger/resource-listing.json') - - when: - def response = http.exchange(request, String) - - then: - response.statusCode == HttpStatus.OK - - def bodyWithLFOnly = response.body.replaceAll("\\\\r\\\\n", "\\\\n") //Make sure if we're running on windows the line endings which are double-escaped match up with the resource file above. - JSONAssert.assertEquals(contract, bodyWithLFOnly, NON_EXTENSIBLE) - } - - @Ignore - @Unroll - def 'should honor api v1.2 contract [#contractFile] at endpoint [#declarationPath]'() { - given: - RequestEntity request = RequestEntity.get(new URI("http://localhost:$port/api-docs${declarationPath}")) - .accept(MediaType.APPLICATION_JSON) - .build() - String contract = fileContents("/contract/swagger/$contractFile") - - when: - def response = http.exchange(request, String) - - then: - String raw = response.body - response.statusCode == HttpStatus.OK - maybeWriteToFile( - "/contract/swagger/$contractFile", - raw.replace("localhost:$port", "localhost:__PORT__")) - JSONAssert.assertEquals(contract, raw, NON_EXTENSIBLE) - - where: - contractFile | declarationPath - 'declaration-business-service.json' | '/default/business-service' - 'declaration-concrete-controller.json' | '/default/concrete-controller' - 'declaration-controller-with-no-request-mapping-service.json' | '/default/controller-with-no-request-mapping-service' - 'declaration-fancy-pet-service.json' | '/default/fancy-pet-service' - 'declaration-feature-demonstration-service.json' | '/default/feature-demonstration-service' - 'declaration-inherited-service-impl.json' | '/default/inherited-service-impl' - 'declaration-pet-grooming-service.json' | '/default/pet-grooming-service' - 'declaration-pet-service.json' | '/default/pet-service' - 'declaration-root-controller.json' | '/default/root-controller' - 'declaration-groovy-service.json' | '/default/groovy-service' - } - - - @Ignore - def "should list swagger resources for swagger 1.2"() { - given: - RequestEntity request = RequestEntity.get(new URI("http://localhost:$port/swagger-resources")) - .accept(MediaType.APPLICATION_JSON) - .build() - - when: - def response = http.exchange(request, String) - def slurper = new JsonSlurper() - def result = slurper.parseText(response.body) - - then: - result.find { - it.name == 'default' && - it.url == '/api-docs' && - it.swaggerVersion == '1.2' - } - } - - @TestConfiguration - static class Config { - -// tag::alternate-type-rule-convention[] - @Bean - AlternateTypeRuleConvention jacksonSerializerConvention(TypeResolver resolver) { - new JacksonSerializerConvention(resolver, "springfox.documentation.spring.web.dummy.models") - } -// end::alternate-type-rule-convention[] - } -} \ No newline at end of file diff --git a/swagger-contract-tests/src/test/groovy/springfox/test/contract/swaggertests/ObjectMapperSanityCheck.groovy b/swagger-contract-tests/src/test/groovy/springfox/test/contract/swaggertests/ObjectMapperSanityCheck.groovy deleted file mode 100644 index 1c084cc32eb..00000000000 --- a/swagger-contract-tests/src/test/groovy/springfox/test/contract/swaggertests/ObjectMapperSanityCheck.groovy +++ /dev/null @@ -1,105 +0,0 @@ -/* - * - * - * - * - * Copyright 2017 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * - */ - -package springfox.test.contract.swaggertests - -import com.fasterxml.jackson.annotation.JsonInclude -import com.fasterxml.jackson.databind.ObjectMapper -import groovy.json.JsonSlurper -import org.springframework.beans.factory.annotation.Value -import org.springframework.boot.test.context.SpringBootTest -import org.springframework.boot.test.web.client.TestRestTemplate -import org.springframework.context.annotation.Bean -import org.springframework.context.annotation.ComponentScan -import org.springframework.context.annotation.Configuration -import org.springframework.context.annotation.Primary -import org.springframework.context.support.PropertySourcesPlaceholderConfigurer -import org.springframework.http.MediaType -import org.springframework.http.RequestEntity -import org.springframework.test.context.ContextConfiguration -import spock.lang.Specification -import springfox.documentation.spi.DocumentationType -import springfox.documentation.spring.web.plugins.Docket -import springfox.documentation.swagger2.annotations.EnableSwagger2 -import springfox.test.contract.swagger.SwaggerApplication -import springfox.test.contract.swagger.webflux.listeners.ObjectMapperEventListener - -import static org.springframework.boot.test.context.SpringBootTest.* - -@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT) -@ContextConfiguration(classes = Config) -class ObjectMapperSanityCheck extends Specification { - - @Value('${local.server.port}') - int port - - def "should produce valid swagger json regardless of object mapper configuration"() { - - given: "A customized object mapper always serializing empty attributes" - def http = new TestRestTemplate() - RequestEntity request = RequestEntity.get(new URI("http://localhost:$port/v2/api-docs?group=default")) - .accept(MediaType.APPLICATION_JSON) - .build() - - when: "swagger json is produced" - def response = http.exchange(request, String) - - then: "There should not be a null schemes element" - def slurper = new JsonSlurper() - def swagger = slurper.parseText(response.body) - !swagger.containsKey('schemes') - } - - @Configuration - @EnableSwagger2 - @ComponentScan(basePackageClasses = [SwaggerApplication.class]) - static class Config { - @Bean - Docket testCases() { - return new Docket(DocumentationType.SWAGGER_2).select().build() - } - - @Bean - @Primary - ObjectMapper objectMapperWithIncludeAlways(){ - /* Replaces Spring Boot's object mapper - * http://docs.spring.io/spring-boot/docs/current/reference/html/howto-spring-mvc.html - */ - ObjectMapper objectMapper = new ObjectMapper(); - objectMapper.configure(com.fasterxml.jackson.databind.SerializationFeature.WRITE_EMPTY_JSON_ARRAYS, true ) - objectMapper.setSerializationInclusion(JsonInclude.Include.ALWAYS) - return objectMapper - } - - @Bean - public ObjectMapperEventListener objectMapperEventListener(){ - //Register an ObjectMapperConfigured event listener - return new ObjectMapperEventListener() - } - - - @Bean - static PropertySourcesPlaceholderConfigurer properties() throws Exception { - return new PropertySourcesPlaceholderConfigurer() - } - } -} diff --git a/swagger-contract-tests/src/test/resources/contract/swagger/declaration-business-service.json b/swagger-contract-tests/src/test/resources/contract/swagger/declaration-business-service.json deleted file mode 100644 index bbb103898b2..00000000000 --- a/swagger-contract-tests/src/test/resources/contract/swagger/declaration-business-service.json +++ /dev/null @@ -1,417 +0,0 @@ -{ - "apiVersion": "1.0", - "apis": [ - { - "description": "getAliasedPathVariable", - "operations": [ - { - "method": "GET", - "summary": "Find a business by its id", - "nickname": "findBusinessById", - "produces": [ - "application/json", - "*/*" - ], - "consumes": [ - - ], - "parameters": [ - { - "allowMultiple": false, - "description": "ID of business", - "name": "otherId", - "paramType": "path", - "type": "string", - "required": true - } - ], - "responseMessages": [ - { - "code": 200, - "message": "OK", - "responseModel": "string" - }, - { - "code": 401, - "message": "Unauthorized" - }, - { - "code": 403, - "message": "Forbidden" - }, - { - "code": 404, - "message": "Not Found" - } - ], - "deprecated": "false", - "type": "string" - } - ], - "path": "/businesses/aliased/{otherId}" - }, - { - "description": "businessesByCategories", - "operations": [ - { - "method": "GET", - "summary": "businessesByCategories", - "nickname": "businessesByCategoriesUsingGET", - "produces": [ - "application/json" - ], - "consumes": [ - - ], - "parameters": [ - { - "allowMultiple": true, - "enum": [ - "PRODUCT", - "SERVICE" - ], - "description": "types", - "name": "types", - "paramType": "query", - "items": { - "type": "string" - }, - "type": "array", - "required": true - } - ], - "responseMessages": [ - { - "code": 200, - "message": "OK", - "responseModel": "array" - }, - { - "code": 401, - "message": "Unauthorized" - }, - { - "code": 403, - "message": "Forbidden" - }, - { - "code": 404, - "message": "Not Found" - } - ], - "deprecated": "false", - "items": { - "type": "Biz" - }, - "type": "array" - } - ], - "path": "/businesses/byTypes" - }, - { - "description": "businessAsString", - "operations": [ - { - "method": "POST", - "summary": "businessAsString", - "nickname": "businessAsStringUsingPOST", - "produces": [ - "application/json" - ], - "consumes": [ - "application/json" - ], - "parameters": [ - - ], - "responseMessages": [ - { - "code": 200, - "message": "Business", - "responseModel": "Biz" - }, - { - "code": 201, - "message": "Created" - }, - { - "code": 401, - "message": "Unauthorized" - }, - { - "code": 403, - "message": "Forbidden" - }, - { - "code": 404, - "message": "Not Found" - } - ], - "deprecated": "false", - "type": "string" - } - ], - "path": "/businesses/demonstratesApiModelName" - }, - { - "description": "getNonAliasedPathVariable", - "operations": [ - { - "method": "GET", - "summary": "Find a business by its id", - "nickname": "findBusinessById_1", - "produces": [ - "application/json", - "*/*" - ], - "consumes": [ - - ], - "parameters": [ - { - "allowMultiple": false, - "description": "ID of business", - "name": "businessId", - "paramType": "path", - "type": "string", - "required": true - } - ], - "responseMessages": [ - { - "code": 200, - "message": "OK", - "responseModel": "string" - }, - { - "code": 401, - "message": "Unauthorized" - }, - { - "code": 403, - "message": "Forbidden" - }, - { - "code": 404, - "message": "Not Found" - } - ], - "deprecated": "false", - "type": "string", - "authorizations": { - "oauth2": [ - { - "description": "scope description", - "scope": "scope" - } - ] - } - } - ], - "path": "/businesses/non-aliased/{businessId}" - }, - { - "description": "getResponseEntity", - "operations": [ - { - "method": "GET", - "summary": "getResponseEntity", - "nickname": "getResponseEntityUsingGET", - "produces": [ - "application/json", - "*/*" - ], - "consumes": [ - - ], - "parameters": [ - { - "allowMultiple": false, - "description": "businessId", - "name": "businessId", - "paramType": "path", - "type": "string", - "required": true - } - ], - "responseMessages": [ - { - "code": 200, - "message": "OK", - "responseModel": "string" - }, - { - "code": 401, - "message": "Unauthorized" - }, - { - "code": 403, - "message": "Forbidden" - }, - { - "code": 404, - "message": "Not Found" - } - ], - "deprecated": "false", - "type": "string" - } - ], - "path": "/businesses/responseEntity/{businessId}" - }, - { - "description": "businessTypeEcho", - "operations": [ - { - "method": "POST", - "summary": "businessTypeEcho", - "nickname": "businessTypeEchoUsingPOST", - "produces": [ - "application/json" - ], - "consumes": [ - "application/json" - ], - "parameters": [ - { - "allowMultiple": false, - "enum": [ - "PRODUCT", - "SERVICE" - ], - "description": "business", - "name": "body", - "paramType": "body", - "type": "string", - "required": true - } - ], - "responseMessages": [ - { - "code": 200, - "message": "OK", - "responseModel": "string" - }, - { - "code": 201, - "message": "Created" - }, - { - "code": 401, - "message": "Unauthorized" - }, - { - "code": 403, - "message": "Forbidden" - }, - { - "code": 404, - "message": "Not Found" - } - ], - "deprecated": "false", - "type": "string" - } - ], - "path": "/businesses/typeEcho" - }, - { - "description": "getVanillaPathVariable", - "operations": [ - { - "method": "GET", - "summary": "getVanillaPathVariable", - "nickname": "getVanillaPathVariableUsingGET", - "produces": [ - "application/json", - "*/*" - ], - "consumes": [ - - ], - "parameters": [ - { - "allowMultiple": false, - "description": "businessId", - "name": "businessId", - "paramType": "path", - "type": "string", - "required": true - } - ], - "responseMessages": [ - { - "code": 200, - "message": "OK", - "responseModel": "string" - }, - { - "code": 401, - "message": "Unauthorized" - }, - { - "code": 403, - "message": "Forbidden" - }, - { - "code": 404, - "message": "Not Found" - } - ], - "deprecated": "false", - "type": "string" - } - ], - "path": "/businesses/vanilla/{businessId}" - } - ], - "basePath": "/", - "consumes": [ - "application/json" - ], - "models": { - "Biz": { - "description": "", - "id": "Biz", - "properties": { - "businessType": { - "enum": [ - "PRODUCT", - "SERVICE" - ], - "required": false, - "type": "string" - }, - "id": { - "required": false, - "format": "int32", - "type": "integer" - }, - "inception": { - "required": false, - "format": "date", - "type": "string" - }, - "name": { - "required": false, - "type": "string" - }, - "owner": { - "required": false, - "type": "string" - }, - "taxDate": { - "required": false, - "format": "date-time", - "type": "string" - } - } - } - }, - "produces": [ - "application/json", - "*/*" - ], - "resourcePath": "/businesses", - "swaggerVersion": "1.2" -} \ No newline at end of file diff --git a/swagger-contract-tests/src/test/resources/contract/swagger/declaration-concrete-controller.json b/swagger-contract-tests/src/test/resources/contract/swagger/declaration-concrete-controller.json deleted file mode 100644 index ea3d0d2497d..00000000000 --- a/swagger-contract-tests/src/test/resources/contract/swagger/declaration-concrete-controller.json +++ /dev/null @@ -1,308 +0,0 @@ -{ - "apiVersion": "1.0", - "apis": [ - { - "description": "create", - "operations": [ - { - "method": "PUT", - "summary": "create", - "nickname": "createUsingPUT", - "produces": [ - "*/*" - ], - "consumes": [ - "application/json" - ], - "parameters": [ - { - "allowMultiple": false, - "description": "toCreate", - "name": "body", - "paramType": "body", - "type": "EntityModel«Pet»_1", - "required": true - } - ], - "responseMessages": [ - { - "code": 200, - "message": "OK" - }, - { - "code": 201, - "message": "Created" - }, - { - "code": 401, - "message": "Unauthorized" - }, - { - "code": 403, - "message": "Forbidden" - }, - { - "code": 404, - "message": "Not Found" - } - ], - "deprecated": "false", - "type": "void" - } - ], - "path": "/foo/create-t" - }, - { - "description": "delete", - "operations": [ - { - "method": "DELETE", - "summary": "delete", - "nickname": "deleteUsingDELETE", - "produces": [ - "*/*" - ], - "consumes": [ - - ], - "parameters": [ - { - "allowMultiple": false, - "description": "id", - "name": "id", - "paramType": "path", - "type": "string", - "required": true - } - ], - "responseMessages": [ - { - "code": 200, - "message": "OK", - "responseModel": "HttpEntity«EntityModel«Pet»»" - }, - { - "code": 204, - "message": "No Content" - }, - { - "code": 401, - "message": "Unauthorized" - }, - { - "code": 403, - "message": "Forbidden" - }, - { - "code": 405, - "message": "Invalid input" - } - ], - "deprecated": "false", - "type": "HttpEntity«EntityModel«Pet»»" - } - ], - "path": "/foo/delete-t/{id}" - }, - { - "description": "get", - "operations": [ - { - "method": "GET", - "summary": "get", - "nickname": "getUsingGET", - "produces": [ - "*/*" - ], - "consumes": [ - - ], - "parameters": [ - { - "allowMultiple": false, - "description": "id", - "name": "id", - "paramType": "path", - "type": "string", - "required": true - } - ], - "responseMessages": [ - { - "code": 200, - "message": "OK", - "responseModel": "EntityModel«Pet»" - }, - { - "code": 401, - "message": "Unauthorized" - }, - { - "code": 403, - "message": "Forbidden" - }, - { - "code": 404, - "message": "Not Found" - }, - { - "code": 405, - "message": "Invalid input" - } - ], - "deprecated": "false", - "type": "EntityModel«Pet»" - } - ], - "path": "/foo/get-t/{id}" - } - ], - "basePath": "/", - "consumes": [ - - ], - "models": { - "HttpEntity«EntityModel«Pet»»": { - "description": "", - "id": "HttpEntity«EntityModel«Pet»»", - "properties": { - "body": { - "required": false, - "type": "EntityModel«Pet»" - } - } - }, - "EntityModel«Pet»": { - "description": "", - "id": "EntityModel«Pet»", - "properties": { - "age": { - "required": false, - "format": "int32", - "type": "integer" - }, - "id": { - "required": false, - "type": "string" - }, - "links": { - "required": false, - "type": "Links" - }, - "name": { - "required": false, - "type": "string" - } - } - }, - "LinkRelation": { - "description": "", - "id": "LinkRelation", - "properties": { - - } - }, - "Links": { - "description": "", - "id": "Links", - "properties": { - "empty": { - "required": false, - "type": "boolean" - } - } - }, - "EntityModel«Pet»_1": { - "description": "", - "id": "EntityModel«Pet»_1", - "properties": { - "age": { - "required": false, - "format": "int32", - "type": "integer" - }, - "id": { - "required": false, - "type": "string" - }, - "links": { - "required": false, - "items": { - "type": "Link" - }, - "type": "array" - }, - "name": { - "required": false, - "type": "string" - } - } - }, - "Pet": { - "description": "", - "id": "Pet", - "properties": { - "age": { - "required": false, - "format": "int32", - "type": "integer" - }, - "id": { - "required": false, - "type": "string" - }, - "name": { - "required": false, - "type": "string" - } - } - }, - "Link": { - "description": "", - "id": "Link", - "properties": { - "deprecation": { - "required": false, - "type": "string" - }, - "href": { - "required": false, - "type": "string" - }, - "hreflang": { - "required": false, - "type": "string" - }, - "media": { - "required": false, - "type": "string" - }, - "name": { - "required": false, - "type": "string" - }, - "profile": { - "required": false, - "type": "string" - }, - "rel": { - "required": false, - "type": "LinkRelation" - }, - "title": { - "required": false, - "type": "string" - }, - "type": { - "required": false, - "type": "string" - } - } - } - }, - "produces": [ - - ], - "resourcePath": "/foo", - "swaggerVersion": "1.2" -} \ No newline at end of file diff --git a/swagger-contract-tests/src/test/resources/contract/swagger/declaration-controller-with-no-request-mapping-service.json b/swagger-contract-tests/src/test/resources/contract/swagger/declaration-controller-with-no-request-mapping-service.json deleted file mode 100644 index 97226ae6dba..00000000000 --- a/swagger-contract-tests/src/test/resources/contract/swagger/declaration-controller-with-no-request-mapping-service.json +++ /dev/null @@ -1,133 +0,0 @@ -{ - "apiVersion": "1.0", - "apis": [ - { - "description": "exampleWithNoRequestMapping", - "operations": [ - { - "method": "GET", - "summary": "exampleWithNoRequestMapping", - "nickname": "exampleWithNoRequestMappingUsingGET", - "produces": [ - "*/*" - ], - "consumes": [ - - ], - "parameters": [ - - ], - "responseMessages": [ - { - "code": 200, - "message": "OK", - "responseModel": "Example" - }, - { - "code": 401, - "message": "Unauthorized" - }, - { - "code": 403, - "message": "Forbidden" - }, - { - "code": 404, - "message": "Not Found" - } - ], - "deprecated": "false", - "type": "Example" - } - ], - "path": "/no-request-mapping" - } - ], - "basePath": "/", - "consumes": [ - - ], - "models": { - "Example": { - "description": "", - "id": "Example", - "properties": { - "allCapsSet": { - "required": false, - "items": { - "type": "string" - }, - "type": "array", - "uniqueItems": true - }, - "annotatedEnumType": { - "enum": [ - "ONE", - "TWO" - ], - "required": false, - "type": "string" - }, - "bar": { - "description": "description of bar", - "required": false, - "format": "int32", - "type": "integer" - }, - "enumType": { - "enum": [ - "ONE", - "TWO" - ], - "required": false, - "type": "string" - }, - "foo": { - "required": false, - "type": "string" - }, - "localDateTime": { - "required": false, - "format": "date-time", - "type": "string" - }, - "nestedType": { - "required": false, - "type": "NestedType" - }, - "parentBeanProperty": { - "required": false, - "type": "string" - }, - "propertyWithNoGetterMethod": { - "required": false, - "type": "string" - }, - "propertyWithNoSetterMethod": { - "required": false, - "type": "string" - }, - "readOnlyString": { - "description": "A read only string", - "required": false, - "type": "string" - } - } - }, - "NestedType": { - "description": "", - "id": "NestedType", - "properties": { - "name": { - "required": false, - "type": "string" - } - } - } - }, - "produces": [ - - ], - "resourcePath": "/no-request-mapping", - "swaggerVersion": "1.2" -} \ No newline at end of file diff --git a/swagger-contract-tests/src/test/resources/contract/swagger/declaration-fancy-pet-service.json b/swagger-contract-tests/src/test/resources/contract/swagger/declaration-fancy-pet-service.json deleted file mode 100644 index fc5f9b4882c..00000000000 --- a/swagger-contract-tests/src/test/resources/contract/swagger/declaration-fancy-pet-service.json +++ /dev/null @@ -1,237 +0,0 @@ -{ - "apiVersion": "1.0", - "apis": [ - { - "description": "createObject", - "operations": [ - { - "method": "POST", - "summary": "createObject", - "nickname": "createObjectUsingPOST_1", - "produces": [ - "*/*" - ], - "consumes": [ - "application/json" - ], - "parameters": [ - { - "allowMultiple": false, - "description": "object", - "name": "body", - "paramType": "body", - "type": "FancyPet", - "required": true - } - ], - "responseMessages": [ - { - "code": 200, - "message": "OK", - "responseModel": "int" - }, - { - "code": 201, - "message": "Created" - }, - { - "code": 401, - "message": "Unauthorized" - }, - { - "code": 403, - "message": "Forbidden" - }, - { - "code": 404, - "message": "Not Found" - } - ], - "deprecated": "false", - "format": "int32", - "type": "integer" - } - ], - "path": "/fancypets" - }, - { - "description": "updatePet", - "operations": [ - { - "method": "PUT", - "summary": "updatePet", - "nickname": "updatePetUsingPUT", - "produces": [ - "*/*" - ], - "consumes": [ - "application/json" - ], - "parameters": [ - { - "allowMultiple": false, - "description": "pet", - "name": "body", - "paramType": "body", - "type": "Pet", - "required": true - } - ], - "responseMessages": [ - { - "code": 200, - "message": "OK" - }, - { - "code": 201, - "message": "Created" - }, - { - "code": 401, - "message": "Unauthorized" - }, - { - "code": 403, - "message": "Forbidden" - }, - { - "code": 404, - "message": "Not Found" - } - ], - "deprecated": "false", - "type": "void" - } - ], - "path": "/fancypets" - }, - { - "description": "createObject", - "operations": [ - { - "method": "POST", - "summary": "createObject", - "nickname": "createObjectUsingPOST", - "produces": [ - "*/*" - ], - "consumes": [ - "application/json" - ], - "parameters": [ - { - "allowMultiple": false, - "description": "object", - "name": "body", - "paramType": "body", - "type": "FancyPet", - "required": true - }, - { - "allowMultiple": false, - "description": "someId", - "name": "someId", - "paramType": "path", - "format": "int32", - "type": "integer", - "required": true - } - ], - "responseMessages": [ - { - "code": 200, - "message": "OK", - "responseModel": "int" - }, - { - "code": 201, - "message": "Created" - }, - { - "code": 401, - "message": "Unauthorized" - }, - { - "code": 403, - "message": "Forbidden" - }, - { - "code": 404, - "message": "Not Found" - } - ], - "deprecated": "false", - "format": "int32", - "type": "integer" - } - ], - "path": "/fancypets/?{someId}" - } - ], - "basePath": "/", - "consumes": [ - - ], - "models": { - "Category_1": { - "description": "", - "id": "Category_1", - "properties": { - "name": { - "required": false, - "type": "string" - } - } - }, - "FancyPet": { - "description": "", - "id": "FancyPet", - "properties": { - "age": { - "required": false, - "format": "int32", - "type": "integer" - }, - "categories": { - "required": false, - "items": { - "type": "Category_1" - }, - "type": "array" - }, - "id": { - "required": false, - "type": "string" - }, - "name": { - "required": false, - "type": "string" - } - } - }, - "Pet": { - "description": "", - "id": "Pet", - "properties": { - "age": { - "required": false, - "format": "int32", - "type": "integer" - }, - "id": { - "required": false, - "type": "string" - }, - "name": { - "required": false, - "type": "string" - } - } - } - }, - "produces": [ - - ], - "resourcePath": "/fancypets", - "swaggerVersion": "1.2" -} \ No newline at end of file diff --git a/swagger-contract-tests/src/test/resources/contract/swagger/declaration-feature-demonstration-service.json b/swagger-contract-tests/src/test/resources/contract/swagger/declaration-feature-demonstration-service.json deleted file mode 100644 index b743acc7f9f..00000000000 --- a/swagger-contract-tests/src/test/resources/contract/swagger/declaration-feature-demonstration-service.json +++ /dev/null @@ -1,2344 +0,0 @@ -{ - "apiVersion": "1.0", - "apis": [ - { - "description": "all", - "operations": [ - { - "method": "GET", - "summary": "all", - "nickname": "allUsingGET", - "produces": [ - "*/*" - ], - "consumes": [ - ], - "parameters": [ - ], - "responseMessages": [ - { - "code": 200, - "message": "OK", - "responseModel": "string" - }, - { - "code": 401, - "message": "Unauthorized" - }, - { - "code": 403, - "message": "Forbidden" - }, - { - "code": 404, - "message": "Not Found" - } - ], - "deprecated": "false", - "type": "string" - }, - { - "method": "HEAD", - "summary": "all", - "nickname": "allUsingHEAD", - "produces": [ - "*/*" - ], - "consumes": [ - "application/json" - ], - "parameters": [ - ], - "responseMessages": [ - { - "code": 200, - "message": "OK", - "responseModel": "string" - }, - { - "code": 204, - "message": "No Content" - }, - { - "code": 401, - "message": "Unauthorized" - }, - { - "code": 403, - "message": "Forbidden" - } - ], - "deprecated": "false", - "type": "string" - }, - { - "method": "POST", - "summary": "all", - "nickname": "allUsingPOST", - "produces": [ - "*/*" - ], - "consumes": [ - "application/json" - ], - "parameters": [ - ], - "responseMessages": [ - { - "code": 200, - "message": "OK", - "responseModel": "string" - }, - { - "code": 201, - "message": "Created" - }, - { - "code": 401, - "message": "Unauthorized" - }, - { - "code": 403, - "message": "Forbidden" - }, - { - "code": 404, - "message": "Not Found" - } - ], - "deprecated": "false", - "type": "string" - }, - { - "method": "PUT", - "summary": "all", - "nickname": "allUsingPUT", - "produces": [ - "*/*" - ], - "consumes": [ - "application/json" - ], - "parameters": [ - ], - "responseMessages": [ - { - "code": 200, - "message": "OK", - "responseModel": "string" - }, - { - "code": 201, - "message": "Created" - }, - { - "code": 401, - "message": "Unauthorized" - }, - { - "code": 403, - "message": "Forbidden" - }, - { - "code": 404, - "message": "Not Found" - } - ], - "deprecated": "false", - "type": "string" - }, - { - "method": "PATCH", - "summary": "all", - "nickname": "allUsingPATCH", - "produces": [ - "*/*" - ], - "consumes": [ - "application/json" - ], - "parameters": [ - ], - "responseMessages": [ - { - "code": 200, - "message": "OK", - "responseModel": "string" - }, - { - "code": 204, - "message": "No Content" - }, - { - "code": 401, - "message": "Unauthorized" - }, - { - "code": 403, - "message": "Forbidden" - } - ], - "deprecated": "false", - "type": "string" - }, - { - "method": "DELETE", - "summary": "all", - "nickname": "allUsingDELETE", - "produces": [ - "*/*" - ], - "consumes": [ - ], - "parameters": [ - ], - "responseMessages": [ - { - "code": 200, - "message": "OK", - "responseModel": "string" - }, - { - "code": 204, - "message": "No Content" - }, - { - "code": 401, - "message": "Unauthorized" - }, - { - "code": 403, - "message": "Forbidden" - } - ], - "deprecated": "false", - "type": "string" - }, - { - "method": "OPTIONS", - "summary": "all", - "nickname": "allUsingOPTIONS", - "produces": [ - "*/*" - ], - "consumes": [ - "application/json" - ], - "parameters": [ - ], - "responseMessages": [ - { - "code": 200, - "message": "OK", - "responseModel": "string" - }, - { - "code": 204, - "message": "No Content" - }, - { - "code": 401, - "message": "Unauthorized" - }, - { - "code": 403, - "message": "Forbidden" - } - ], - "deprecated": "false", - "type": "string" - }, - { - "method": "TRACE", - "summary": "all", - "nickname": "allUsingTRACE", - "produces": [ - "*/*" - ], - "consumes": [ - "application/json" - ], - "parameters": [ - ], - "responseMessages": [ - { - "code": 200, - "message": "OK", - "responseModel": "string" - }, - { - "code": 204, - "message": "No Content" - }, - { - "code": 401, - "message": "Unauthorized" - }, - { - "code": 403, - "message": "Forbidden" - } - ], - "deprecated": "false", - "type": "string" - } - ], - "path": "/features" - }, - { - "description": "findById", - "operations": [ - { - "method": "GET", - "summary": "findById", - "nickname": "findByIdUsingGET", - "produces": [ - "application/vnd.com.pet+json", - "application/vnd.com.fancy-pet+json" - ], - "consumes": [ - ], - "parameters": [ - { - "allowMultiple": false, - "description": "itemId", - "name": "itemId", - "paramType": "path", - "type": "string", - "required": true - } - ], - "responseMessages": [ - { - "code": 200, - "message": "OK", - "responseModel": "FancyPet" - }, - { - "code": 401, - "message": "Unauthorized" - }, - { - "code": 403, - "message": "Forbidden" - }, - { - "code": 404, - "message": "Not Found" - } - ], - "deprecated": "false", - "type": "FancyPet" - } - ], - "path": "/features/1367/{itemId}" - }, - { - "description": "base64EncodedBody", - "operations": [ - { - "method": "POST", - "summary": "base64EncodedBody", - "nickname": "base64EncodedBodyUsingPOST", - "produces": [ - "*/*" - ], - "consumes": [ - "application/json" - ], - "parameters": [ - { - "allowMultiple": true, - "description": "base64Encoded", - "name": "body", - "paramType": "body", - "type": "string", - "required": true - } - ], - "responseMessages": [ - { - "code": 200, - "message": "OK" - }, - { - "code": 201, - "message": "Created" - }, - { - "code": 401, - "message": "Unauthorized" - }, - { - "code": 403, - "message": "Forbidden" - }, - { - "code": 404, - "message": "Not Found" - } - ], - "deprecated": "false", - "type": "void" - } - ], - "path": "/features/1430-body" - }, - { - "description": "proper", - "operations": [ - { - "method": "POST", - "summary": "proper", - "nickname": "properUsingPOST", - "produces": [ - "*/*" - ], - "consumes": [ - "application/json" - ], - "parameters": [ - { - "allowMultiple": true, - "description": "base64Encoded", - "name": "base64Encoded", - "paramType": "query", - "type": "string", - "required": true - } - ], - "responseMessages": [ - { - "code": 200, - "message": "OK" - }, - { - "code": 201, - "message": "Created" - }, - { - "code": 401, - "message": "Unauthorized" - }, - { - "code": 403, - "message": "Forbidden" - }, - { - "code": 404, - "message": "Not Found" - } - ], - "deprecated": "false", - "type": "void" - } - ], - "path": "/features/1430-query" - }, - { - "description": "serializablePetEntity", - "operations": [ - { - "method": "GET", - "summary": "serializablePetEntity", - "nickname": "serializablePetEntityUsingGET", - "produces": [ - "*/*" - ], - "consumes": [ - ], - "parameters": [ - { - "allowMultiple": false, - "description": "itemId", - "name": "itemId", - "paramType": "path", - "type": "string", - "required": true - } - ], - "responseMessages": [ - { - "code": 200, - "message": "OK", - "responseModel": "Pet" - }, - { - "code": 401, - "message": "Unauthorized" - }, - { - "code": 403, - "message": "Forbidden" - }, - { - "code": 404, - "message": "Not Found" - } - ], - "deprecated": "false", - "type": "Pet" - } - ], - "path": "/features/1490/entity/{itemId}" - }, - { - "description": "serializablePet", - "operations": [ - { - "method": "GET", - "summary": "serializablePet", - "nickname": "serializablePetUsingGET", - "produces": [ - "*/*" - ], - "consumes": [ - ], - "parameters": [ - { - "allowMultiple": false, - "description": "itemId", - "name": "itemId", - "paramType": "path", - "type": "string", - "required": true - } - ], - "responseMessages": [ - { - "code": 200, - "message": "OK", - "responseModel": "Pet" - }, - { - "code": 401, - "message": "Unauthorized" - }, - { - "code": 403, - "message": "Forbidden" - }, - { - "code": 404, - "message": "Not Found" - } - ], - "deprecated": "false", - "type": "Pet" - } - ], - "path": "/features/1490/{itemId}" - }, - { - "description": "updateSerializablePet", - "operations": [ - { - "method": "PUT", - "summary": "updateSerializablePet", - "nickname": "updateSerializablePetUsingPUT", - "produces": [ - "*/*" - ], - "consumes": [ - "application/json" - ], - "parameters": [ - { - "allowMultiple": false, - "description": "pet", - "name": "body", - "paramType": "body", - "type": "Pet", - "required": true - }, - { - "allowMultiple": false, - "description": "itemId", - "name": "itemId", - "paramType": "path", - "type": "string", - "required": true - } - ], - "responseMessages": [ - { - "code": 200, - "message": "OK" - }, - { - "code": 201, - "message": "Created" - }, - { - "code": 401, - "message": "Unauthorized" - }, - { - "code": 403, - "message": "Forbidden" - }, - { - "code": 404, - "message": "Not Found" - } - ], - "deprecated": "false", - "type": "void" - } - ], - "path": "/features/1490/{itemId}" - }, - { - "description": "saveUser", - "operations": [ - { - "consumes": [ - "application/json" - ], - "deprecated": "false", - "method": "POST", - "nickname": "saveUserUsingPOST", - "parameters": [], - "produces": [ - "*/*" - ], - "responseMessages": [ - { - "code": 200, - "message": "OK" - }, - { - "code": 201, - "message": "Created" - }, - { - "code": 401, - "message": "Unauthorized" - }, - { - "code": 403, - "message": "Forbidden" - }, - { - "code": 404, - "message": "User not found" - }, - { - "code": 405, - "message": "Validation exception" - } - ], - "summary": "Demo using examples", - "type": "void" - } - ], - "path": "/features/1570" - }, - { - "description": "addFiles", - "operations": [ - { - "method": "POST", - "summary": "Add a new contact with file attachment", - "nickname": "addFilesUsingPOST", - "produces": [ - "*/*" - ], - "consumes": [ - "application/json" - ], - "parameters": [ - { - "allowMultiple": true, - "description": "files", - "name": "files", - "paramType": "form", - "items": { - "type": "File" - }, - "type": "array", - "required": true - } - ], - "responseMessages": [ - { - "code": 200, - "message": "OK" - }, - { - "code": 201, - "message": "Created" - }, - { - "code": 401, - "message": "Unauthorized" - }, - { - "code": 403, - "message": "Forbidden" - }, - { - "code": 404, - "message": "Not Found" - } - ], - "deprecated": "false", - "type": "void" - } - ], - "path": "/features/addFiles" - }, - { - "description": "allMethodAllowed", - "operations": [ - { - "method": "GET", - "summary": "allMethodAllowed", - "nickname": "allMethodAllowedUsingGET", - "produces": [ - "*/*" - ], - "consumes": [ - ], - "parameters": [ - ], - "responseMessages": [ - { - "code": 200, - "message": "OK" - }, - { - "code": 401, - "message": "Unauthorized" - }, - { - "code": 403, - "message": "Forbidden" - }, - { - "code": 404, - "message": "Not Found" - } - ], - "deprecated": "false", - "type": "void" - }, - { - "method": "HEAD", - "summary": "allMethodAllowed", - "nickname": "allMethodAllowedUsingHEAD", - "produces": [ - "*/*" - ], - "consumes": [ - "application/json" - ], - "parameters": [ - ], - "responseMessages": [ - { - "code": 200, - "message": "OK" - }, - { - "code": 204, - "message": "No Content" - }, - { - "code": 401, - "message": "Unauthorized" - }, - { - "code": 403, - "message": "Forbidden" - } - ], - "deprecated": "false", - "type": "void" - }, - { - "method": "POST", - "summary": "allMethodAllowed", - "nickname": "allMethodAllowedUsingPOST", - "produces": [ - "*/*" - ], - "consumes": [ - "application/json" - ], - "parameters": [ - ], - "responseMessages": [ - { - "code": 200, - "message": "OK" - }, - { - "code": 201, - "message": "Created" - }, - { - "code": 401, - "message": "Unauthorized" - }, - { - "code": 403, - "message": "Forbidden" - }, - { - "code": 404, - "message": "Not Found" - } - ], - "deprecated": "false", - "type": "void" - }, - { - "method": "PUT", - "summary": "allMethodAllowed", - "nickname": "allMethodAllowedUsingPUT", - "produces": [ - "*/*" - ], - "consumes": [ - "application/json" - ], - "parameters": [ - ], - "responseMessages": [ - { - "code": 200, - "message": "OK" - }, - { - "code": 201, - "message": "Created" - }, - { - "code": 401, - "message": "Unauthorized" - }, - { - "code": 403, - "message": "Forbidden" - }, - { - "code": 404, - "message": "Not Found" - } - ], - "deprecated": "false", - "type": "void" - }, - { - "method": "PATCH", - "summary": "allMethodAllowed", - "nickname": "allMethodAllowedUsingPATCH", - "produces": [ - "*/*" - ], - "consumes": [ - "application/json" - ], - "parameters": [ - ], - "responseMessages": [ - { - "code": 200, - "message": "OK" - }, - { - "code": 204, - "message": "No Content" - }, - { - "code": 401, - "message": "Unauthorized" - }, - { - "code": 403, - "message": "Forbidden" - } - ], - "deprecated": "false", - "type": "void" - }, - { - "method": "DELETE", - "summary": "allMethodAllowed", - "nickname": "allMethodAllowedUsingDELETE", - "produces": [ - "*/*" - ], - "consumes": [ - ], - "parameters": [ - ], - "responseMessages": [ - { - "code": 200, - "message": "OK" - }, - { - "code": 204, - "message": "No Content" - }, - { - "code": 401, - "message": "Unauthorized" - }, - { - "code": 403, - "message": "Forbidden" - } - ], - "deprecated": "false", - "type": "void" - }, - { - "method": "OPTIONS", - "summary": "allMethodAllowed", - "nickname": "allMethodAllowedUsingOPTIONS", - "produces": [ - "*/*" - ], - "consumes": [ - "application/json" - ], - "parameters": [ - ], - "responseMessages": [ - { - "code": 200, - "message": "OK" - }, - { - "code": 204, - "message": "No Content" - }, - { - "code": 401, - "message": "Unauthorized" - }, - { - "code": 403, - "message": "Forbidden" - } - ], - "deprecated": "false", - "type": "void" - }, - { - "method": "TRACE", - "summary": "allMethodAllowed", - "nickname": "allMethodAllowedUsingTRACE", - "produces": [ - "*/*" - ], - "consumes": [ - "application/json" - ], - "parameters": [ - ], - "responseMessages": [ - { - "code": 200, - "message": "OK" - }, - { - "code": 204, - "message": "No Content" - }, - { - "code": 401, - "message": "Unauthorized" - }, - { - "code": 403, - "message": "Forbidden" - } - ], - "deprecated": "false", - "type": "void" - } - ], - "path": "/features/allMethodsAllowed" - }, - { - "description": "getBare", - "operations": [ - { - "method": "POST", - "summary": "getBare", - "nickname": "getBareUsingPOST", - "produces": [ - "*/*" - ], - "consumes": [ - "application/json" - ], - "parameters": [ - { - "allowMultiple": false, - "defaultValue": "", - "description": "description of allCapsSet", - "name": "allCapsSet", - "paramAccess": "", - "paramType": "query", - "items": { - "type": "string" - }, - "type": "array", - "uniqueItems": true, - "required": false - }, - { - "allowMultiple": false, - "enum": [ - "ONE", - "TWO" - ], - "defaultValue": "", - "description": "description of annotatedEnumType", - "name": "annotatedEnumType", - "paramAccess": "", - "paramType": "query", - "type": "string", - "required": false - }, - { - "allowMultiple": false, - "description": "description of bar", - "name": "bar", - "paramAccess": "", - "paramType": "query", - "format": "int32", - "type": "integer", - "required": false - }, - { - "allowMultiple": false, - "enum": [ - "ONE", - "TWO" - ], - "name": "enumType", - "paramType": "query", - "type": "string", - "required": false - }, - { - "allowMultiple": false, - "enum": [ - "man", - "chu" - ], - "defaultValue": "", - "description": "description of foo", - "name": "foo", - "paramAccess": "", - "paramType": "query", - "type": "string", - "required": true - }, - { - "allowMultiple": false, - "defaultValue": "", - "description": "local date time desc dd-MM-yyyy hh:mm:ss", - "name": "localDateTime", - "paramAccess": "", - "paramType": "query", - "format": "date-time", - "type": "string", - "required": true - }, - { - "allowMultiple": false, - "name": "nestedType.name", - "paramType": "query", - "type": "string", - "required": false - }, - { - "allowMultiple": false, - "name": "parentBeanProperty", - "paramType": "query", - "type": "string", - "required": false - }, - { - "allowMultiple": false, - "name": "propertyWithNoSetterMethod", - "paramType": "query", - "type": "string", - "required": false - }, - { - "allowMultiple": false, - "description": "A read only string", - "name": "readOnlyString", - "paramAccess": "", - "paramType": "query", - "type": "string", - "required": false - } - ], - "responseMessages": [ - { - "code": 200, - "message": "OK" - }, - { - "code": 201, - "message": "Created" - }, - { - "code": 401, - "message": "Unauthorized" - }, - { - "code": 403, - "message": "Forbidden" - }, - { - "code": 404, - "message": "Not Found" - } - ], - "deprecated": "false", - "type": "void" - } - ], - "path": "/features/bare" - }, - { - "description": "updateBigDecimal", - "operations": [ - { - "method": "POST", - "summary": "updateBigDecimal", - "nickname": "updateBigDecimalUsingPOST", - "produces": [ - "*/*" - ], - "consumes": [ - "application/json" - ], - "parameters": [ - { - "allowMultiple": false, - "description": "input", - "name": "input", - "paramType": "query", - "type": "number", - "required": false - } - ], - "responseMessages": [ - { - "code": 200, - "message": "OK" - }, - { - "code": 201, - "message": "Created" - }, - { - "code": 401, - "message": "Unauthorized" - }, - { - "code": 403, - "message": "Forbidden" - }, - { - "code": 404, - "message": "Not Found" - } - ], - "deprecated": "false", - "type": "void" - } - ], - "path": "/features/bigDecimal" - }, - { - "description": "updateBoolean", - "operations": [ - { - "method": "POST", - "summary": "updateBoolean", - "nickname": "updateBooleanUsingPOST", - "produces": [ - "*/*" - ], - "consumes": [ - "application/json" - ], - "parameters": [ - { - "allowMultiple": false, - "description": "input", - "name": "input", - "paramType": "query", - "type": "boolean", - "required": false - } - ], - "responseMessages": [ - { - "code": 200, - "message": "OK" - }, - { - "code": 201, - "message": "Created" - }, - { - "code": 401, - "message": "Unauthorized" - }, - { - "code": 403, - "message": "Forbidden" - }, - { - "code": 404, - "message": "Not Found" - } - ], - "deprecated": "false", - "type": "void" - } - ], - "path": "/features/boolean" - }, - { - "description": "updateDate", - "operations": [ - { - "method": "POST", - "summary": "updateDate", - "nickname": "updateDateUsingPOST", - "produces": [ - "*/*" - ], - "consumes": [ - "application/json" - ], - "parameters": [ - { - "allowMultiple": false, - "description": "localDate", - "name": "localDate", - "paramType": "query", - "format": "date", - "type": "string", - "required": false - } - ], - "responseMessages": [ - { - "code": 200, - "message": "OK" - }, - { - "code": 201, - "message": "Created" - }, - { - "code": 401, - "message": "Unauthorized" - }, - { - "code": 403, - "message": "Forbidden" - }, - { - "code": 404, - "message": "Not Found" - } - ], - "deprecated": "false", - "type": "void" - } - ], - "path": "/features/date" - }, - { - "description": "getEffective", - "operations": [ - { - "method": "GET", - "summary": "getEffective", - "nickname": "getEffectiveUsingGET", - "produces": [ - "*/*" - ], - "consumes": [ - ], - "parameters": [ - ], - "responseMessages": [ - { - "code": 200, - "message": "OK", - "responseModel": "Example" - }, - { - "code": 401, - "message": "Unauthorized" - }, - { - "code": 403, - "message": "Forbidden" - }, - { - "code": 404, - "message": "Not Found" - } - ], - "deprecated": "false", - "type": "Example" - } - ], - "path": "/features/effective" - }, - { - "description": "getEffectives", - "operations": [ - { - "method": "GET", - "summary": "getEffectives", - "nickname": "getEffectivesUsingGET", - "produces": [ - "*/*" - ], - "consumes": [ - ], - "parameters": [ - ], - "responseMessages": [ - { - "code": 200, - "message": "OK", - "responseModel": "array" - }, - { - "code": 401, - "message": "Unauthorized" - }, - { - "code": 403, - "message": "Forbidden" - }, - { - "code": 404, - "message": "Not Found" - } - ], - "deprecated": "false", - "items": { - "type": "Example" - }, - "type": "array" - } - ], - "path": "/features/effectives" - }, - { - "description": "getEnumAsObject", - "operations": [ - { - "method": "GET", - "summary": "getEnumAsObject", - "nickname": "getEnumAsObjectUsingGET", - "produces": [ - "*/*" - ], - "consumes": [ - ], - "parameters": [ - ], - "responseMessages": [ - { - "code": 200, - "message": "OK", - "responseModel": "EnumObjectType" - }, - { - "code": 401, - "message": "Unauthorized" - }, - { - "code": 403, - "message": "Forbidden" - }, - { - "code": 404, - "message": "Not Found" - } - ], - "deprecated": "false", - "type": "EnumObjectType" - } - ], - "path": "/features/enumObject" - }, - { - "description": "updateListOfExamples", - "operations": [ - { - "method": "PUT", - "summary": "updateListOfExamples", - "nickname": "updateListOfExamplesUsingPUT", - "produces": [ - "*/*" - ], - "consumes": [ - "application/json" - ], - "parameters": [ - { - "allowMultiple": true, - "description": "examples", - "name": "examples", - "paramType": "query", - "items": { - "type": "Example" - }, - "type": "array", - "required": false - } - ], - "responseMessages": [ - { - "code": 200, - "message": "OK" - }, - { - "code": 201, - "message": "Created" - }, - { - "code": 401, - "message": "Unauthorized" - }, - { - "code": 403, - "message": "Forbidden" - }, - { - "code": 404, - "message": "Not Found" - } - ], - "deprecated": "false", - "type": "void" - } - ], - "path": "/features/examples" - }, - { - "description": "findVehicles", - "operations": [ - { - "method": "GET", - "summary": "findVehicles", - "nickname": "findVehiclesUsingGET", - "produces": [ - "*/*" - ], - "consumes": [ - ], - "parameters": [ - { - "allowMultiple": false, - "description": "type", - "name": "type", - "paramType": "query", - "type": "string", - "required": true - } - ], - "responseMessages": [ - { - "code": 200, - "message": "OK", - "responseModel": "array" - }, - { - "code": 401, - "message": "Unauthorized" - }, - { - "code": 403, - "message": "Forbidden" - }, - { - "code": 404, - "message": "Not Found" - } - ], - "deprecated": "false", - "items": { - "type": "Vehicle" - }, - "type": "array" - } - ], - "path": "/features/inheritance" - }, - { - "description": "updateListOfIntegers", - "operations": [ - { - "method": "PUT", - "summary": "updateListOfIntegers", - "nickname": "updateListOfIntegersUsingPUT", - "produces": [ - "*/*" - ], - "consumes": [ - "application/json" - ], - "parameters": [ - { - "allowMultiple": true, - "description": "integers", - "name": "integers", - "paramType": "query", - "items": { - "format": "int32", - "type": "integer" - }, - "type": "array", - "required": false - } - ], - "responseMessages": [ - { - "code": 200, - "message": "OK" - }, - { - "code": 201, - "message": "Created" - }, - { - "code": 401, - "message": "Unauthorized" - }, - { - "code": 403, - "message": "Forbidden" - }, - { - "code": 404, - "message": "Not Found" - } - ], - "deprecated": "false", - "type": "void" - } - ], - "path": "/features/integers" - }, - { - "description": "listOfMaps", - "operations": [ - { - "method": "GET", - "summary": "listOfMaps", - "nickname": "listOfMapsUsingGET", - "produces": [ - "*/*" - ], - "consumes": [ - ], - "parameters": [ - ], - "responseMessages": [ - { - "code": 200, - "message": "OK", - "responseModel": "array" - }, - { - "code": 401, - "message": "Unauthorized" - }, - { - "code": 403, - "message": "Forbidden" - }, - { - "code": 404, - "message": "Not Found" - } - ], - "deprecated": "false", - "type": "List[Map«string,string»]" - } - ], - "path": "/features/listOfMaps" - }, - { - "description": "mapOfMapOfExample", - "operations": [ - { - "method": "GET", - "summary": "mapOfMapOfExample", - "nickname": "mapOfMapOfExampleUsingGET", - "produces": [ - "*/*" - ], - "consumes": [ - ], - "parameters": [ - ], - "responseMessages": [ - { - "code": 200, - "message": "OK", - "responseModel": "array" - }, - { - "code": 401, - "message": "Unauthorized" - }, - { - "code": 403, - "message": "Forbidden" - }, - { - "code": 404, - "message": "Not Found" - } - ], - "deprecated": "false", - "type": "List[Entry«string,Map«string,Example»»]" - } - ], - "path": "/features/mapOfMapOfExample" - }, - { - "description": "modelWithMapProperty", - "operations": [ - { - "method": "GET", - "summary": "modelWithMapProperty", - "nickname": "modelWithMapPropertyUsingGET", - "produces": [ - "*/*" - ], - "consumes": [ - ], - "parameters": [ - ], - "responseMessages": [ - { - "code": 200, - "message": "OK", - "responseModel": "ModelWithMapProperty" - }, - { - "code": 401, - "message": "Unauthorized" - }, - { - "code": 403, - "message": "Forbidden" - }, - { - "code": 404, - "message": "Not Found" - } - ], - "deprecated": "false", - "type": "ModelWithMapProperty" - } - ], - "path": "/features/mapProperty" - }, - { - "description": "getModelAttribute", - "operations": [ - { - "method": "GET", - "summary": "getModelAttribute", - "nickname": "getModelAttributeUsingGET", - "produces": [ - "*/*" - ], - "consumes": [ - ], - "parameters": [ - { - "allowMultiple": true, - "name": "accountTypes", - "paramType": "query", - "items": { - "type": "string" - }, - "type": "array", - "required": false - }, - { - "allowMultiple": true, - "name": "arrayProp", - "paramType": "query", - "items": { - "format": "int32", - "type": "integer" - }, - "type": "array", - "required": false - }, - { - "allowMultiple": false, - "name": "complexProp.name", - "paramType": "query", - "type": "string", - "required": false - }, - { - "allowMultiple": false, - "name": "intProp", - "paramType": "query", - "format": "int32", - "type": "integer", - "required": false - }, - { - "allowMultiple": true, - "name": "listProp", - "paramType": "query", - "items": { - "type": "string" - }, - "type": "array", - "required": false - }, - { - "allowMultiple": false, - "name": "stringProp", - "paramType": "query", - "type": "string", - "required": false - } - ], - "responseMessages": [ - { - "code": 200, - "message": "OK" - }, - { - "code": 401, - "message": "Unauthorized" - }, - { - "code": 403, - "message": "Forbidden" - }, - { - "code": 404, - "message": "Not Found" - } - ], - "deprecated": "false", - "type": "void" - } - ], - "path": "/features/modelAttributes" - }, - { - "description": "propertyWithObjectNode", - "operations": [ - { - "method": "POST", - "summary": "propertyWithObjectNode", - "nickname": "propertyWithObjectNodeUsingPOST", - "produces": [ - "*/*" - ], - "consumes": [ - "application/json" - ], - "parameters": [ - { - "allowMultiple": false, - "description": "model", - "name": "body", - "paramType": "body", - "type": "ModelWithObjectNode", - "required": true - } - ], - "responseMessages": [ - { - "code": 200, - "message": "OK" - }, - { - "code": 201, - "message": "Created" - }, - { - "code": 401, - "message": "Unauthorized" - }, - { - "code": 403, - "message": "Forbidden" - }, - { - "code": 404, - "message": "Not Found" - } - ], - "deprecated": "false", - "type": "void" - } - ], - "path": "/features/propertyWithObjectNode" - }, - { - "description": "updateBaz", - "operations": [ - { - "method": "POST", - "summary": "updateBaz", - "nickname": "updateBazUsingPOST", - "produces": [ - "*/*" - ], - "consumes": [ - "application/json" - ], - "parameters": [ - { - "allowMultiple": false, - "enum": [ - "ONE", - "TWO" - ], - "description": "enumType", - "name": "enumType", - "paramType": "query", - "type": "string", - "required": false - } - ], - "responseMessages": [ - { - "code": 200, - "message": "OK" - }, - { - "code": 201, - "message": "Created" - }, - { - "code": 401, - "message": "Unauthorized" - }, - { - "code": 403, - "message": "Forbidden" - }, - { - "code": 404, - "message": "Not Found" - } - ], - "deprecated": "false", - "type": "void" - } - ], - "path": "/features/status" - }, - { - "description": "updateBazes", - "operations": [ - { - "method": "POST", - "summary": "updateBazes", - "nickname": "updateBazesUsingPOST", - "produces": [ - "*/*" - ], - "consumes": [ - "application/json" - ], - "parameters": [ - { - "allowMultiple": true, - "enum": [ - "ONE", - "TWO" - ], - "description": "enumType", - "name": "enumType", - "paramType": "query", - "items": { - "type": "string" - }, - "type": "array", - "required": false - } - ], - "responseMessages": [ - { - "code": 200, - "message": "OK" - }, - { - "code": 201, - "message": "Created" - }, - { - "code": 401, - "message": "Unauthorized" - }, - { - "code": 403, - "message": "Forbidden" - }, - { - "code": 404, - "message": "Not Found" - } - ], - "deprecated": "false", - "type": "void" - } - ], - "path": "/features/statuses" - }, - { - "description": "getPetById", - "operations": [ - { - "method": "GET", - "summary": "Find pet by ID", - "notes": "Returns a pet when ID < 10. ID > 10 or non-integers will simulate API error conditions", - "nickname": "getPetByIdUsingGET", - "produces": [ - "*/*" - ], - "consumes": [ - ], - "parameters": [ - { - "allowMultiple": false, - "maximum": "5", - "minimum": "1", - "description": "ID of pet that needs to be fetched", - "name": "petId", - "paramType": "path", - "type": "string", - "required": true - } - ], - "responseMessages": [ - { - "code": 200, - "message": "OK", - "responseModel": "Pet" - }, - { - "code": 401, - "message": "Unauthorized" - }, - { - "code": 403, - "message": "Forbidden" - }, - { - "code": 404, - "message": "Not Found" - } - ], - "deprecated": "false", - "type": "Pet" - } - ], - "path": "/features/{petId}" - } - ], - "basePath": "/", - "consumes": [ - ], - "models": { - "Entry«string,Map«string,Example»»": { - "description": "", - "id": "Entry«string,Map«string,Example»»", - "properties": { - "key": { - "required": false, - "type": "List[Entry«string,Example»]" - } - } - }, - "Category": { - "description": "", - "id": "Category", - "properties": { - "name": { - "required": false, - "type": "string" - } - } - }, - "ModelWithMapProperty": { - "description": "Describes model with map property", - "id": "ModelWithMapProperty", - "properties": { - "params": { - "description": "Map of params to be sent", - "required": false, - "type": "object" - } - } - }, - "ObjectNode": { - "description": "", - "id": "ObjectNode", - "properties": { - "array": { - "required": false, - "type": "boolean" - }, - "bigDecimal": { - "required": false, - "type": "boolean" - }, - "bigInteger": { - "required": false, - "type": "boolean" - }, - "binary": { - "required": false, - "type": "boolean" - }, - "boolean": { - "required": false, - "type": "boolean" - }, - "containerNode": { - "required": false, - "type": "boolean" - }, - "double": { - "required": false, - "type": "boolean" - }, - "float": { - "required": false, - "type": "boolean" - }, - "floatingPointNumber": { - "required": false, - "type": "boolean" - }, - "int": { - "required": false, - "type": "boolean" - }, - "integralNumber": { - "required": false, - "type": "boolean" - }, - "long": { - "required": false, - "type": "boolean" - }, - "missingNode": { - "required": false, - "type": "boolean" - }, - "nodeType": { - "enum": [ - "ARRAY", - "BINARY", - "BOOLEAN", - "MISSING", - "NULL", - "NUMBER", - "OBJECT", - "POJO", - "STRING" - ], - "required": false, - "type": "string" - }, - "null": { - "required": false, - "type": "boolean" - }, - "number": { - "required": false, - "type": "boolean" - }, - "object": { - "required": false, - "type": "boolean" - }, - "pojo": { - "required": false, - "type": "boolean" - }, - "short": { - "required": false, - "type": "boolean" - }, - "textual": { - "required": false, - "type": "boolean" - }, - "valueNode": { - "required": false, - "type": "boolean" - } - } - }, - "InputStream": { - "description": "", - "id": "InputStream", - "properties": { - } - }, - "Entry«string,Example»": { - "description": "", - "id": "Entry«string,Example»", - "properties": { - "key": { - "required": false, - "type": "Example" - } - } - }, - "Truck": { - "description": "", - "id": "Truck", - "properties": { - "make": { - "required": false, - "type": "string" - }, - "model": { - "required": false, - "type": "string" - }, - "payloadCapacity": { - "required": false, - "format": "double", - "type": "number" - } - } - }, - "Entry«string,Map«string,Example»»": { - "description": "", - "id": "Entry«string,Map«string,Example»»", - "properties": { - "key": { - "required": false, - "type": "List[Entry«string,Example»]" - } - } - }, - "NestedType": { - "description": "", - "id": "NestedType", - "properties": { - "name": { - "required": false, - "type": "string" - } - } - }, - "Vehicle": { - "description": "", - "id": "Vehicle", - "properties": { - "make": { - "required": false, - "type": "string" - }, - "model": { - "required": false, - "type": "string" - } - }, - "subTypes": [ - "Car", - "Truck" - ] - }, - "ModelWithObjectNode": { - "description": "", - "id": "ModelWithObjectNode", - "properties": { - "anyObject": { - "required": false, - "type": "ObjectNode" - } - } - }, - "Car": { - "description": "", - "id": "Car", - "properties": { - "make": { - "required": false, - "type": "string" - }, - "model": { - "required": false, - "type": "string" - }, - "seatingCapacity": { - "required": false, - "format": "int32", - "type": "integer" - }, - "topSpeed": { - "required": false, - "format": "double", - "type": "number" - - } - } - }, - "Example": { - "description": "", - "id": "Example", - "properties": { - "allCapsSet": { - "required": false, - "items": { - "type": "string" - }, - "type": "array", - "uniqueItems": true - }, - "annotatedEnumType": { - "enum": [ - "ONE", - "TWO" - ], - "required": false, - "type": "string" - }, - "bar": { - "description": "description of bar", - "required": false, - "format": "int32", - "type": "integer" - }, - "enumType": { - "enum": [ - "ONE", - "TWO" - ], - "required": false, - "type": "string" - }, - "foo": { - "required": false, - "type": "string" - }, - "localDateTime": { - "required": false, - "format": "date-time", - "type": "string" - }, - "nestedType": { - "required": false, - "type": "NestedType" - }, - "parentBeanProperty": { - "required": false, - "type": "string" - }, - "propertyWithNoGetterMethod": { - "required": false, - "type": "string" - }, - "propertyWithNoSetterMethod": { - "required": false, - "type": "string" - }, - "readOnlyString": { - "description": "A read only string", - "required": false, - "type": "string" - } - } - }, - "EnumObjectType": { - "description": "", - "id": "EnumObjectType", - "properties": { - "description": { - "required": false, - "type": "string" - }, - "name": { - "required": false, - "type": "string" - } - } - }, - "FancyPet": { - "description": "", - "id": "FancyPet", - "properties": { - "age": { - "required": false, - "format": "int32", - "type": "integer" - }, - "categories": { - "required": false, - "items": { - "type": "Category" - }, - "type": "array" - }, - "id": { - "required": false, - "type": "string" - }, - "name": { - "required": false, - "type": "string" - } - } - }, - "Pet": { - "description": "", - "id": "Pet", - "properties": { - "age": { - "required": false, - "format": "int32", - "type": "integer" - }, - "id": { - "required": false, - "type": "string" - }, - "name": { - "required": false, - "type": "string" - } - } - } - }, - "produces": [ - ], - "resourcePath": "/features", - "swaggerVersion": "1.2" -} \ No newline at end of file diff --git a/swagger-contract-tests/src/test/resources/contract/swagger/declaration-groovy-service.json b/swagger-contract-tests/src/test/resources/contract/swagger/declaration-groovy-service.json deleted file mode 100644 index 855271a6420..00000000000 --- a/swagger-contract-tests/src/test/resources/contract/swagger/declaration-groovy-service.json +++ /dev/null @@ -1,118 +0,0 @@ -{ - "apiVersion": "1.0", - "apis": [ - { - "description": "groovyModel", - "operations": [ - { - "method": "GET", - "summary": "groovyModel", - "nickname": "groovyModelUsingGET", - "produces": [ - "*/*" - ], - "consumes": [ - - ], - "parameters": [ - - ], - "responseMessages": [ - { - "code": 200, - "message": "OK", - "responseModel": "GroovyModel" - }, - { - "code": 401, - "message": "Unauthorized" - }, - { - "code": 403, - "message": "Forbidden" - }, - { - "code": 404, - "message": "Not Found" - } - ], - "deprecated": "false", - "type": "GroovyModel" - } - ], - "path": "/groovy/groovyModel" - }, - { - "description": "updateGroovyModel", - "operations": [ - { - "method": "PUT", - "summary": "updateGroovyModel", - "nickname": "updateGroovyModelUsingPUT", - "produces": [ - "*/*" - ], - "consumes": [ - "application/json" - ], - "parameters": [ - { - "allowMultiple": false, - "description": "model", - "name": "body", - "paramType": "body", - "type": "GroovyModel", - "required": true - } - ], - "responseMessages": [ - { - "code": 200, - "message": "OK" - }, - { - "code": 201, - "message": "Created" - }, - { - "code": 401, - "message": "Unauthorized" - }, - { - "code": 403, - "message": "Forbidden" - }, - { - "code": 404, - "message": "Not Found" - } - ], - "deprecated": "false", - "type": "void" - } - ], - "path": "/groovy/groovyModel" - } - ], - "basePath": "/", - "consumes": [ - - ], - "models": { - "GroovyModel": { - "description": "", - "id": "GroovyModel", - "properties": { - "stringProp": { - "required": false, - "type": "string" - } - } - } - }, - "produces": [ - - ], - "resourcePath": "/groovy", - "swaggerVersion": "1.2" -} \ No newline at end of file diff --git a/swagger-contract-tests/src/test/resources/contract/swagger/declaration-inherited-service-impl.json b/swagger-contract-tests/src/test/resources/contract/swagger/declaration-inherited-service-impl.json deleted file mode 100644 index 10174dce732..00000000000 --- a/swagger-contract-tests/src/test/resources/contract/swagger/declaration-inherited-service-impl.json +++ /dev/null @@ -1,131 +0,0 @@ -{ - "apiVersion": "1.0", - "apis": [ - { - "description": "demonstrateInheritanceWithAnnotations", - "operations": [ - { - "method": "GET", - "summary": "demonstrateInheritanceWithAnnotations", - "nickname": "demonstrateInheritanceWithAnnotationsUsingGET", - "produces": [ - "application/json" - ], - "consumes": [ - - ], - "parameters": [ - { - "allowMultiple": false, - "description": "param1", - "name": "param1", - "paramType": "path", - "type": "string", - "required": true - } - ], - "responseMessages": [ - { - "code": 200, - "message": "kkj", - "responseModel": "Pet" - }, - { - "code": 401, - "message": "Unauthorized" - }, - { - "code": 403, - "message": "Forbidden" - }, - { - "code": 404, - "message": "Not Found" - } - ], - "deprecated": "false", - "type": "Pet" - } - ], - "path": "/child/1575" - }, - { - "description": "getSomething", - "operations": [ - { - "method": "GET", - "summary": "getSomething", - "nickname": "getSomethingUsingGET", - "produces": [ - "*/*" - ], - "consumes": [ - - ], - "parameters": [ - { - "allowMultiple": false, - "description": "parameter", - "name": "parameter", - "paramType": "query", - "type": "string", - "required": false - } - ], - "responseMessages": [ - { - "code": 200, - "message": "OK", - "responseModel": "string" - }, - { - "code": 401, - "message": "Unauthorized" - }, - { - "code": 403, - "message": "Forbidden" - }, - { - "code": 404, - "message": "Not Found" - } - ], - "deprecated": "false", - "type": "string" - } - ], - "path": "/child/child-method" - } - ], - "basePath": "/", - "consumes": [ - - ], - "models": { - "Pet": { - "description": "", - "id": "Pet", - "properties": { - "age": { - "required": false, - "format": "int32", - "type": "integer" - }, - "id": { - "required": false, - "type": "string" - }, - "name": { - "required": false, - "type": "string" - } - } - } - }, - "produces": [ - - ], - "resourcePath": "/child", - "swaggerVersion": "1.2" -} \ No newline at end of file diff --git a/swagger-contract-tests/src/test/resources/contract/swagger/declaration-pet-grooming-service.json b/swagger-contract-tests/src/test/resources/contract/swagger/declaration-pet-grooming-service.json deleted file mode 100644 index f800b46b42d..00000000000 --- a/swagger-contract-tests/src/test/resources/contract/swagger/declaration-pet-grooming-service.json +++ /dev/null @@ -1,318 +0,0 @@ -{ - "apiVersion": "1.0", - "apis": [ - { - "description": "canGroom", - "operations": [ - { - "method": "GET", - "summary": "canGroom", - "nickname": "canGroomUsingGET", - "produces": [ - "*/*" - ], - "consumes": [ - - ], - "parameters": [ - { - "allowMultiple": false, - "description": "type", - "name": "type", - "paramType": "query", - "type": "string", - "required": true - } - ], - "responseMessages": [ - { - "code": 200, - "message": "OK", - "responseModel": "boolean" - }, - { - "code": 401, - "message": "Unauthorized" - }, - { - "code": 403, - "message": "Forbidden" - }, - { - "code": 404, - "message": "Not Found" - } - ], - "deprecated": "false", - "type": "boolean", - "authorizations": { - "petstore_auth": [ - { - "description": "read your pets", - "scope": "read:pets" - } - ] - } - } - ], - "path": "/petgrooming" - }, - { - "description": "groomingFunctionThatReturnsVoid", - "operations": [ - { - "method": "DELETE", - "summary": "groomingFunctionThatReturnsVoid", - "nickname": "groomingFunctionThatReturnsVoidUsingDELETE", - "produces": [ - "application/json", - "application/xml" - ], - "consumes": [ - - ], - "parameters": [ - { - "allowMultiple": false, - "description": "input", - "name": "input", - "paramType": "path", - "type": "string", - "required": true - } - ], - "responseMessages": [ - { - "code": 200, - "message": "Just testing" - }, - { - "code": 204, - "message": "No Content" - }, - { - "code": 401, - "message": "Unauthorized" - }, - { - "code": 403, - "message": "Forbidden" - } - ], - "deprecated": "false", - "type": "void", - "authorizations": { - "petstore_auth": [ - { - "description": "read your pets", - "scope": "read:pets" - } - ] - } - } - ], - "path": "/petgrooming/voidMethod/{input}" - }, - { - "description": "canGroom", - "operations": [ - { - "method": "GET", - "summary": "canGroom", - "nickname": "canGroomUsingGET_1", - "produces": [ - "*/*" - ], - "consumes": [ - - ], - "parameters": [ - { - "allowMultiple": false, - "description": "type", - "name": "type", - "paramType": "query", - "type": "string", - "required": true - } - ], - "responseMessages": [ - { - "code": 200, - "message": "OK", - "responseModel": "boolean" - }, - { - "code": 401, - "message": "Unauthorized" - }, - { - "code": 403, - "message": "Forbidden" - }, - { - "code": 404, - "message": "Not Found" - } - ], - "deprecated": "false", - "type": "boolean" - } - ], - "path": "/pets" - }, - { - "description": "canGroom", - "operations": [ - { - "method": "GET", - "summary": "canGroom", - "nickname": "canGroomUsingGET_2", - "produces": [ - "*/*" - ], - "consumes": [ - - ], - "parameters": [ - { - "allowMultiple": false, - "description": "type", - "name": "type", - "paramType": "query", - "type": "string", - "required": true - } - ], - "responseMessages": [ - { - "code": 200, - "message": "OK", - "responseModel": "boolean" - }, - { - "code": 401, - "message": "Unauthorized" - }, - { - "code": 403, - "message": "Forbidden" - }, - { - "code": 404, - "message": "Not Found" - } - ], - "deprecated": "false", - "type": "boolean" - } - ], - "path": "/pets/grooming" - }, - { - "description": "groomingFunctionThatReturnsVoid", - "operations": [ - { - "method": "DELETE", - "summary": "groomingFunctionThatReturnsVoid", - "nickname": "groomingFunctionThatReturnsVoidUsingDELETE_1", - "produces": [ - "application/json", - "application/xml" - ], - "consumes": [ - - ], - "parameters": [ - { - "allowMultiple": false, - "description": "input", - "name": "input", - "paramType": "path", - "type": "string", - "required": true - } - ], - "responseMessages": [ - { - "code": 200, - "message": "Just testing" - }, - { - "code": 204, - "message": "No Content" - }, - { - "code": 401, - "message": "Unauthorized" - }, - { - "code": 403, - "message": "Forbidden" - } - ], - "deprecated": "false", - "type": "void" - } - ], - "path": "/pets/grooming/voidMethod/{input}" - }, - { - "description": "groomingFunctionThatReturnsVoid", - "operations": [ - { - "method": "DELETE", - "summary": "groomingFunctionThatReturnsVoid", - "nickname": "groomingFunctionThatReturnsVoidUsingDELETE_2", - "produces": [ - "application/json", - "application/xml" - ], - "consumes": [ - - ], - "parameters": [ - { - "allowMultiple": false, - "description": "input", - "name": "input", - "paramType": "path", - "type": "string", - "required": true - } - ], - "responseMessages": [ - { - "code": 200, - "message": "Just testing" - }, - { - "code": 204, - "message": "No Content" - }, - { - "code": 401, - "message": "Unauthorized" - }, - { - "code": 403, - "message": "Forbidden" - } - ], - "deprecated": "false", - "type": "void" - } - ], - "path": "/pets/voidMethod/{input}" - } - ], - "basePath": "/", - "consumes": [ - - ], - "produces": [ - - ], - "resourcePath": "/petgrooming", - "swaggerVersion": "1.2" -} \ No newline at end of file diff --git a/swagger-contract-tests/src/test/resources/contract/swagger/declaration-pet-service.json b/swagger-contract-tests/src/test/resources/contract/swagger/declaration-pet-service.json deleted file mode 100644 index 422c23f2acc..00000000000 --- a/swagger-contract-tests/src/test/resources/contract/swagger/declaration-pet-service.json +++ /dev/null @@ -1,1146 +0,0 @@ -{ - "apiVersion": "1.0", - "apis": [ - { - "description": "addPet", - "operations": [ - { - "method": "POST", - "summary": "Add a new pet to the store", - "notes": "Add a new pet to the store", - "nickname": "addPetUsingPOST", - "produces": [ - "*/*" - ], - "consumes": [ - "application/json" - ], - "parameters": [ - { - "allowMultiple": false, - "name": "age", - "paramType": "query", - "format": "int32", - "type": "integer", - "required": false - }, - { - "allowMultiple": false, - "name": "id", - "paramType": "query", - "type": "string", - "required": false - }, - { - "allowMultiple": false, - "name": "name", - "paramType": "query", - "type": "string", - "required": false - } - ], - "responseMessages": [ - { - "code": 200, - "message": "OK" - }, - { - "code": 201, - "message": "Created" - }, - { - "code": 401, - "message": "Unauthorized" - }, - { - "code": 403, - "message": "Forbidden" - }, - { - "code": 404, - "message": "Not Found" - }, - { - "code": 405, - "message": "Invalid input" - } - ], - "deprecated": "false", - "type": "void" - } - ], - "path": "/pets" - }, - { - "description": "listPets", - "operations": [ - { - "method": "GET", - "summary": "List all pets", - "nickname": "listPetsUsingGET", - "produces": [ - "*/*" - ], - "consumes": [ - - ], - "parameters": [ - - ], - "responseMessages": [ - { - "code": 200, - "message": "OK", - "responseModel": "array" - }, - { - "code": 401, - "message": "Unauthorized" - }, - { - "code": 403, - "message": "Forbidden" - }, - { - "code": 404, - "message": "Not Found" - } - ], - "deprecated": "false", - "items": { - "type": "Pet" - }, - "type": "array" - } - ], - "path": "/pets" - }, - { - "description": "updatePet", - "operations": [ - { - "method": "PUT", - "summary": "Update an existing pet", - "nickname": "updatePetUsingPUT_1", - "produces": [ - "*/*" - ], - "consumes": [ - "application/json" - ], - "parameters": [ - { - "allowMultiple": false, - "description": "Pet object that needs to be added to the store", - "name": "body", - "paramType": "body", - "type": "Pet", - "required": true - } - ], - "responseMessages": [ - { - "code": 200, - "message": "OK" - }, - { - "code": 201, - "message": "Created" - }, - { - "code": 400, - "message": "Invalid ID supplied" - }, - { - "code": 401, - "message": "Unauthorized" - }, - { - "code": 403, - "message": "Forbidden" - }, - { - "code": 404, - "message": "Pet not found" - }, - { - "code": 405, - "message": "Validation exception" - } - ], - "deprecated": "false", - "type": "void" - } - ], - "path": "/pets" - }, - { - "description": "petEntities", - "operations": [ - { - "method": "POST", - "summary": "petEntities", - "nickname": "petEntitiesUsingPOST", - "produces": [ - "*/*" - ], - "consumes": [ - "application/json" - ], - "parameters": [ - { - "allowMultiple": false, - "description": "name", - "name": "name", - "paramType": "path", - "type": "string", - "required": true - } - ], - "responseMessages": [ - { - "code": 200, - "message": "OK", - "responseModel": "array" - }, - { - "code": 201, - "message": "Created" - }, - { - "code": 401, - "message": "Unauthorized" - }, - { - "code": 403, - "message": "Forbidden" - }, - { - "code": 404, - "message": "Not Found" - } - ], - "deprecated": "false", - "items": { - "type": "Pet" - }, - "type": "array" - } - ], - "path": "/pets/byName/{name}" - }, - { - "description": "echo", - "operations": [ - { - "method": "POST", - "summary": "echo", - "nickname": "echoUsingPOST", - "produces": [ - "*/*" - ], - "consumes": [ - "application/json" - ], - "parameters": [ - { - "allowMultiple": false, - "description": "someInput", - "name": "body", - "paramType": "body", - "type": "List[Entry«string,Pet»]", - "required": true - } - ], - "responseMessages": [ - { - "code": 200, - "message": "OK", - "responseModel": "array" - }, - { - "code": 201, - "message": "Created" - }, - { - "code": 401, - "message": "Unauthorized" - }, - { - "code": 403, - "message": "Forbidden" - }, - { - "code": 404, - "message": "Not Found" - } - ], - "deprecated": "false", - "type": "List[Entry«string,Pet»]" - } - ], - "path": "/pets/echo" - }, - { - "description": "findPetsByAge", - "operations": [ - { - "method": "GET", - "summary": "Find Pet by age", - "notes": "Exclusive range with infinity", - "nickname": "findPetsByAgeUsingGET", - "produces": [ - "*/*" - ], - "consumes": [ - - ], - "parameters": [ - { - "allowMultiple": false, - "minimum": "0", - "description": "Age values that need to be considered for filter", - "name": "age", - "paramType": "query", - "format": "int32", - "type": "integer", - "required": false - } - ], - "responseMessages": [ - { - "code": 200, - "message": "OK", - "responseModel": "Pet" - }, - { - "code": 401, - "message": "Unauthorized" - }, - { - "code": 403, - "message": "Forbidden" - }, - { - "code": 404, - "message": "Not Found" - } - ], - "deprecated": "false", - "type": "Pet" - } - ], - "path": "/pets/findByAge" - }, - { - "description": "findPetsByLegs", - "operations": [ - { - "method": "GET", - "summary": "Find Pet by legs", - "notes": "Exclusive range should work", - "nickname": "findPetsByLegsUsingGET", - "produces": [ - "*/*" - ], - "consumes": [ - - ], - "parameters": [ - { - "allowMultiple": false, - "maximum": "10", - "minimum": "0", - "description": "Legs values that need to be considered for filter", - "name": "legs", - "paramType": "query", - "format": "int32", - "type": "integer", - "required": false - } - ], - "responseMessages": [ - { - "code": 200, - "message": "OK", - "responseModel": "Pet" - }, - { - "code": 401, - "message": "Unauthorized" - }, - { - "code": 403, - "message": "Forbidden" - }, - { - "code": 404, - "message": "Not Found" - } - ], - "deprecated": "false", - "type": "Pet" - } - ], - "path": "/pets/findByLegs" - }, - { - "description": "findPetsByStamina", - "operations": [ - { - "method": "GET", - "summary": "Find Pet by stamina", - "notes": "Exclusive range with -infinity", - "nickname": "findPetsByStaminaUsingGET", - "produces": [ - "*/*" - ], - "consumes": [ - - ], - "parameters": [ - { - "allowMultiple": false, - "maximum": "12", - "description": "Stamina values", - "name": "stamina", - "paramType": "query", - "format": "int64", - "type": "integer", - "required": false - } - ], - "responseMessages": [ - { - "code": 200, - "message": "OK", - "responseModel": "Pet" - }, - { - "code": 401, - "message": "Unauthorized" - }, - { - "code": 403, - "message": "Forbidden" - }, - { - "code": 404, - "message": "Not Found" - } - ], - "deprecated": "false", - "type": "Pet" - } - ], - "path": "/pets/findByStamina" - }, - { - "description": "findPetsByStatus", - "operations": [ - { - "method": "GET", - "summary": "Find Pet by status", - "notes": "Multiple status values can be provided with comma-separated strings", - "nickname": "findPetsByStatusUsingGET", - "produces": [ - "*/*" - ], - "consumes": [ - - ], - "parameters": [ - { - "allowMultiple": true, - "enum": [ - "available", - "pending", - "sold" - ], - "defaultValue": "available", - "description": "Status values that need to be considered for filter", - "name": "status", - "paramType": "query", - "type": "string", - "required": true - } - ], - "responseMessages": [ - { - "code": 200, - "message": "OK", - "responseModel": "Pet" - }, - { - "code": 400, - "message": "Invalid status value" - }, - { - "code": 401, - "message": "Unauthorized" - }, - { - "code": 403, - "message": "Forbidden" - }, - { - "code": 404, - "message": "Not Found" - } - ], - "deprecated": "false", - "type": "Pet" - } - ], - "path": "/pets/findByStatus" - }, - { - "description": "findPetsByTags", - "operations": [ - { - "method": "GET", - "summary": "Find Pet by tags", - "notes": "Multiple tags can be provided with comma-separated strings. Use tag1, tag2, tag3 for testing.", - "nickname": "findPetsByTagsUsingGET", - "produces": [ - "*/*" - ], - "consumes": [ - - ], - "parameters": [ - { - "allowMultiple": true, - "description": "Tags to filter by", - "name": "tags", - "paramType": "query", - "type": "string", - "required": true - } - ], - "responseMessages": [ - { - "code": 200, - "message": "OK", - "responseModel": "Pet" - }, - { - "code": 400, - "message": "Invalid tag value" - }, - { - "code": 401, - "message": "Unauthorized" - }, - { - "code": 403, - "message": "Forbidden" - }, - { - "code": 404, - "message": "Not Found" - } - ], - "deprecated": "true", - "type": "Pet" - } - ], - "path": "/pets/findByTags" - }, - { - "description": "nameToNickNamesMap", - "operations": [ - { - "method": "POST", - "summary": "nameToNickNamesMap", - "nickname": "nameToNickNamesMapUsingPOST", - "produces": [ - "*/*" - ], - "consumes": [ - "application/json" - ], - "parameters": [ - - ], - "responseMessages": [ - { - "code": 200, - "message": "OK", - "responseModel": "array" - }, - { - "code": 201, - "message": "Created" - }, - { - "code": 401, - "message": "Unauthorized" - }, - { - "code": 403, - "message": "Forbidden" - }, - { - "code": 404, - "message": "Not Found" - } - ], - "deprecated": "false", - "type": "List[Entry«string,List«string»»]" - } - ], - "path": "/pets/nameToNickNamesMap" - }, - { - "description": "siblings", - "operations": [ - { - "method": "POST", - "summary": "siblings", - "nickname": "siblingsUsingPOST", - "produces": [ - "*/*" - ], - "consumes": [ - "application/json" - ], - "parameters": [ - { - "allowMultiple": false, - "name": "age", - "paramType": "query", - "format": "int32", - "type": "integer", - "required": false - }, - { - "allowMultiple": false, - "name": "id", - "paramType": "query", - "type": "string", - "required": false - }, - { - "allowMultiple": false, - "name": "name", - "paramType": "query", - "type": "string", - "required": false - } - ], - "responseMessages": [ - { - "code": 200, - "message": "OK", - "responseModel": "array" - }, - { - "code": 201, - "message": "Created" - }, - { - "code": 401, - "message": "Unauthorized" - }, - { - "code": 403, - "message": "Forbidden" - }, - { - "code": 404, - "message": "Not Found" - } - ], - "deprecated": "false", - "items": { - "type": "Pet" - }, - "type": "array" - } - ], - "path": "/pets/siblings" - }, - { - "description": "transformPetNameToPetMapToAny", - "operations": [ - { - "method": "POST", - "summary": "transformPetNameToPetMapToAny", - "nickname": "transformPetNameToPetMapToAnyUsingPOST", - "produces": [ - "*/*" - ], - "consumes": [ - "application/json" - ], - "parameters": [ - { - "allowMultiple": false, - "description": "someInput", - "name": "body", - "paramType": "body", - "type": "List[Entry«string,Pet»]", - "required": true - } - ], - "responseMessages": [ - { - "code": 200, - "message": "OK", - "responseModel": "object" - }, - { - "code": 201, - "message": "Created" - }, - { - "code": 401, - "message": "Unauthorized" - }, - { - "code": 403, - "message": "Forbidden" - }, - { - "code": 404, - "message": "Not Found" - } - ], - "deprecated": "false", - "type": "object" - } - ], - "path": "/pets/transformPetNameToPetMapToAny" - }, - { - "description": "transformPetNameToPetMapToGenericOpenMap", - "operations": [ - { - "method": "POST", - "summary": "transformPetNameToPetMapToGenericOpenMap", - "nickname": "transformPetNameToPetMapToGenericOpenMapUsingPOST", - "produces": [ - "*/*" - ], - "consumes": [ - "application/json" - ], - "parameters": [ - { - "allowMultiple": false, - "description": "someInput", - "name": "body", - "paramType": "body", - "type": "List[Entry«string,Pet»]", - "required": true - } - ], - "responseMessages": [ - { - "code": 200, - "message": "OK", - "responseModel": "object" - }, - { - "code": 201, - "message": "Created" - }, - { - "code": 401, - "message": "Unauthorized" - }, - { - "code": 403, - "message": "Forbidden" - }, - { - "code": 404, - "message": "Not Found" - } - ], - "deprecated": "false", - "type": "object" - } - ], - "path": "/pets/transformPetNameToPetMapToGenericOpenMap" - }, - { - "description": "transformPetNameToPetMapToOpenMap", - "operations": [ - { - "method": "POST", - "summary": "transformPetNameToPetMapToOpenMap", - "nickname": "transformPetNameToPetMapToOpenMapUsingPOST", - "produces": [ - "*/*" - ], - "consumes": [ - "application/json" - ], - "parameters": [ - { - "allowMultiple": false, - "description": "someInput", - "name": "body", - "paramType": "body", - "type": "List[Entry«string,Pet»]", - "required": true - } - ], - "responseMessages": [ - { - "code": 200, - "message": "OK", - "responseModel": "object" - }, - { - "code": 201, - "message": "Created" - }, - { - "code": 401, - "message": "Unauthorized" - }, - { - "code": 403, - "message": "Forbidden" - }, - { - "code": 404, - "message": "Not Found" - } - ], - "deprecated": "false", - "type": "object" - } - ], - "path": "/pets/transformPetNameToPetMapToOpenMap" - }, - { - "description": "method", - "operations": [ - { - "method": "GET", - "summary": "method", - "nickname": "methodUsingGET", - "produces": [ - "*/*" - ], - "consumes": [ - - ], - "parameters": [ - { - "allowMultiple": false, - "description": "a", - "name": "a", - "paramType": "path", - "type": "string", - "required": true - }, - { - "allowMultiple": false, - "description": "b", - "name": "b", - "paramType": "path", - "type": "string", - "required": true - } - ], - "responseMessages": [ - { - "code": 200, - "message": "OK" - }, - { - "code": 401, - "message": "Unauthorized" - }, - { - "code": 403, - "message": "Forbidden" - }, - { - "code": 404, - "message": "Not Found" - } - ], - "deprecated": "false", - "type": "void" - } - ], - "path": "/pets/{a}/{b}" - }, - { - "description": "petByName", - "operations": [ - { - "method": "POST", - "summary": "petByName", - "nickname": "petByNameUsingPOST", - "produces": [ - "*/*" - ], - "consumes": [ - "application/json" - ], - "parameters": [ - { - "allowMultiple": false, - "description": "name", - "name": "name", - "paramType": "path", - "type": "string", - "required": true - } - ], - "responseMessages": [ - { - "code": 200, - "message": "OK", - "responseModel": "Pet" - }, - { - "code": 201, - "message": "Created" - }, - { - "code": 401, - "message": "Unauthorized" - }, - { - "code": 403, - "message": "Forbidden" - }, - { - "code": 404, - "message": "Not Found" - } - ], - "deprecated": "false", - "type": "Pet" - } - ], - "path": "/pets/{name}" - }, - { - "description": "getPetById", - "operations": [ - { - "method": "GET", - "summary": "Find pet by ID", - "notes": "Returns a pet when ID < 10. ID > 10 or non-integers will simulate API error conditions", - "nickname": "getPetByIdUsingGET_1", - "produces": [ - "*/*" - ], - "consumes": [ - - ], - "parameters": [ - { - "allowMultiple": false, - "maximum": "5", - "minimum": "1", - "description": "ID of pet that needs to be fetched", - "name": "petId", - "paramType": "path", - "type": "string", - "required": true - } - ], - "responseMessages": [ - { - "code": 200, - "message": "OK", - "responseModel": "Pet" - }, - { - "code": 401, - "message": "Unauthorized" - }, - { - "code": 403, - "message": "Forbidden" - }, - { - "code": 404, - "message": "Not Found" - } - ], - "deprecated": "false", - "type": "Pet" - } - ], - "path": "/pets/{petId}" - }, - { - "description": "updatePic", - "operations": [ - { - "method": "POST", - "summary": "updatePic", - "nickname": "updatePicUsingPOST", - "produces": [ - "*/*" - ], - "consumes": [ - "multipart/form-data" - ], - "parameters": [ - { - "allowMultiple": false, - "description": "petId", - "name": "petId", - "paramType": "path", - "type": "string", - "required": true - }, - { - "allowMultiple": false, - "description": "pic", - "name": "pic", - "paramType": "form", - "type": "File", - "required": false - } - ], - "responseMessages": [ - { - "code": 200, - "message": "OK" - }, - { - "code": 201, - "message": "Created" - }, - { - "code": 401, - "message": "Unauthorized" - }, - { - "code": 403, - "message": "Forbidden" - }, - { - "code": 404, - "message": "Not Found" - } - ], - "deprecated": "false", - "type": "void" - } - ], - "path": "/pets/{petId}/pic" - }, - { - "description": "updatePic", - "operations": [ - { - "method": "GET", - "summary": "updatePic", - "nickname": "updatePicUsingGET", - "produces": [ - "*/*" - ], - "consumes": [ - - ], - "parameters": [ - { - "allowMultiple": false, - "description": "petId", - "name": "petId", - "paramType": "path", - "type": "string", - "required": true - }, - { - "allowMultiple": false, - "description": "picId", - "name": "picId", - "paramType": "path", - "type": "string", - "required": true - } - ], - "responseMessages": [ - { - "code": 200, - "message": "OK" - }, - { - "code": 401, - "message": "Unauthorized" - }, - { - "code": 403, - "message": "Forbidden" - }, - { - "code": 404, - "message": "Not Found" - } - ], - "deprecated": "false", - "type": "void" - } - ], - "path": "/pets/{petId}/pic/{picId}" - } - ], - "basePath": "/", - "consumes": [ - - ], - "models": { - "Entry«string,List«string»»": { - "description": "", - "id": "Entry«string,List«string»»", - "properties": { - "key": { - "required": false, - "items": { - "type": "string" - }, - "type": "array" - } - } - }, - "Entry«string,Pet»": { - "description": "", - "id": "Entry«string,Pet»", - "properties": { - "key": { - "required": false, - "type": "Pet" - } - } - }, - "Pet": { - "description": "", - "id": "Pet", - "properties": { - "age": { - "required": false, - "format": "int32", - "type": "integer" - }, - "id": { - "required": false, - "type": "string" - }, - "name": { - "required": false, - "type": "string" - } - } - } - }, - "produces": [ - - ], - "resourcePath": "/pets", - "swaggerVersion": "1.2" -} \ No newline at end of file diff --git a/swagger-contract-tests/src/test/resources/contract/swagger/declaration-root-controller.json b/swagger-contract-tests/src/test/resources/contract/swagger/declaration-root-controller.json deleted file mode 100644 index 6b4a0e9f107..00000000000 --- a/swagger-contract-tests/src/test/resources/contract/swagger/declaration-root-controller.json +++ /dev/null @@ -1,58 +0,0 @@ -{ - "apiVersion": "1.0", - "apis": [ - { - "description": "getAll", - "operations": [ - { - "method": "GET", - "summary": "getAll", - "nickname": "getAllUsingGET", - "produces": [ - "*/*" - ], - "consumes": [ - - ], - "parameters": [ - - ], - "responseMessages": [ - { - "code": 200, - "message": "OK", - "responseModel": "array" - }, - { - "code": 401, - "message": "Unauthorized" - }, - { - "code": 403, - "message": "Forbidden" - }, - { - "code": 404, - "message": "Not Found" - } - ], - "deprecated": "false", - "items": { - "type": "string" - }, - "type": "array" - } - ], - "path": "/" - } - ], - "basePath": "/", - "consumes": [ - - ], - "produces": [ - - ], - "resourcePath": "/", - "swaggerVersion": "1.2" -} \ No newline at end of file diff --git a/swagger-contract-tests/src/test/resources/contract/swagger/resource-listing.json b/swagger-contract-tests/src/test/resources/contract/swagger/resource-listing.json deleted file mode 100644 index 0f78c09a5eb..00000000000 --- a/swagger-contract-tests/src/test/resources/contract/swagger/resource-listing.json +++ /dev/null @@ -1,154 +0,0 @@ -{ - "apiVersion": "1.0", - "apis": [ - { - "description": "Address\nSimple Jpa Repository", - "path": "/default/Address Entity", - "position": 0 - }, - { - "description": "Person\nSimple Jpa Repository", - "path": "/default/Person Entity", - "position": 0 - }, - { - "description": "Simple Jpa Repository\nTag", - "path": "/default/Tag Entity", - "position": 0 - }, - { - "description": "Basic Error Controller", - "path": "/default/basic-error-controller", - "position": 0 - }, - { - "description": "Bugs Controller", - "path": "/default/bugs-controller", - "position": 0 - }, - { - "description": "Services to demonstrate path variable resolution", - "path": "/default/business-service", - "position": 0 - }, - { - "description": "Concrete Controller", - "path": "/default/concrete-controller", - "position": 0 - }, - { - "description": "Services to demonstrate produces/consumes override behaviour on document and operation level", - "path": "/default/consumes-produces-service", - "position": 0 - }, - { - "description": "Controller With No Request Mapping Service", - "path": "/default/controller-with-no-request-mapping-service", - "position": 0 - }, - { - "description": "Service that return enums", - "path": "/default/enum-service", - "position": 0 - }, - { - "description": "Operations about fancy pets", - "path": "/default/fancy-pet-service", - "position": 0 - }, - { - "description": "Demonstration of features", - "path": "/default/feature-demonstration-service", - "position": 0 - }, - { - "description": "Generic Pet Controller", - "path": "/default/generic-pet-controller", - "position": 0 - }, - { - "description": "Groovy Service", - "path": "/default/groovy-service", - "position": 0 - }, - { - "description": "Interface API", - "path": "/default/inherited-service-impl", - "position": 0 - }, - { - "description": "Person Controller", - "path": "/default/person-controller", - "position": 0 - }, - { - "description": "Grooming operations for pets", - "path": "/default/pet-grooming-service", - "position": 0 - }, - { - "description": "Operations about pets", - "path": "/default/pet-service", - "position": 0 - }, - { - "description": "Profile Controller", - "path": "/default/profile-controller", - "position": 0 - }, - { - "description": "Root Controller", - "path": "/default/root-controller", - "position": 0 - }, - { - "description": "Same Controller", - "path": "/default/same-controller", - "position": 0 - }, - { - "description": "Cyclic Structures Controller", - "path": "/default/cyclic-structures-controller", - "position": 0 - } - ], - "authorizations": { - "oauth2": { - "grantTypes": { - "implicit": { - "loginEndpoint": { - "url": "http://petstore.swagger.io/api/oauth/dialog" - }, - "type": "implicit" - } - }, - "name": "petstore_auth", - "scopes": [ - { - "description": "modify pets in your account", - "scope": "write:pets" - }, - { - "description": "read your pets", - "scope": "read:pets" - } - ], - "type": "oauth2" - }, - "apiKey": { - "keyname": "api_key", - "name": "api_key", - "passAs": "header", - "type": "apiKey" - } - }, - "info": { - "contact": "", - "description": "Api Documentation", - "license": "Apache 2.0", - "licenseUrl": "http://www.apache.org/licenses/LICENSE-2.0", - "termsOfServiceUrl": "urn:tos", - "title": "Api Documentation" - }, - "swaggerVersion": "1.2" -} \ No newline at end of file diff --git a/swagger-contract-tests/src/test/resources/contract/swagger2/declaration-bugs-different-service.json b/swagger-contract-tests/src/test/resources/contract/swagger2/declaration-bugs-different-service.json deleted file mode 100644 index e2ec8b7ef8f..00000000000 --- a/swagger-contract-tests/src/test/resources/contract/swagger2/declaration-bugs-different-service.json +++ /dev/null @@ -1,2711 +0,0 @@ -{ - "swagger": "2.0", - "info": { - "description": "Api Documentation", - "version": "1.0", - "title": "Api Documentation", - "termsOfService": "urn:tos", - "contact": { - - }, - "license": { - "name": "Apache 2.0", - "url": "http://www.apache.org/licenses/LICENSE-2.0" - } - }, - "host": "localhost:__PORT__", - "basePath": "/", - "tags": [ - { - "name": "Bugs", - "description": "Bugs Controller" - }, - { - "name": "foo", - "description": "Foo Description" - } - ], - "produces": [ - "application/json", - "application/xml" - ], - "paths": { - "/bugs/1162": { - "post": { - "tags": [ - "Bugs" - ], - "summary": "bug1162", - "operationId": "bug1162UsingPOST_1", - "consumes": [ - "application/json" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "string", - "format": "date" - } - } - } - } - }, - "/bugs/1209": { - "post": { - "tags": [ - "Bugs" - ], - "summary": "bug1209", - "operationId": "bug1209UsingPOST_1", - "consumes": [ - "application/json" - ], - "parameters": [ - { - "name": "custom-header", - "in": "header", - "required": false, - "type": "array", - "items": { - "type": "string" - }, - "collectionFormat": "csv" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "string" - } - } - } - } - }, - "/bugs/1306{?paramMap}": { - "post": { - "tags": [ - "Bugs" - ], - "summary": "bug1306", - "operationId": "bug1306UsingPOST_1", - "consumes": [ - "application/json" - ], - "parameters": [ - { - "name": "paramMap", - "in": "query", - "description": "paramMap", - "required": true, - "items": { - "type": "object", - "additionalProperties": { - "type": "string" - } - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "object", - "additionalProperties": { - "type": "string" - } - } - } - } - } - }, - "/bugs/1376-bare": { - "post": { - "tags": [ - "Bugs" - ], - "summary": "issue1376Bare", - "operationId": "issue1376BareUsingPOST_1", - "consumes": [ - "application/json" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "string" - } - } - } - } - }, - "/bugs/1376-input-bare{?url}": { - "post": { - "tags": [ - "Bugs" - ], - "summary": "issue1376Input", - "operationId": "issue1376InputUsingPOST_2", - "consumes": [ - "application/json" - ], - "parameters": [ - { - "name": "url", - "in": "query", - "description": "url", - "required": false, - "type": "string" - } - ], - "responses": { - "200": { - "description": "OK" - } - } - } - }, - "/bugs/1376-input-property{?url}": { - "post": { - "tags": [ - "Bugs" - ], - "summary": "issue1376Input", - "operationId": "issue1376InputUsingPOST_3", - "consumes": [ - "application/json" - ], - "parameters": [ - { - "name": "url", - "in": "query", - "required": false, - "type": "string" - } - ], - "responses": { - "200": { - "description": "OK" - } - } - } - }, - "/bugs/1376-property": { - "post": { - "tags": [ - "Bugs" - ], - "summary": "issue1376Property", - "operationId": "issue1376PropertyUsingPOST_1", - "consumes": [ - "application/json" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/Bug1376" - } - } - } - } - }, - "/bugs/1420": { - "get": { - "tags": [ - "Bugs", - "foo" - ], - "summary": "issue1420", - "operationId": "issue1420UsingGET_1", - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "string" - } - } - } - } - }, - "/bugs/1440": { - "get": { - "tags": [ - "Bugs" - ], - "summary": "issue1440", - "operationId": "issue1440UsingGET_1", - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/EntityModel«string»" - } - } - } - } - }, - "/bugs/1475": { - "get": { - "tags": [ - "Bugs" - ], - "summary": "mapOfLists", - "operationId": "mapOfListsUsingGET_1", - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "object", - "additionalProperties": { - "type": "array", - "items": { - "type": "string" - } - } - } - } - } - } - }, - "/bugs/1475-example": { - "get": { - "tags": [ - "Bugs" - ], - "summary": "mapOfListOfExample", - "operationId": "mapOfListOfExampleUsingGET_1", - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "object", - "additionalProperties": { - "type": "array", - "items": { - "$ref": "#/definitions/Example" - } - } - } - } - } - } - }, - "/bugs/1605": { - "get": { - "tags": [ - "Bugs" - ], - "summary": "byteArrayResponse", - "operationId": "byteArrayResponseUsingGET_1", - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "string", - "format": "byte" - } - } - } - } - }, - "/bugs/1627": { - "get": { - "tags": [ - "Bugs" - ], - "summary": "bug1627", - "operationId": "bug1627UsingGET_1", - "responses": { - "200": { - "description": "OK" - } - } - } - }, - "/bugs/1632": { - "get": { - "tags": [ - "Bugs" - ], - "summary": "fileCustomType", - "operationId": "fileCustomTypeUsingGET_1", - "parameters": [ - { - "in": "body", - "name": "value", - "description": "value", - "required": true, - "schema": { - "$ref": "#/definitions/File" - } - } - ], - "responses": { - "200": { - "description": "OK" - } - } - } - }, - "/bugs/1632s": { - "get": { - "tags": [ - "Bugs" - ], - "summary": "filesCustomType", - "operationId": "filesCustomTypeUsingGET_1", - "parameters": [ - { - "in": "body", - "name": "values", - "description": "values", - "required": true, - "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/File" - } - } - } - ], - "responses": { - "200": { - "description": "OK" - } - } - } - }, - "/bugs/1676": { - "get": { - "tags": [ - "Bugs" - ], - "summary": "apiModelProperty", - "operationId": "apiModelPropertyUsingGET_1", - "parameters": [ - { - "in": "body", - "name": "value", - "description": "value", - "required": true, - "schema": { - "$ref": "#/definitions/Bug1676" - } - } - ], - "responses": { - "200": { - "description": "OK" - } - } - } - }, - "/bugs/1697": { - "get": { - "tags": [ - "Bugs" - ], - "summary": "payloadWithByteBuffer", - "operationId": "payloadWithByteBufferUsingGET_1", - "parameters": [ - { - "in": "body", - "name": "body", - "description": "body", - "required": true, - "schema": { - "$ref": "#/definitions/Bug1697" - } - } - ], - "responses": { - "200": { - "description": "OK" - } - } - } - }, - "/bugs/1722": { - "post": { - "tags": [ - "Bugs" - ], - "summary": "Remove an apple from a user", - "description": "Remove an apple from a user. You must specify the user name and the apple name.", - "operationId": "bug1722UsingPOST_1", - "consumes": [ - "application/xml", - "application/json" - ], - "produces": [ - "application/json", - "application/xml" - ], - "parameters": [ - { - "in": "body", - "name": "test", - "description": "test", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "The apple is removed" - } - } - } - }, - "/bugs/1734{?offset}": { - "get": { - "tags": [ - "Bugs" - ], - "summary": "bug1734", - "operationId": "bug1734UsingGET_1", - "parameters": [ - { - "name": "offset", - "in": "query", - "description": "The value of offset", - "required": false, - "type": "integer", - "default": 0, - "format": "int32" - } - ], - "responses": { - "200": { - "description": "OK" - } - } - } - }, - "/bugs/1740": { - "get": { - "tags": [ - "Bugs" - ], - "summary": "bug1740", - "operationId": "bug1740UsingGET_1", - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/Bug1740" - } - } - } - } - }, - "/bugs/1749{?ascending,companyName,email,like,pageNumber,pageSize,set,sortDirection,sortField}": { - "get": { - "tags": [ - "Bugs" - ], - "summary": "Retrieve all the companies", - "operationId": "getAllPagedUsingGET_1", - "parameters": [ - { - "name": "ascending", - "in": "query", - "required": false, - "type": "boolean" - }, - { - "name": "companyName", - "in": "query", - "description": "companyName", - "required": false, - "type": "string" - }, - { - "name": "email", - "in": "query", - "description": "email", - "required": false, - "type": "string" - }, - { - "name": "like", - "in": "query", - "description": "like", - "required": false, - "type": "boolean" - }, - { - "name": "pageNumber", - "in": "query", - "required": true, - "type": "integer", - "minimum": 1, - "exclusiveMinimum": false, - "format": "int32" - }, - { - "name": "pageSize", - "in": "query", - "required": true, - "type": "integer", - "maximum": 50, - "exclusiveMaximum": false, - "format": "int32" - }, - { - "name": "set", - "in": "query", - "required": false, - "type": "boolean" - }, - { - "name": "sortDirection", - "in": "query", - "required": false, - "type": "string", - "enum": [ - "ASC", - "DESC" - ] - }, - { - "name": "sortField", - "in": "query", - "required": false, - "type": "string" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "array", - "items": { - "type": "string" - } - } - } - } - } - }, - "/bugs/1750a": { - "get": { - "tags": [ - "Bugs" - ], - "summary": "bug1750a", - "operationId": "bug1750aUsingGET_1", - "responses": { - "200": { - "description": "list of ids", - "schema": { - "type": "string" - } - }, - "204": { - "description": "no ids found" - } - } - } - }, - "/bugs/1750b": { - "get": { - "tags": [ - "Bugs" - ], - "summary": "1750b", - "operationId": "bug1750bUsingGET_1", - "responses": { - "200": { - "description": "list of ids", - "schema": { - "type": "string" - } - }, - "204": { - "description": "no ids found" - } - } - } - }, - "/bugs/1767": { - "get": { - "description": "This is a test method", - "operationId": "bug1767GET_1", - "parameters": [ - { - "name": "description", - "in": "query", - "description": "search by description", - "required": true, - "type": "string" - } - ], - "responses": { - "200": { - "description": "Successfully received bug 1767 or 2219 response", - "schema": { - "type": "string" - } - } - } - } - }, - "/bugs/1777": { - "get": { - "tags": [ - "Bugs" - ], - "summary": "bug1777", - "operationId": "bug1777UsingGET_1", - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/Bug1777" - } - } - } - } - }, - "/bugs/1778{?e,s}": { - "get": { - "tags": [ - "Bugs" - ], - "summary": "bug1778", - "operationId": "bug1778UsingGET_1", - "parameters": [ - { - "name": "e", - "in": "query", - "required": false, - "type": "string" - }, - { - "name": "s", - "in": "query", - "required": false, - "type": "string" - } - ], - "responses": { - "200": { - "description": "OK" - } - } - } - }, - "/bugs/1819a": { - "put": { - "tags": [ - "Bugs" - ], - "summary": "modelWithListOfEnumsAsJson", - "operationId": "modelWithListOfEnumsAsJsonUsingPUT_1", - "consumes": [ - "application/json" - ], - "parameters": [ - { - "in": "body", - "name": "model", - "description": "model", - "required": true, - "schema": { - "$ref": "#/definitions/Model1819" - } - } - ], - "responses": { - "200": { - "description": "OK" - } - } - } - }, - "/bugs/1819b{?enumTypes}": { - "post": { - "tags": [ - "Bugs" - ], - "summary": "modelWithListOfEnumsAsModelAttribute", - "operationId": "modelWithListOfEnumsAsModelAttributeUsingPOST_1", - "consumes": [ - "application/json" - ], - "parameters": [ - { - "name": "enumTypes", - "in": "query", - "required": false, - "type": "array", - "items": { - "type": "string", - "enum": [ - "ONE", - "TWO" - ] - }, - "collectionFormat": "multi", - "enum": [ - "ONE", - "TWO" - ] - } - ], - "responses": { - "200": { - "description": "OK" - } - } - } - }, - "/bugs/1841": { - "get": { - "tags": [ - "Bugs" - ], - "summary": "method1", - "operationId": "method1UsingGET_1", - "produces": [ - "application/atom+xml", - "application/json;charset=UTF-8" - ], - "responses": { - "200": { - "description": "OK" - } - } - } - }, - "/bugs/1864{?somename}": { - "get": { - "tags": [ - "Bugs" - ], - "summary": "test", - "operationId": "testUsingGET_1", - "parameters": [ - { - "name": "somename", - "in": "query", - "required": true, - "type": "string" - } - ], - "responses": { - "200": { - "description": "OK" - } - } - } - }, - "/bugs/1881": { - "get": { - "tags": [ - "Bugs" - ], - "summary": "bug1881", - "operationId": "bug1881UsingGET_1", - "parameters": [ - { - "in": "body", - "name": "container", - "description": "container", - "required": true, - "schema": { - "$ref": "#/definitions/Bug1881" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "string" - } - } - } - } - }, - "/bugs/1887/{env}/{list-id}/emails": { - "post": { - "tags": [ - "Bugs" - ], - "summary": "1887 example", - "operationId": "addEmailsToListUsingPOST_1", - "consumes": [ - "application/json;charset=UTF-8" - ], - "produces": [ - "application/json;charset=UTF-8" - ], - "parameters": [ - { - "in": "body", - "name": "emails", - "description": "emails", - "required": true, - "schema": { - "type": "array", - "items": { - "type": "string" - } - } - }, - { - "name": "env", - "in": "path", - "description": "env", - "required": true, - "type": "string" - }, - { - "name": "list-id", - "in": "path", - "description": "list-id", - "required": true, - "type": "string" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/Example" - } - } - } - } - }, - "/bugs/1894": { - "post": { - "tags": [ - "Bugs" - ], - "summary": "cacheEvict1", - "operationId": "cacheEvict1UsingPOST_1", - "consumes": [ - "application/x-www-form-urlencoded" - ], - "responses": { - "200": { - "description": "OK" - } - } - } - }, - "/bugs/1907": { - "get": { - "tags": [ - "Bugs" - ], - "summary": "xmlPayload", - "operationId": "xmlPayloadUsingGET_1", - "produces": [ - "application/xml" - ], - "parameters": [ - { - "in": "body", - "name": "xml", - "description": "xml", - "required": true, - "schema": { - "$ref": "#/definitions/Model1907" - } - } - ], - "responses": { - "200": { - "description": "OK" - } - } - } - }, - "/bugs/1926/filtered": { - "get": { - "tags": [ - "Bugs" - ], - "summary": "filtered", - "operationId": "filteredUsingGET_1", - "parameters": [ - { - "in": "body", - "name": "wrapper", - "description": "wrapper", - "required": true, - "schema": { - "$ref": "#/definitions/LangNotFilteredWrapper" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "string", - "enum": [ - "en", - "zh" - ] - } - } - } - } - }, - "/bugs/1926/not-filtered": { - "get": { - "tags": [ - "Bugs" - ], - "summary": "notFiltered", - "operationId": "notFilteredUsingGET_1", - "parameters": [ - { - "in": "body", - "name": "wrapper", - "description": "wrapper", - "required": true, - "schema": { - "$ref": "#/definitions/LangFilteredWrapper" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "string", - "enum": [ - "en", - "zh" - ] - } - } - } - } - }, - "/bugs/1939{?credential-source-id,password,username}": { - "get": { - "tags": [ - "Bugs" - ], - "summary": "authenticate a user using a given set of credentials, producing a JWT token that may be used for future API operations if successful", - "operationId": "authenticateUsingGET_1", - "produces": [ - "application/jwt" - ], - "parameters": [ - { - "name": "credential-source-id", - "in": "query", - "description": "credential-source-id", - "required": false, - "type": "string" - }, - { - "name": "password", - "in": "query", - "description": "password", - "required": true, - "type": "string" - }, - { - "name": "username", - "in": "query", - "description": "username", - "required": true, - "type": "string" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "string" - } - } - } - } - }, - "/bugs/1965": { - "post": { - "tags": [ - "Bugs" - ], - "summary": "bug1965", - "operationId": "bug1965UsingPOST_1", - "consumes": [ - "multipart/form-data" - ], - "parameters": [ - { - "name": "file", - "in": "formData", - "required": false, - "type": "file" - }, - { - "name": "sfId", - "in": "formData", - "required": false, - "type": "integer", - "format": "int32" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/Example" - } - } - } - } - }, - "/bugs/1965-form-data": { - "post": { - "tags": [ - "Bugs" - ], - "summary": "bug1965FormData", - "operationId": "bug1965FormDataUsingPOST_1", - "consumes": [ - "multipart/form-data" - ], - "parameters": [ - { - "name": "localDateTime", - "in": "formData", - "required": false, - "type": "string", - "format": "date-time" - }, - { - "name": "bar", - "in": "formData", - "required": false, - "type": "integer", - "format": "int32" - }, - { - "name": "parentBeanProperty", - "in": "formData", - "required": false, - "type": "string" - }, - { - "name": "readOnlyString", - "in": "formData", - "required": false, - "type": "string" - }, - { - "name": "foo", - "in": "formData", - "required": false, - "type": "string" - }, - { - "name": "nestedType.name", - "in": "formData", - "required": false, - "type": "string" - }, - { - "name": "enumType", - "in": "formData", - "required": false, - "type": "string" - }, - { - "name": "allCapsSet", - "in": "formData", - "required": false, - "type": "array", - "items": { - "type": "string" - }, - "collectionFormat": "multi" - }, - { - "name": "propertyWithNoSetterMethod", - "in": "formData", - "required": false, - "type": "string" - }, - { - "name": "annotatedEnumType", - "in": "formData", - "required": false, - "type": "string" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/Example" - } - } - } - } - }, - "/bugs/2029{?name}": { - "get": { - "tags": [ - "Bugs" - ], - "summary": "测试RequesetParam", - "description": "测试RequesetParam", - "operationId": "bug2020UsingGET_1", - "parameters": [ - { - "name": "date", - "in": "path", - "description": "日期:2017-09-01", - "required": true, - "type": "string" - }, - { - "name": "name", - "in": "query", - "description": "名称", - "required": false, - "type": "string" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "string" - } - } - } - } - }, - "/bugs/2081{?a.importantField,b.importantField}": { - "get": { - "tags": [ - "Bugs" - ], - "summary": "bug2081", - "operationId": "bug2081UsingGET_1", - "parameters": [ - { - "name": "a.importantField", - "in": "query", - "required": false, - "type": "string" - }, - { - "name": "b.importantField", - "in": "query", - "required": false, - "type": "string" - } - ], - "responses": { - "200": { - "description": "OK" - } - } - } - }, - "/bugs/2107/{someId}": { - "get": { - "tags": [ - "Bugs" - ], - "summary": "2107", - "operationId": "getSomeByIdUsingGET_1", - "produces": [ - "application/json" - ], - "parameters": [ - { - "name": "someId", - "in": "path", - "description": "This is the description", - "required": true, - "type": "string", - "default": "1f1f1f" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "string" - } - } - } - } - }, - "/bugs/2114{?clearIndex,siteSecret,stripHtmlTags,xmlUrl}": { - "put": { - "tags": [ - "Bugs" - ], - "summary": "bug2114", - "operationId": "bug2114UsingPUT_1", - "consumes": [ - "application/json" - ], - "parameters": [ - { - "name": "clearIndex", - "in": "query", - "description": "clearIndex", - "required": false, - "type": "boolean", - "default": false - }, - { - "name": "siteId", - "in": "path", - "description": "siteId", - "required": true, - "type": "string", - "format": "uuid" - }, - { - "name": "siteSecret", - "in": "query", - "description": "siteSecret", - "required": true, - "type": "string", - "format": "uuid" - }, - { - "name": "stripHtmlTags", - "in": "query", - "description": "stripHtmlTags", - "required": false, - "type": "boolean", - "default": false - }, - { - "name": "xmlUrl", - "in": "query", - "description": "xmlUrl", - "required": true, - "type": "string", - "format": "uri" - } - ], - "responses": { - "200": { - "description": "OK" - } - } - } - }, - "/bugs/2118": { - "get": { - "tags": [ - "Bugs" - ], - "summary": "bug2118", - "operationId": "bug2118UsingGET_1", - "parameters": [ - { - "in": "body", - "name": "person", - "description": "person", - "required": true, - "schema": { - "$ref": "#/definitions/Example" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "string" - } - } - } - } - }, - "/bugs/2161": { - "get": { - "tags": [ - "Bugs" - ], - "summary": "bug2161And2249and2469", - "operationId": "bug2161And2249and2469UsingGET_1", - "parameters": [ - { - "in": "body", - "name": "status", - "description": "status", - "required": true, - "schema": { - "$ref": "#/definitions/Status" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "string" - } - } - } - } - }, - "/bugs/2268{?$filter}": { - "get": { - "tags": [ - "Bugs", - "example" - ], - "summary": "Get all examples", - "description": "Get all examples ", - "operationId": "bug2268_1", - "produces": [ - "application/json" - ], - "parameters": [ - { - "name": "$filter", - "in": "query", - "description": "Filter the list", - "required": false, - "type": "string" - } - ], - "responses": { - "200": { - "description": "Success", - "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/Example" - } - } - } - }, - "security": [ - { - "user_auth": [ - "ADMIN", - "USER" - ] - } - ] - } - }, - "/bugs/2368": { - "get": { - "tags": [ - "Bugs" - ], - "summary": "bug2368", - "operationId": "bug2368UsingGET_1", - "responses": { - "200": { - "description": "OK" - } - } - } - }, - "/bugs/2378": { - "post": { - "tags": [ - "Bugs" - ], - "summary": "upperCaseField", - "operationId": "upperCaseFieldUsingPOST_1", - "consumes": [ - "application/json" - ], - "parameters": [ - { - "in": "body", - "name": "input", - "description": "input", - "required": true, - "schema": { - "$ref": "#/definitions/UpperCasedField" - } - } - ], - "responses": { - "200": { - "description": "OK" - } - } - } - }, - "/bugs/2391{?from_country_id}": { - "post": { - "tags": [ - "Bugs" - ], - "summary": "bug2391", - "operationId": "bug2391UsingPOST_1", - "consumes": [ - "application/json" - ], - "parameters": [ - { - "name": "from_country_id", - "in": "query", - "required": true, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK" - } - } - } - }, - "/bugs/2415": { - "post": { - "tags": [ - "Bugs" - ], - "summary": "bug2415", - "operationId": "bug2415UsingPOST_1", - "consumes": [ - "application/json" - ], - "parameters": [ - { - "in": "body", - "name": "input", - "description": "input", - "required": true, - "schema": { - "$ref": "#/definitions/Bug2415" - } - } - ], - "responses": { - "200": { - "description": "OK" - } - } - } - }, - "/bugs/2415{?input}": { - "get": { - "tags": [ - "Bugs" - ], - "summary": "bug2415", - "operationId": "bug2415UsingGET_1", - "parameters": [ - { - "name": "input", - "in": "query", - "description": "input", - "required": true, - "type": "string", - "maxLength": 16, - "minLength": 8, - "pattern": "^[A-Za-z0-9]{8,16}$" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "string" - } - } - } - } - }, - "/bugs/2423{?from,to}": { - "get": { - "tags": [ - "Bugs" - ], - "summary": "bug2423", - "operationId": "bug2423UsingGET_1", - "parameters": [ - { - "name": "from", - "in": "query", - "required": false, - "type": "string" - }, - { - "name": "to", - "in": "query", - "required": false, - "type": "string" - } - ], - "responses": { - "200": { - "description": "OK" - } - } - } - }, - "/bugs/2479": { - "post": { - "tags": [ - "Bugs" - ], - "summary": "bug2479", - "operationId": "bug2479UsingPOST_1", - "consumes": [ - "application/json" - ], - "parameters": [ - { - "in": "body", - "name": "input", - "description": "input", - "required": true, - "schema": { - "$ref": "#/definitions/Bug2479" - } - } - ], - "responses": { - "200": { - "description": "OK" - } - } - } - }, - "/bugs/2767/swagger15": { - "get": { - "tags": [ - "Bugs" - ], - "summary": "bug2767", - "operationId": "bug2767UsingGET_1", - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/Response" - } - }, - "400": { - "description": "Not Found", - "examples": { - "bar": "The address was invalid", - "foo": "{'invalidField': 'address'}" - } - } - } - } - }, - "/bugs/2822": { - "post": { - "tags": [ - "Bugs" - ], - "summary": "bug2822", - "operationId": "bug2822UsingPOST_1", - "consumes": [ - "application/json" - ], - "parameters": [ - { - "in": "body", - "name": "message", - "description": "message", - "required": true, - "schema": { - "type": "string", - "example": "exampleMessage" - } - } - ], - "responses": { - "200": { - "description": "OK" - } - } - } - }, - "/bugs/3321{?expand}": { - "get": { - "tags": [ - "Bugs" - ], - "summary": "bug3321", - "operationId": "bug3321UsingGET_1", - "parameters": [ - { - "name": "expand", - "in": "query", - "description": "expand", - "required": false, - "type": "array", - "items": { - "type": "string", - "enum": [ - "ONE", - "THREE", - "TWO" - ] - }, - "collectionFormat": "multi", - "enum": [ - "one", - "three", - "two" - ] - } - ], - "responses": { - "200": { - "description": "OK" - } - } - } - }, - "/bugs/3351/{id}": { - "post": { - "tags": [ - "Bugs" - ], - "summary": "createPost", - "operationId": "createPostUsingPOST_1", - "consumes": [ - "application/json" - ], - "parameters": [ - { - "name": "id", - "in": "path", - "description": "id", - "required": true, - "type": "integer", - "format": "int32" - }, - { - "in": "body", - "name": "post", - "description": "post", - "required": true, - "schema": { - "$ref": "#/definitions/Pet" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "string" - } - } - } - } - }, - "/bugs/3371": { - "get": { - "tags": [ - "Bugs" - ], - "summary": "bug3371", - "operationId": "bug3371UsingGET_1", - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "array", - "items": { - "type": "string" - } - } - } - } - } - }, - "/bugs/3380": { - "get": { - "tags": [ - "Bugs" - ], - "summary": "bug3380", - "operationId": "bug3380UsingGET_1", - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "string" - } - } - } - } - }, - "/bugs/bug1370": { - "post": { - "tags": [ - "Bugs" - ], - "summary": "upload attach file", - "operationId": "bug1370UsingPOST_1", - "consumes": [ - "multipart/form-data" - ], - "parameters": [ - { - "name": "name", - "in": "formData", - "required": false, - "type": "string" - }, - { - "name": "fileToUpload", - "in": "formData", - "required": false, - "type": "file" - } - ], - "responses": { - "200": { - "description": "OK" - } - } - } - }, - "/bugs/bug1827{?authorIds,authors[0].books[0].id,authors[0].books[0].name,authors[0].id,authors[0].name,id,name}": { - "get": { - "tags": [ - "Bugs" - ], - "summary": "addBook", - "operationId": "addBookUsingGET_1", - "parameters": [ - { - "name": "authorIds", - "in": "query", - "description": "authorIds", - "required": false, - "type": "array", - "items": { - "type": "string" - }, - "collectionFormat": "multi" - }, - { - "name": "authors[0].books[0].id", - "in": "query", - "required": false, - "type": "integer", - "format": "int64" - }, - { - "name": "authors[0].books[0].name", - "in": "query", - "required": false, - "type": "string" - }, - { - "name": "authors[0].id", - "in": "query", - "required": false, - "type": "integer", - "format": "int64" - }, - { - "name": "authors[0].name", - "in": "query", - "required": false, - "type": "string" - }, - { - "name": "id", - "in": "query", - "required": false, - "type": "integer", - "format": "int64" - }, - { - "name": "name", - "in": "query", - "required": false, - "type": "string" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "string" - } - } - } - } - }, - "/bugs/bug1944": { - "get": { - "tags": [ - "Bugs" - ], - "summary": "bug1944", - "operationId": "bug1944UsingGET_1", - "responses": { - "200": { - "description": "The object was deleted successfully." - }, - "404": { - "description": "No object was found with the given ID" - } - } - } - }, - "/bugs/bug2182": { - "get": { - "tags": [ - "Bugs" - ], - "summary": "/bug2182", - "operationId": "bug2182UsingGET_1", - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/ProductVO" - } - } - } - } - }, - "/bugs/bug2203": { - "get": { - "tags": [ - "Bugs" - ], - "summary": "bug2203", - "operationId": "bug2203UsingGET_1", - "produces": [ - "application/json;charset=UTF-8" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/Response«LanguageResponse»" - } - } - } - } - }, - "/bugs/bug2220": { - "get": { - "tags": [ - "Bugs" - ], - "summary": "bug2220", - "operationId": "bug2220UsingGET_2", - "parameters": [ - { - "name": "bar", - "in": "path", - "description": "bar", - "required": true, - "type": "string" - } - ], - "responses": { - "200": { - "description": "OK" - } - } - } - }, - "/bugs/bug2220/{bar}": { - "get": { - "tags": [ - "Bugs" - ], - "summary": "bug2220", - "operationId": "bug2220UsingGET_3", - "parameters": [ - { - "name": "bar", - "in": "path", - "description": "bar", - "required": true, - "type": "string" - } - ], - "responses": { - "200": { - "description": "OK" - } - } - } - }, - "/bugs/bug2230": { - "post": { - "tags": [ - "Bugs" - ], - "summary": "/bug2230", - "operationId": "bug2230UsingPOST_1", - "consumes": [ - "application/atom+xml" - ], - "parameters": [ - { - "in": "body", - "name": "applicatorUnits", - "description": "applicatorUnits", - "required": true, - "schema": { - "$ref": "#/definitions/EHDTOApplicatorUnits" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "string" - } - } - } - } - }, - "/bugs/bug2282": { - "get": { - "tags": [ - "Bugs" - ], - "summary": "/bug2282", - "operationId": "bug2282UsingGET_1", - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "string" - } - } - } - } - }, - "/bugs/bug2684": { - "get": { - "tags": [ - "Bugs" - ], - "summary": "Get test for response header", - "description": "Notes 'bout test", - "operationId": "responseHeader_1", - "produces": [ - "text/plain" - ], - "responses": { - "200": { - "description": "OK", - "headers": { - "X-Hello-Bis": { - "type": "string" - }, - "X-Hello": { - "type": "string" - } - }, - "schema": { - "type": "string" - } - } - } - } - }, - "/bugs/bug3087": { - "post": { - "tags": [ - "Bugs" - ], - "summary": "bug3087", - "operationId": "bug3087UsingPOST_1", - "consumes": [ - "application/json" - ], - "parameters": [ - { - "in": "body", - "name": "test", - "description": "test", - "required": true, - "schema": { - "$ref": "#/definitions/Bug3087" - } - } - ], - "responses": { - "200": { - "description": "OK" - } - } - } - }, - "/bugs/bug3353": { - "post": { - "tags": [ - "Bugs" - ], - "summary": "bug3353", - "operationId": "bug3353UsingPOST_1", - "consumes": [ - "application/x-www-form-urlencoded" - ], - "parameters": [ - { - "name": "orderNo", - "in": "formData", - "required": false, - "type": "string" - }, - { - "name": "agentCode", - "in": "formData", - "required": false, - "type": "string" - }, - { - "name": "sign", - "in": "formData", - "required": false, - "type": "string" - }, - { - "name": "timestamp", - "in": "formData", - "required": false, - "type": "number" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/WithdrawQueryRequestViewResponseView" - } - } - } - } - }, - "/bugs/bug3390{?range}": { - "get": { - "tags": [ - "Bugs" - ], - "summary": "bug3390", - "operationId": "bug3390UsingGET_1", - "parameters": [ - { - "name": "range", - "in": "query", - "required": false, - "type": "integer", - "maximum": 99, - "exclusiveMaximum": false, - "minimum": 1, - "exclusiveMinimum": false, - "format": "int32" - } - ], - "responses": { - "200": { - "description": "OK" - } - } - } - }, - "/bugs/{bar}/2148{?year}": { - "get": { - "tags": [ - "Bugs" - ], - "summary": "bug2148", - "operationId": "bug2148UsingGET_1", - "parameters": [ - { - "name": "bar", - "in": "path", - "description": "example", - "required": true, - "type": "integer", - "format": "int64" - }, - { - "name": "year", - "in": "query", - "description": "year", - "required": true, - "type": "integer", - "format": "int32" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/Example" - } - } - } - } - }, - "/bugs/{propertyKey}/{environmentKey}": { - "get": { - "tags": [ - "Bugs" - ], - "summary": "getProperty", - "operationId": "getPropertyUsingGET_1", - "parameters": [ - { - "name": "environmentKey", - "in": "path", - "description": "Key of the environment", - "required": true, - "type": "string" - }, - { - "name": "propertyKey", - "in": "path", - "description": "Key of the property", - "required": true, - "type": "string" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "string" - } - } - } - } - } - }, - "securityDefinitions": { - "api_key": { - "type": "apiKey", - "name": "api_key", - "in": "header" - }, - "petstore_auth": { - "type": "oauth2", - "authorizationUrl": "http://petstore.swagger.io/api/oauth/dialog", - "flow": "implicit", - "scopes": { - "write:pets": "modify pets in your account", - "read:pets": "read your pets" - } - } - }, - "definitions": { - "Bug1376": { - "type": "object", - "properties": { - "url": { - "type": "string" - } - }, - "title": "Bug1376" - }, - "Bug1676": { - "type": "object", - "properties": { - "xAxis": { - "type": "number", - "format": "float", - "example": 200.0, - "description": "Horizontal position" - }, - "yAxis": { - "type": "number", - "format": "float", - "example": 500.0, - "description": "Vertical position" - } - }, - "title": "Bug1676" - }, - "Bug1697": { - "type": "object", - "properties": { - "bar": { - "type": "string" - } - }, - "title": "Bug1697" - }, - "Bug1740": { - "type": "object", - "properties": { - "innerValue": { - "type": "string" - }, - "value": { - "type": "string" - } - }, - "title": "Bug1740" - }, - "Bug1777": { - "type": "object", - "required": [ - "longitude" - ], - "properties": { - "longitude": { - "type": "number", - "format": "double", - "description": "经度" - } - }, - "title": "Bug1777", - "description": "Test 1777" - }, - "Bug1881": { - "type": "object", - "properties": { - "data1": { - "type": "object", - "additionalProperties": { - "type": "array", - "items": { - "type": "object" - } - } - }, - "data2": { - "type": "object", - "additionalProperties": { - "type": "array", - "items": { - "$ref": "#/definitions/Example" - } - } - } - }, - "title": "Bug1881" - }, - "Bug2415": { - "type": "object", - "properties": { - "test": { - "type": "string", - "minLength": 8, - "maxLength": 16, - "pattern": "^[A-Za-z0-9]{8,16}$" - } - }, - "title": "Bug2415" - }, - "Bug2479": { - "type": "object", - "properties": { - "first": { - "description": "First", - "$ref": "#/definitions/Example" - }, - "second": { - "description": "Second", - "$ref": "#/definitions/Example" - } - }, - "title": "Bug2479" - }, - "Bug3087": { - "type": "object", - "required": [ - "password", - "user" - ], - "properties": { - "password": { - "type": "string" - }, - "user": { - "type": "string" - } - }, - "title": "Bug3087" - }, - "EHDTOApplicatorUnits": { - "type": "object", - "properties": { - "ehdtoUnitGroups": { - "type": "array", - "xml": { - "name": "UnitGroup", - "attribute": false, - "wrapped": false - }, - "items": { - "$ref": "#/definitions/EHDTOUnitGroup" - } - } - }, - "title": "EHDTOApplicatorUnits", - "xml": { - "name": "ApplicatorUnits", - "attribute": false, - "wrapped": false - } - }, - "EHDTOUnit": { - "type": "object", - "properties": { - "id": { - "type": "string", - "xml": { - "name": "id", - "attribute": true, - "wrapped": false - } - }, - "name": { - "type": "string", - "xml": { - "name": "name", - "attribute": true, - "wrapped": false - } - }, - "unitSystem": { - "type": "string", - "xml": { - "name": "unitSystem", - "attribute": true, - "wrapped": false - } - } - }, - "title": "EHDTOUnit", - "xml": { - "name": "Unit", - "attribute": false, - "wrapped": false - } - }, - "EHDTOUnitGroup": { - "type": "object", - "properties": { - "ehdtoUnits": { - "type": "array", - "xml": { - "name": "unit", - "attribute": false, - "wrapped": false - }, - "items": { - "$ref": "#/definitions/EHDTOUnit" - } - }, - "name": { - "type": "string", - "xml": { - "name": "name", - "attribute": true, - "wrapped": false - } - } - }, - "title": "EHDTOUnitGroup", - "xml": { - "name": "UnitGroup", - "attribute": false, - "wrapped": false - } - }, - "EntityModel«string»": { - "type": "object", - "properties": { - "links": { - "$ref": "#/definitions/Links" - } - }, - "title": "EntityModel«string»" - }, - "ErrorResponse": { - "type": "object", - "required": [ - "invalidField" - ], - "properties": { - "invalidField": { - "type": "string", - "example": "address" - } - }, - "title": "ErrorResponse" - }, - "Example": { - "type": "object", - "properties": { - "allCapsSet": { - "type": "array", - "uniqueItems": true, - "items": { - "type": "string" - } - }, - "annotatedEnumType": { - "type": "string", - "enum": [ - "ONE", - "TWO" - ] - }, - "bar": { - "type": "integer", - "format": "int32", - "example": 10, - "description": "description of bar" - }, - "enumType": { - "type": "string", - "enum": [ - "ONE", - "TWO" - ] - }, - "foo": { - "type": "string" - }, - "localDateTime": { - "type": "string", - "format": "date-time" - }, - "nestedType": { - "$ref": "#/definitions/NestedType" - }, - "parentBeanProperty": { - "type": "string" - }, - "propertyWithNoGetterMethod": { - "type": "string" - }, - "propertyWithNoSetterMethod": { - "type": "string" - }, - "readOnlyString": { - "type": "string", - "description": "A read only string", - "readOnly": true - } - }, - "title": "Example" - }, - "File": { - "type": "object", - "properties": { - "name": { - "type": "string" - } - }, - "title": "File" - }, - "LangFilteredWrapper": { - "type": "object", - "title": "LangFilteredWrapper" - }, - "LangNotFilteredWrapper": { - "type": "object", - "title": "LangNotFilteredWrapper" - }, - "LanguageText": { - "type": "object", - "properties": { - "TEXT": { - "type": "string" - } - }, - "title": "LanguageText" - }, - "Links": { - "type": "object", - "properties": { - "empty": { - "type": "boolean" - } - }, - "title": "Links" - }, - "Model1819": { - "type": "object", - "properties": { - "enumTypes": { - "type": "array", - "items": { - "type": "string", - "enum": [ - "ONE", - "TWO" - ] - } - } - }, - "title": "Model1819" - }, - "Model1907": { - "type": "object", - "required": [ - "example", - "somename" - ], - "properties": { - "example": { - "xml": { - "name": "example", - "attribute": false, - "wrapped": false - }, - "$ref": "#/definitions/Example" - }, - "somename": { - "type": "string", - "xml": { - "name": "somename", - "attribute": true, - "wrapped": false - } - } - }, - "title": "Model1907", - "xml": { - "name": "model1907", - "namespace": "urn:bugs", - "attribute": false, - "wrapped": false - } - }, - "NestedType": { - "type": "object", - "properties": { - "name": { - "type": "string" - } - }, - "title": "NestedType" - }, - "Pet": { - "type": "object", - "properties": { - "age": { - "type": "integer", - "format": "int32" - }, - "id": { - "type": "string" - }, - "name": { - "type": "string" - } - }, - "title": "Pet" - }, - "ProductVO": { - "type": "object", - "properties": { - "name": { - "type": "string" - }, - "specification_child_name": { - "type": "string" - }, - "specification_name": { - "type": "string" - } - }, - "title": "ProductVO" - }, - "Response": { - "type": "object", - "required": [ - "data" - ], - "properties": { - "data": { - "type": "string", - "example": "some data" - } - }, - "title": "Response" - }, - "Response«LanguageResponse»": { - "type": "object", - "properties": { - "cancelled": { - "type": "boolean" - }, - "context": { - "type": "object" - }, - "done": { - "type": "boolean" - } - }, - "title": "Response«LanguageResponse»" - }, - "Status": { - "type": "object", - "required": [ - "bug_1964" - ], - "properties": { - "bug2469": { - "type": "string", - "example": "[test] n/a" - }, - "bug_1964": { - "type": "boolean" - }, - "enabled": { - "type": "boolean", - "example": false - }, - "integerString": { - "type": "string", - "example": "1235" - } - }, - "title": "Status" - }, - "UpperCasedField": { - "type": "object", - "properties": { - "YEAR": { - "type": "integer", - "format": "int32" - }, - "age": { - "type": "integer", - "format": "int32" - } - }, - "title": "UpperCasedField" - }, - "WithdrawQueryRequestViewResponseView": { - "type": "object", - "title": "WithdrawQueryRequestViewResponseView" - } - } -} \ No newline at end of file diff --git a/swagger-contract-tests/src/test/resources/contract/swagger2/declaration-bugs-service.json b/swagger-contract-tests/src/test/resources/contract/swagger2/declaration-bugs-service.json deleted file mode 100644 index c5e2f41a435..00000000000 --- a/swagger-contract-tests/src/test/resources/contract/swagger2/declaration-bugs-service.json +++ /dev/null @@ -1,2741 +0,0 @@ -{ - "swagger": "2.0", - "info": { - "description": "bugs API", - "version": "1.0", - "title": "bugs API", - "test": "testValue" - }, - "host": "localhost:__PORT__", - "basePath": "/", - "tags": [ - { - "name": "Bugs", - "description": "Bugs Controller" - }, - { - "name": "foo", - "description": "Foo Description" - } - ], - "produces": [ - "application/json", - "application/xml" - ], - "paths": { - "/bugs/1162": { - "post": { - "tags": [ - "Bugs" - ], - "summary": "bug1162", - "operationId": "bug1162UsingPOST", - "consumes": [ - "application/json" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "string", - "format": "date" - } - } - } - } - }, - "/bugs/1209": { - "post": { - "tags": [ - "Bugs" - ], - "summary": "bug1209", - "operationId": "bug1209UsingPOST", - "consumes": [ - "application/json" - ], - "parameters": [ - { - "name": "custom-header", - "in": "header", - "required": false, - "type": "array", - "items": { - "type": "string" - }, - "collectionFormat": "csv" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "string" - } - } - } - } - }, - "/bugs/1306{?paramMap}": { - "post": { - "tags": [ - "Bugs" - ], - "summary": "bug1306", - "operationId": "bug1306UsingPOST", - "consumes": [ - "application/json" - ], - "parameters": [ - { - "name": "paramMap", - "in": "query", - "description": "paramMap", - "required": true, - "items": { - "type": "object", - "additionalProperties": { - "type": "string" - } - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "object", - "additionalProperties": { - "type": "string" - } - } - } - } - } - }, - "/bugs/1376-bare": { - "post": { - "tags": [ - "Bugs" - ], - "summary": "issue1376Bare", - "operationId": "issue1376BareUsingPOST", - "consumes": [ - "application/json" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "string" - } - } - } - } - }, - "/bugs/1376-input-bare{?url}": { - "post": { - "tags": [ - "Bugs" - ], - "summary": "issue1376Input", - "operationId": "issue1376InputUsingPOST", - "consumes": [ - "application/json" - ], - "parameters": [ - { - "name": "url", - "in": "query", - "description": "url", - "required": false, - "type": "string" - } - ], - "responses": { - "200": { - "description": "OK" - } - } - } - }, - "/bugs/1376-input-property{?url}": { - "post": { - "tags": [ - "Bugs" - ], - "summary": "issue1376Input", - "operationId": "issue1376InputUsingPOST_1", - "consumes": [ - "application/json" - ], - "parameters": [ - { - "name": "url", - "in": "query", - "required": false, - "type": "string" - } - ], - "responses": { - "200": { - "description": "OK" - } - } - } - }, - "/bugs/1376-property": { - "post": { - "tags": [ - "Bugs" - ], - "summary": "issue1376Property", - "operationId": "issue1376PropertyUsingPOST", - "consumes": [ - "application/json" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/Bug1376" - } - } - } - } - }, - "/bugs/1420": { - "get": { - "tags": [ - "Bugs", - "foo" - ], - "summary": "issue1420", - "operationId": "issue1420UsingGET", - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "string" - } - } - } - } - }, - "/bugs/1440": { - "get": { - "tags": [ - "Bugs" - ], - "summary": "issue1440", - "operationId": "issue1440UsingGET", - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/EntityModel«string»" - } - } - } - } - }, - "/bugs/1475": { - "get": { - "tags": [ - "Bugs" - ], - "summary": "mapOfLists", - "operationId": "mapOfListsUsingGET", - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "object", - "additionalProperties": { - "type": "array", - "items": { - "type": "string" - } - } - } - } - } - } - }, - "/bugs/1475-example": { - "get": { - "tags": [ - "Bugs" - ], - "summary": "mapOfListOfExample", - "operationId": "mapOfListOfExampleUsingGET", - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "object", - "additionalProperties": { - "type": "array", - "items": { - "$ref": "#/definitions/Example" - } - } - } - } - } - } - }, - "/bugs/1605": { - "get": { - "tags": [ - "Bugs" - ], - "summary": "byteArrayResponse", - "operationId": "byteArrayResponseUsingGET", - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "string", - "format": "byte" - } - } - } - } - }, - "/bugs/1627": { - "get": { - "tags": [ - "Bugs" - ], - "summary": "bug1627", - "operationId": "bug1627UsingGET", - "parameters": [ - { - "in": "body", - "name": "body", - "description": "body", - "required": true, - "schema": { - "$ref": "#/definitions/Bug1627" - } - } - ], - "responses": { - "200": { - "description": "OK" - } - } - } - }, - "/bugs/1632": { - "get": { - "tags": [ - "Bugs" - ], - "summary": "fileCustomType", - "operationId": "fileCustomTypeUsingGET", - "parameters": [ - { - "in": "body", - "name": "value", - "description": "value", - "required": true, - "schema": { - "$ref": "#/definitions/File" - } - } - ], - "responses": { - "200": { - "description": "OK" - } - } - } - }, - "/bugs/1632s": { - "get": { - "tags": [ - "Bugs" - ], - "summary": "filesCustomType", - "operationId": "filesCustomTypeUsingGET", - "parameters": [ - { - "in": "body", - "name": "values", - "description": "values", - "required": true, - "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/File" - } - } - } - ], - "responses": { - "200": { - "description": "OK" - } - } - } - }, - "/bugs/1676": { - "get": { - "tags": [ - "Bugs" - ], - "summary": "apiModelProperty", - "operationId": "apiModelPropertyUsingGET", - "parameters": [ - { - "in": "body", - "name": "value", - "description": "value", - "required": true, - "schema": { - "$ref": "#/definitions/Bug1676" - } - } - ], - "responses": { - "200": { - "description": "OK" - } - } - } - }, - "/bugs/1697": { - "get": { - "tags": [ - "Bugs" - ], - "summary": "payloadWithByteBuffer", - "operationId": "payloadWithByteBufferUsingGET", - "parameters": [ - { - "in": "body", - "name": "body", - "description": "body", - "required": true, - "schema": { - "$ref": "#/definitions/Bug1697" - } - } - ], - "responses": { - "200": { - "description": "OK" - } - } - } - }, - "/bugs/1722": { - "post": { - "tags": [ - "Bugs" - ], - "summary": "Remove an apple from a user", - "description": "Remove an apple from a user. You must specify the user name and the apple name.", - "operationId": "bug1722UsingPOST", - "consumes": [ - "application/xml", - "application/json" - ], - "produces": [ - "application/json", - "application/xml" - ], - "parameters": [ - { - "in": "body", - "name": "test", - "description": "test", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "The apple is removed" - } - } - } - }, - "/bugs/1734{?offset}": { - "get": { - "tags": [ - "Bugs" - ], - "summary": "bug1734", - "operationId": "bug1734UsingGET", - "parameters": [ - { - "name": "offset", - "in": "query", - "description": "The value of offset", - "required": false, - "type": "integer", - "default": 0, - "format": "int32" - } - ], - "responses": { - "200": { - "description": "OK" - } - } - } - }, - "/bugs/1740": { - "get": { - "tags": [ - "Bugs" - ], - "summary": "bug1740", - "operationId": "bug1740UsingGET", - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/Bug1740" - } - } - } - } - }, - "/bugs/1749{?ascending,companyName,email,like,pageNumber,pageSize,set,sortDirection,sortField}": { - "get": { - "tags": [ - "Bugs" - ], - "summary": "Retrieve all the companies", - "operationId": "getAllPagedUsingGET", - "parameters": [ - { - "name": "ascending", - "in": "query", - "required": false, - "type": "boolean" - }, - { - "name": "companyName", - "in": "query", - "description": "companyName", - "required": false, - "type": "string" - }, - { - "name": "email", - "in": "query", - "description": "email", - "required": false, - "type": "string" - }, - { - "name": "like", - "in": "query", - "description": "like", - "required": false, - "type": "boolean" - }, - { - "name": "pageNumber", - "in": "query", - "required": true, - "type": "integer", - "minimum": 1, - "exclusiveMinimum": false, - "format": "int32" - }, - { - "name": "pageSize", - "in": "query", - "required": true, - "type": "integer", - "maximum": 50, - "exclusiveMaximum": false, - "format": "int32" - }, - { - "name": "set", - "in": "query", - "required": false, - "type": "boolean" - }, - { - "name": "sortDirection", - "in": "query", - "required": false, - "type": "string", - "enum": [ - "ASC", - "DESC" - ] - }, - { - "name": "sortField", - "in": "query", - "required": false, - "type": "string" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "array", - "items": { - "type": "string" - } - } - } - } - } - }, - "/bugs/1750a": { - "get": { - "tags": [ - "Bugs" - ], - "summary": "bug1750a", - "operationId": "bug1750aUsingGET", - "responses": { - "200": { - "description": "list of ids", - "schema": { - "type": "string" - } - }, - "204": { - "description": "no ids found" - } - } - } - }, - "/bugs/1750b": { - "get": { - "tags": [ - "Bugs" - ], - "summary": "1750b", - "operationId": "bug1750bUsingGET", - "responses": { - "200": { - "description": "list of ids", - "schema": { - "type": "string" - } - }, - "204": { - "description": "no ids found" - } - } - } - }, - "/bugs/1767": { - "get": { - "description": "This is a test method", - "operationId": "bug1767GET", - "parameters": [ - { - "name": "description", - "in": "query", - "description": "search by description", - "required": true, - "type": "string" - } - ], - "responses": { - "200": { - "description": "Successfully received bug 1767 or 2219 response", - "schema": { - "type": "string" - } - } - } - } - }, - "/bugs/1777": { - "get": { - "tags": [ - "Bugs" - ], - "summary": "bug1777", - "operationId": "bug1777UsingGET", - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/Bug1777" - } - } - } - } - }, - "/bugs/1778{?e,s}": { - "get": { - "tags": [ - "Bugs" - ], - "summary": "bug1778", - "operationId": "bug1778UsingGET", - "parameters": [ - { - "name": "e", - "in": "query", - "required": false, - "type": "string" - }, - { - "name": "s", - "in": "query", - "required": false, - "type": "string" - } - ], - "responses": { - "200": { - "description": "OK" - } - } - } - }, - "/bugs/1819a": { - "put": { - "tags": [ - "Bugs" - ], - "summary": "modelWithListOfEnumsAsJson", - "operationId": "modelWithListOfEnumsAsJsonUsingPUT", - "consumes": [ - "application/json" - ], - "parameters": [ - { - "in": "body", - "name": "model", - "description": "model", - "required": true, - "schema": { - "$ref": "#/definitions/Model1819" - } - } - ], - "responses": { - "200": { - "description": "OK" - } - } - } - }, - "/bugs/1819b{?enumTypes}": { - "post": { - "tags": [ - "Bugs" - ], - "summary": "modelWithListOfEnumsAsModelAttribute", - "operationId": "modelWithListOfEnumsAsModelAttributeUsingPOST", - "consumes": [ - "application/json" - ], - "parameters": [ - { - "name": "enumTypes", - "in": "query", - "required": false, - "type": "array", - "items": { - "type": "string", - "enum": [ - "ONE", - "TWO" - ] - }, - "collectionFormat": "multi", - "enum": [ - "ONE", - "TWO" - ] - } - ], - "responses": { - "200": { - "description": "OK" - } - } - } - }, - "/bugs/1841": { - "get": { - "tags": [ - "Bugs" - ], - "summary": "method1", - "operationId": "method1UsingGET", - "produces": [ - "application/atom+xml", - "application/json;charset=UTF-8" - ], - "responses": { - "200": { - "description": "OK" - } - } - } - }, - "/bugs/1864{?somename}": { - "get": { - "tags": [ - "Bugs" - ], - "summary": "test", - "operationId": "testUsingGET", - "parameters": [ - { - "name": "somename", - "in": "query", - "required": true, - "type": "string" - } - ], - "responses": { - "200": { - "description": "OK" - } - } - } - }, - "/bugs/1881": { - "get": { - "tags": [ - "Bugs" - ], - "summary": "bug1881", - "operationId": "bug1881UsingGET", - "parameters": [ - { - "in": "body", - "name": "container", - "description": "container", - "required": true, - "schema": { - "$ref": "#/definitions/Bug1881" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "string" - } - } - } - } - }, - "/bugs/1887/{env}/{list-id}/emails": { - "post": { - "tags": [ - "Bugs" - ], - "summary": "1887 example", - "operationId": "addEmailsToListUsingPOST", - "consumes": [ - "application/json;charset=UTF-8" - ], - "produces": [ - "application/json;charset=UTF-8" - ], - "parameters": [ - { - "in": "body", - "name": "emails", - "description": "emails", - "required": true, - "schema": { - "type": "array", - "items": { - "type": "string" - } - } - }, - { - "name": "env", - "in": "path", - "description": "env", - "required": true, - "type": "string" - }, - { - "name": "list-id", - "in": "path", - "description": "list-id", - "required": true, - "type": "string" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/Example" - } - } - } - } - }, - "/bugs/1894": { - "post": { - "tags": [ - "Bugs" - ], - "summary": "cacheEvict1", - "operationId": "cacheEvict1UsingPOST", - "consumes": [ - "application/x-www-form-urlencoded" - ], - "responses": { - "200": { - "description": "OK" - } - } - } - }, - "/bugs/1907": { - "get": { - "tags": [ - "Bugs" - ], - "summary": "xmlPayload", - "operationId": "xmlPayloadUsingGET", - "produces": [ - "application/xml" - ], - "parameters": [ - { - "in": "body", - "name": "xml", - "description": "xml", - "required": true, - "schema": { - "$ref": "#/definitions/Model1907" - } - } - ], - "responses": { - "200": { - "description": "OK" - } - } - } - }, - "/bugs/1926/filtered": { - "get": { - "tags": [ - "Bugs" - ], - "summary": "filtered", - "operationId": "filteredUsingGET", - "parameters": [ - { - "in": "body", - "name": "wrapper", - "description": "wrapper", - "required": true, - "schema": { - "$ref": "#/definitions/LangNotFilteredWrapper" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "string", - "enum": [ - "en", - "zh" - ] - } - } - } - } - }, - "/bugs/1926/not-filtered": { - "get": { - "tags": [ - "Bugs" - ], - "summary": "notFiltered", - "operationId": "notFilteredUsingGET", - "parameters": [ - { - "in": "body", - "name": "wrapper", - "description": "wrapper", - "required": true, - "schema": { - "$ref": "#/definitions/LangFilteredWrapper" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "string", - "enum": [ - "en", - "zh" - ] - } - } - } - } - }, - "/bugs/1939{?credential-source-id,password,username}": { - "get": { - "tags": [ - "Bugs" - ], - "summary": "authenticate a user using a given set of credentials, producing a JWT token that may be used for future API operations if successful", - "operationId": "authenticateUsingGET", - "produces": [ - "application/jwt" - ], - "parameters": [ - { - "name": "credential-source-id", - "in": "query", - "description": "credential-source-id", - "required": false, - "type": "string" - }, - { - "name": "password", - "in": "query", - "description": "password", - "required": true, - "type": "string" - }, - { - "name": "username", - "in": "query", - "description": "username", - "required": true, - "type": "string" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "string" - } - } - } - } - }, - "/bugs/1965": { - "post": { - "tags": [ - "Bugs" - ], - "summary": "bug1965", - "operationId": "bug1965UsingPOST", - "consumes": [ - "multipart/form-data" - ], - "parameters": [ - { - "name": "file", - "in": "formData", - "required": false, - "type": "file" - }, - { - "name": "sfId", - "in": "formData", - "required": false, - "type": "integer", - "format": "int32" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/Example" - } - } - } - } - }, - "/bugs/1965-form-data": { - "post": { - "tags": [ - "Bugs" - ], - "summary": "bug1965FormData", - "operationId": "bug1965FormDataUsingPOST", - "consumes": [ - "multipart/form-data" - ], - "parameters": [ - { - "name": "localDateTime", - "in": "formData", - "required": false, - "type": "string", - "format": "date-time" - }, - { - "name": "bar", - "in": "formData", - "required": false, - "type": "integer", - "format": "int32" - }, - { - "name": "parentBeanProperty", - "in": "formData", - "required": false, - "type": "string" - }, - { - "name": "readOnlyString", - "in": "formData", - "required": false, - "type": "string" - }, - { - "name": "foo", - "in": "formData", - "required": false, - "type": "string" - }, - { - "name": "nestedType.name", - "in": "formData", - "required": false, - "type": "string" - }, - { - "name": "enumType", - "in": "formData", - "required": false, - "type": "string" - }, - { - "name": "allCapsSet", - "in": "formData", - "required": false, - "type": "array", - "items": { - "type": "string" - }, - "collectionFormat": "multi" - }, - { - "name": "propertyWithNoSetterMethod", - "in": "formData", - "required": false, - "type": "string" - }, - { - "name": "annotatedEnumType", - "in": "formData", - "required": false, - "type": "string" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/Example" - } - } - } - } - }, - "/bugs/2029{?name}": { - "get": { - "tags": [ - "Bugs" - ], - "summary": "测试RequesetParam", - "description": "测试RequesetParam", - "operationId": "bug2020UsingGET", - "parameters": [ - { - "name": "date", - "in": "path", - "description": "日期:2017-09-01", - "required": true, - "type": "string" - }, - { - "name": "name", - "in": "query", - "description": "名称", - "required": false, - "type": "string" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "string" - } - } - } - } - }, - "/bugs/2081{?a.importantField,b.importantField}": { - "get": { - "tags": [ - "Bugs" - ], - "summary": "bug2081", - "operationId": "bug2081UsingGET", - "parameters": [ - { - "name": "a.importantField", - "in": "query", - "required": false, - "type": "string" - }, - { - "name": "b.importantField", - "in": "query", - "required": false, - "type": "string" - } - ], - "responses": { - "200": { - "description": "OK" - } - } - } - }, - "/bugs/2107/{someId}": { - "get": { - "tags": [ - "Bugs" - ], - "summary": "2107", - "operationId": "getSomeByIdUsingGET", - "produces": [ - "application/json" - ], - "parameters": [ - { - "name": "someId", - "in": "path", - "description": "This is the description", - "required": true, - "type": "string", - "default": "1f1f1f" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "string" - } - } - } - } - }, - "/bugs/2114{?clearIndex,siteSecret,stripHtmlTags,xmlUrl}": { - "put": { - "tags": [ - "Bugs" - ], - "summary": "bug2114", - "operationId": "bug2114UsingPUT", - "consumes": [ - "application/json" - ], - "parameters": [ - { - "name": "clearIndex", - "in": "query", - "description": "clearIndex", - "required": false, - "type": "boolean", - "default": false - }, - { - "name": "siteId", - "in": "path", - "description": "siteId", - "required": true, - "type": "string", - "format": "uuid" - }, - { - "name": "siteSecret", - "in": "query", - "description": "siteSecret", - "required": true, - "type": "string", - "format": "uuid" - }, - { - "name": "stripHtmlTags", - "in": "query", - "description": "stripHtmlTags", - "required": false, - "type": "boolean", - "default": false - }, - { - "name": "xmlUrl", - "in": "query", - "description": "xmlUrl", - "required": true, - "type": "string", - "format": "uri" - } - ], - "responses": { - "200": { - "description": "OK" - } - } - } - }, - "/bugs/2118": { - "get": { - "tags": [ - "Bugs" - ], - "summary": "bug2118", - "operationId": "bug2118UsingGET", - "parameters": [ - { - "in": "body", - "name": "person", - "description": "person", - "required": true, - "schema": { - "$ref": "#/definitions/Example" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "string" - } - } - } - } - }, - "/bugs/2161": { - "get": { - "tags": [ - "Bugs" - ], - "summary": "bug2161And2249and2469", - "operationId": "bug2161And2249and2469UsingGET", - "parameters": [ - { - "in": "body", - "name": "status", - "description": "status", - "required": true, - "schema": { - "$ref": "#/definitions/Status" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "string" - } - } - } - } - }, - "/bugs/2268{?$filter}": { - "get": { - "tags": [ - "Bugs", - "example" - ], - "summary": "Get all examples", - "description": "Get all examples ", - "operationId": "bug2268", - "produces": [ - "application/json" - ], - "parameters": [ - { - "name": "$filter", - "in": "query", - "description": "Filter the list", - "required": false, - "type": "string" - } - ], - "responses": { - "200": { - "description": "Success", - "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/Example" - } - } - } - }, - "security": [ - { - "petstore_auth": [ - "read" - ] - } - ] - } - }, - "/bugs/2368": { - "get": { - "tags": [ - "Bugs" - ], - "summary": "bug2368", - "operationId": "bug2368UsingGET", - "responses": { - "200": { - "description": "OK" - } - } - } - }, - "/bugs/2378": { - "post": { - "tags": [ - "Bugs" - ], - "summary": "upperCaseField", - "operationId": "upperCaseFieldUsingPOST", - "consumes": [ - "application/json" - ], - "parameters": [ - { - "in": "body", - "name": "input", - "description": "input", - "required": true, - "schema": { - "$ref": "#/definitions/UpperCasedField" - } - } - ], - "responses": { - "200": { - "description": "OK" - } - } - } - }, - "/bugs/2391{?from_country_id}": { - "post": { - "tags": [ - "Bugs" - ], - "summary": "bug2391", - "operationId": "bug2391UsingPOST", - "consumes": [ - "application/json" - ], - "parameters": [ - { - "name": "from_country_id", - "in": "query", - "required": true, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK" - } - } - } - }, - "/bugs/2415": { - "post": { - "tags": [ - "Bugs" - ], - "summary": "bug2415", - "operationId": "bug2415UsingPOST", - "consumes": [ - "application/json" - ], - "parameters": [ - { - "in": "body", - "name": "input", - "description": "input", - "required": true, - "schema": { - "$ref": "#/definitions/Bug2415" - } - } - ], - "responses": { - "200": { - "description": "OK" - } - } - } - }, - "/bugs/2415{?input}": { - "get": { - "tags": [ - "Bugs" - ], - "summary": "bug2415", - "operationId": "bug2415UsingGET", - "parameters": [ - { - "name": "input", - "in": "query", - "description": "input", - "required": true, - "type": "string", - "maxLength": 16, - "minLength": 8, - "pattern": "^[A-Za-z0-9]{8,16}$" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "string" - } - } - } - } - }, - "/bugs/2423{?from,to}": { - "get": { - "tags": [ - "Bugs" - ], - "summary": "bug2423", - "operationId": "bug2423UsingGET", - "parameters": [ - { - "name": "from", - "in": "query", - "required": false, - "type": "string" - }, - { - "name": "to", - "in": "query", - "required": false, - "type": "string" - } - ], - "responses": { - "200": { - "description": "OK" - } - } - } - }, - "/bugs/2479": { - "post": { - "tags": [ - "Bugs" - ], - "summary": "bug2479", - "operationId": "bug2479UsingPOST", - "consumes": [ - "application/json" - ], - "parameters": [ - { - "in": "body", - "name": "input", - "description": "input", - "required": true, - "schema": { - "$ref": "#/definitions/Bug2479" - } - } - ], - "responses": { - "200": { - "description": "OK" - } - } - } - }, - "/bugs/2767/swagger15": { - "get": { - "tags": [ - "Bugs" - ], - "summary": "bug2767", - "operationId": "bug2767UsingGET", - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/Response" - } - }, - "400": { - "description": "Not Found", - "examples": { - "bar": "The address was invalid", - "foo": "{'invalidField': 'address'}" - } - } - } - } - }, - "/bugs/2822": { - "post": { - "tags": [ - "Bugs" - ], - "summary": "bug2822", - "operationId": "bug2822UsingPOST", - "consumes": [ - "application/json" - ], - "parameters": [ - { - "in": "body", - "name": "message", - "description": "message", - "required": true, - "schema": { - "type": "string", - "example": "exampleMessage" - } - } - ], - "responses": { - "200": { - "description": "OK" - } - } - } - }, - "/bugs/3321{?expand}": { - "get": { - "tags": [ - "Bugs" - ], - "summary": "bug3321", - "operationId": "bug3321UsingGET", - "parameters": [ - { - "name": "expand", - "in": "query", - "description": "expand", - "required": false, - "type": "array", - "items": { - "type": "string", - "enum": [ - "ONE", - "THREE", - "TWO" - ] - }, - "collectionFormat": "multi", - "enum": [ - "one", - "three", - "two" - ] - } - ], - "responses": { - "200": { - "description": "OK" - } - } - } - }, - "/bugs/3351/{id}": { - "post": { - "tags": [ - "Bugs" - ], - "summary": "createPost", - "operationId": "createPostUsingPOST", - "consumes": [ - "application/json" - ], - "parameters": [ - { - "name": "id", - "in": "path", - "description": "id", - "required": true, - "type": "integer", - "format": "int32" - }, - { - "in": "body", - "name": "post", - "description": "post", - "required": true, - "schema": { - "$ref": "#/definitions/Pet" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "string" - } - } - } - } - }, - "/bugs/3371": { - "get": { - "tags": [ - "Bugs" - ], - "summary": "bug3371", - "operationId": "bug3371UsingGET", - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "array", - "items": { - "type": "string" - } - } - } - } - } - }, - "/bugs/3380": { - "get": { - "tags": [ - "Bugs" - ], - "summary": "bug3380", - "operationId": "bug3380UsingGET", - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "string" - } - } - } - } - }, - "/bugs/bug1370": { - "post": { - "tags": [ - "Bugs" - ], - "summary": "upload attach file", - "operationId": "bug1370UsingPOST", - "consumes": [ - "multipart/form-data" - ], - "parameters": [ - { - "name": "name", - "in": "formData", - "required": false, - "type": "string" - }, - { - "name": "fileToUpload", - "in": "formData", - "required": false, - "type": "file" - } - ], - "responses": { - "200": { - "description": "OK" - } - } - } - }, - "/bugs/bug1827{?authorIds,authors[0].books[0].id,authors[0].books[0].name,authors[0].id,authors[0].name,id,name}": { - "get": { - "tags": [ - "Bugs" - ], - "summary": "addBook", - "operationId": "addBookUsingGET", - "parameters": [ - { - "name": "authorIds", - "in": "query", - "description": "authorIds", - "required": false, - "type": "array", - "items": { - "type": "string" - }, - "collectionFormat": "multi" - }, - { - "name": "authors[0].books[0].id", - "in": "query", - "required": false, - "type": "integer", - "format": "int64" - }, - { - "name": "authors[0].books[0].name", - "in": "query", - "required": false, - "type": "string" - }, - { - "name": "authors[0].id", - "in": "query", - "required": false, - "type": "integer", - "format": "int64" - }, - { - "name": "authors[0].name", - "in": "query", - "required": false, - "type": "string" - }, - { - "name": "id", - "in": "query", - "required": false, - "type": "integer", - "format": "int64" - }, - { - "name": "name", - "in": "query", - "required": false, - "type": "string" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "string" - } - } - } - } - }, - "/bugs/bug1944": { - "get": { - "tags": [ - "Bugs" - ], - "summary": "bug1944", - "operationId": "bug1944UsingGET", - "responses": { - "200": { - "description": "The object was deleted successfully." - }, - "404": { - "description": "No object was found with the given ID" - } - } - } - }, - "/bugs/bug2182": { - "get": { - "tags": [ - "Bugs" - ], - "summary": "/bug2182", - "operationId": "bug2182UsingGET", - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/ProductVO" - } - } - } - } - }, - "/bugs/bug2203": { - "get": { - "tags": [ - "Bugs" - ], - "summary": "bug2203", - "operationId": "bug2203UsingGET", - "produces": [ - "application/json;charset=UTF-8" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/Response«LanguageResponse»" - } - } - } - } - }, - "/bugs/bug2220": { - "get": { - "tags": [ - "Bugs" - ], - "summary": "bug2220", - "operationId": "bug2220UsingGET", - "parameters": [ - { - "name": "bar", - "in": "path", - "description": "bar", - "required": true, - "type": "string" - } - ], - "responses": { - "200": { - "description": "OK" - } - } - } - }, - "/bugs/bug2220/{bar}": { - "get": { - "tags": [ - "Bugs" - ], - "summary": "bug2220", - "operationId": "bug2220UsingGET_1", - "parameters": [ - { - "name": "bar", - "in": "path", - "description": "bar", - "required": true, - "type": "string" - } - ], - "responses": { - "200": { - "description": "OK" - } - } - } - }, - "/bugs/bug2230": { - "post": { - "tags": [ - "Bugs" - ], - "summary": "/bug2230", - "operationId": "bug2230UsingPOST", - "consumes": [ - "application/atom+xml" - ], - "parameters": [ - { - "in": "body", - "name": "applicatorUnits", - "description": "applicatorUnits", - "required": true, - "schema": { - "$ref": "#/definitions/EHDTOApplicatorUnits" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "string" - } - } - } - } - }, - "/bugs/bug2282": { - "get": { - "tags": [ - "Bugs" - ], - "summary": "/bug2282", - "operationId": "bug2282UsingGET", - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "string" - } - } - } - } - }, - "/bugs/bug2684": { - "get": { - "tags": [ - "Bugs" - ], - "summary": "Get test for response header", - "description": "Notes 'bout test", - "operationId": "responseHeader", - "produces": [ - "text/plain" - ], - "responses": { - "200": { - "description": "OK", - "headers": { - "X-Hello-Bis": { - "type": "string" - }, - "X-Hello": { - "type": "string" - } - }, - "schema": { - "type": "string" - } - } - } - } - }, - "/bugs/bug3087": { - "post": { - "tags": [ - "Bugs" - ], - "summary": "bug3087", - "operationId": "bug3087UsingPOST", - "consumes": [ - "application/json" - ], - "parameters": [ - { - "in": "body", - "name": "test", - "description": "test", - "required": true, - "schema": { - "$ref": "#/definitions/Bug3087" - } - } - ], - "responses": { - "200": { - "description": "OK" - } - } - } - }, - "/bugs/bug3353": { - "post": { - "tags": [ - "Bugs" - ], - "summary": "bug3353", - "operationId": "bug3353UsingPOST", - "consumes": [ - "application/x-www-form-urlencoded" - ], - "parameters": [ - { - "name": "orderNo", - "in": "formData", - "required": false, - "type": "string" - }, - { - "name": "agentCode", - "in": "formData", - "required": false, - "type": "string" - }, - { - "name": "sign", - "in": "formData", - "required": false, - "type": "string" - }, - { - "name": "timestamp", - "in": "formData", - "required": false, - "type": "number" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/WithdrawQueryRequestViewResponseView" - } - } - } - } - }, - "/bugs/bug3390{?range}": { - "get": { - "tags": [ - "Bugs" - ], - "summary": "bug3390", - "operationId": "bug3390UsingGET", - "parameters": [ - { - "name": "range", - "in": "query", - "required": false, - "type": "integer", - "maximum": 99, - "exclusiveMaximum": false, - "minimum": 1, - "exclusiveMinimum": false, - "format": "int32" - } - ], - "responses": { - "200": { - "description": "OK" - } - } - } - }, - "/bugs/{bar}/2148{?year}": { - "get": { - "tags": [ - "Bugs" - ], - "summary": "bug2148", - "operationId": "bug2148UsingGET", - "parameters": [ - { - "name": "bar", - "in": "path", - "description": "example", - "required": true, - "type": "integer", - "format": "int64" - }, - { - "name": "year", - "in": "query", - "description": "year", - "required": true, - "type": "integer", - "format": "int32" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/Example" - } - } - } - } - }, - "/bugs/{propertyKey}/{environmentKey}": { - "get": { - "tags": [ - "Bugs" - ], - "summary": "getProperty", - "operationId": "getPropertyUsingGET", - "parameters": [ - { - "name": "environmentKey", - "in": "path", - "description": "Key of the environment", - "required": true, - "type": "string" - }, - { - "name": "propertyKey", - "in": "path", - "description": "Key of the property", - "required": true, - "type": "string" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "string" - } - } - } - } - } - }, - "securityDefinitions": { - "api_key": { - "type": "apiKey", - "name": "api_key", - "in": "header" - }, - "petstore_auth": { - "type": "oauth2", - "authorizationUrl": "http://petstore.swagger.io/api/oauth/dialog", - "flow": "implicit", - "scopes": { - "write:pets": "modify pets in your account", - "read:pets": "read your pets" - } - } - }, - "definitions": { - "Bug1376": { - "type": "object", - "properties": { - "url": { - "type": "string" - } - }, - "title": "Bug1376" - }, - "Bug1627": { - "type": "object", - "properties": { - "name": { - "type": "string" - } - }, - "title": "Bug1627" - }, - "Bug1676": { - "type": "object", - "properties": { - "xAxis": { - "type": "number", - "format": "float", - "example": 200.0, - "description": "Horizontal position" - }, - "yAxis": { - "type": "number", - "format": "float", - "example": 500.0, - "description": "Vertical position" - } - }, - "title": "Bug1676" - }, - "Bug1697": { - "type": "object", - "properties": { - "bar": { - "type": "string" - } - }, - "title": "Bug1697" - }, - "Bug1740": { - "type": "object", - "properties": { - "innerValue": { - "type": "string" - }, - "value": { - "type": "string" - } - }, - "title": "Bug1740" - }, - "Bug1777": { - "type": "object", - "required": [ - "longitude" - ], - "properties": { - "longitude": { - "type": "number", - "format": "double", - "description": "经度" - } - }, - "title": "Bug1777", - "description": "Test 1777" - }, - "Bug1881": { - "type": "object", - "properties": { - "data1": { - "type": "object", - "additionalProperties": { - "type": "array", - "items": { - "type": "object" - } - } - }, - "data2": { - "type": "object", - "additionalProperties": { - "type": "array", - "items": { - "$ref": "#/definitions/Example" - } - } - } - }, - "title": "Bug1881" - }, - "Bug2415": { - "type": "object", - "properties": { - "test": { - "type": "string", - "minLength": 8, - "maxLength": 16, - "pattern": "^[A-Za-z0-9]{8,16}$" - } - }, - "title": "Bug2415" - }, - "Bug2479": { - "type": "object", - "properties": { - "first": { - "description": "First", - "$ref": "#/definitions/Example" - }, - "second": { - "description": "Second", - "$ref": "#/definitions/Example" - } - }, - "title": "Bug2479" - }, - "Bug3087": { - "type": "object", - "required": [ - "password", - "user" - ], - "properties": { - "password": { - "type": "string" - }, - "user": { - "type": "string" - } - }, - "title": "Bug3087" - }, - "EHDTOApplicatorUnits": { - "type": "object", - "properties": { - "ehdtoUnitGroups": { - "type": "array", - "xml": { - "name": "UnitGroup", - "attribute": false, - "wrapped": false - }, - "items": { - "$ref": "#/definitions/EHDTOUnitGroup" - } - } - }, - "title": "EHDTOApplicatorUnits", - "xml": { - "name": "ApplicatorUnits", - "attribute": false, - "wrapped": false - } - }, - "EHDTOUnit": { - "type": "object", - "properties": { - "id": { - "type": "string", - "xml": { - "name": "id", - "attribute": true, - "wrapped": false - } - }, - "name": { - "type": "string", - "xml": { - "name": "name", - "attribute": true, - "wrapped": false - } - }, - "unitSystem": { - "type": "string", - "xml": { - "name": "unitSystem", - "attribute": true, - "wrapped": false - } - } - }, - "title": "EHDTOUnit", - "xml": { - "name": "Unit", - "attribute": false, - "wrapped": false - } - }, - "EHDTOUnitGroup": { - "type": "object", - "properties": { - "ehdtoUnits": { - "type": "array", - "xml": { - "name": "unit", - "attribute": false, - "wrapped": false - }, - "items": { - "$ref": "#/definitions/EHDTOUnit" - } - }, - "name": { - "type": "string", - "xml": { - "name": "name", - "attribute": true, - "wrapped": false - } - } - }, - "title": "EHDTOUnitGroup", - "xml": { - "name": "UnitGroup", - "attribute": false, - "wrapped": false - } - }, - "EntityModel«string»": { - "type": "object", - "properties": { - "links": { - "$ref": "#/definitions/Links" - } - }, - "title": "EntityModel«string»" - }, - "ErrorResponse": { - "type": "object", - "required": [ - "invalidField" - ], - "properties": { - "invalidField": { - "type": "string", - "example": "address" - } - }, - "title": "ErrorResponse" - }, - "Example": { - "type": "object", - "properties": { - "allCapsSet": { - "type": "array", - "uniqueItems": true, - "items": { - "type": "string" - } - }, - "annotatedEnumType": { - "type": "string", - "enum": [ - "ONE", - "TWO" - ] - }, - "bar": { - "type": "integer", - "format": "int32", - "example": 10, - "description": "description of bar" - }, - "enumType": { - "type": "string", - "enum": [ - "ONE", - "TWO" - ] - }, - "foo": { - "type": "string" - }, - "localDateTime": { - "type": "string", - "format": "date-time" - }, - "nestedType": { - "$ref": "#/definitions/NestedType" - }, - "parentBeanProperty": { - "type": "string" - }, - "propertyWithNoGetterMethod": { - "type": "string" - }, - "propertyWithNoSetterMethod": { - "type": "string" - }, - "readOnlyString": { - "type": "string", - "description": "A read only string", - "readOnly": true - } - }, - "title": "Example" - }, - "File": { - "type": "object", - "properties": { - "name": { - "type": "string" - } - }, - "title": "File" - }, - "LangFilteredWrapper": { - "type": "object", - "properties": { - "lang": { - "type": "string", - "enum": [ - "en", - "zh" - ] - } - }, - "title": "LangFilteredWrapper" - }, - "LangNotFilteredWrapper": { - "type": "object", - "properties": { - "lang": { - "type": "string", - "enum": [ - "en", - "zh" - ] - } - }, - "title": "LangNotFilteredWrapper" - }, - "LanguageText": { - "type": "object", - "properties": { - "TEXT": { - "type": "string" - } - }, - "title": "LanguageText" - }, - "Links": { - "type": "object", - "properties": { - "empty": { - "type": "boolean" - } - }, - "title": "Links" - }, - "Model1819": { - "type": "object", - "properties": { - "enumTypes": { - "type": "array", - "items": { - "type": "string", - "enum": [ - "ONE", - "TWO" - ] - } - } - }, - "title": "Model1819" - }, - "Model1907": { - "type": "object", - "required": [ - "example", - "somename" - ], - "properties": { - "example": { - "xml": { - "name": "example", - "attribute": false, - "wrapped": false - }, - "$ref": "#/definitions/Example" - }, - "somename": { - "type": "string", - "xml": { - "name": "somename", - "attribute": true, - "wrapped": false - } - } - }, - "title": "Model1907", - "xml": { - "name": "model1907", - "namespace": "urn:bugs", - "attribute": false, - "wrapped": false - } - }, - "NestedType": { - "type": "object", - "properties": { - "name": { - "type": "string" - } - }, - "title": "NestedType" - }, - "Pet": { - "type": "object", - "properties": { - "age": { - "type": "integer", - "format": "int32" - }, - "id": { - "type": "string" - }, - "name": { - "type": "string" - } - }, - "title": "Pet" - }, - "ProductVO": { - "type": "object", - "properties": { - "name": { - "type": "string" - }, - "specification_child_name": { - "type": "string" - }, - "specification_name": { - "type": "string" - } - }, - "title": "ProductVO" - }, - "Response": { - "type": "object", - "required": [ - "data" - ], - "properties": { - "data": { - "type": "string", - "example": "some data" - } - }, - "title": "Response" - }, - "Response«LanguageResponse»": { - "type": "object", - "properties": { - "cancelled": { - "type": "boolean" - }, - "context": { - "type": "object" - }, - "done": { - "type": "boolean" - } - }, - "title": "Response«LanguageResponse»" - }, - "Status": { - "type": "object", - "required": [ - "bug_1964" - ], - "properties": { - "bug2469": { - "type": "string", - "example": "[test] n/a" - }, - "bug_1964": { - "type": "boolean" - }, - "enabled": { - "type": "boolean", - "example": false - }, - "integerString": { - "type": "string", - "example": "1235" - } - }, - "title": "Status" - }, - "UpperCasedField": { - "type": "object", - "properties": { - "YEAR": { - "type": "integer", - "format": "int32" - }, - "age": { - "type": "integer", - "format": "int32" - } - }, - "title": "UpperCasedField" - }, - "WithdrawQueryRequestViewResponseView": { - "type": "object", - "title": "WithdrawQueryRequestViewResponseView" - } - } -} \ No newline at end of file diff --git a/swagger-contract-tests/src/test/resources/contract/swagger2/declaration-business-service.json b/swagger-contract-tests/src/test/resources/contract/swagger2/declaration-business-service.json deleted file mode 100644 index 28f0b90be32..00000000000 --- a/swagger-contract-tests/src/test/resources/contract/swagger2/declaration-business-service.json +++ /dev/null @@ -1,315 +0,0 @@ -{ - "swagger": "2.0", - "info": { - "description": "Api Documentation", - "version": "1.0", - "title": "Api Documentation", - "termsOfService": "urn:tos", - "contact": { - - }, - "license": { - "name": "Apache 2.0", - "url": "http://www.apache.org/licenses/LICENSE-2.0" - } - }, - "host": "localhost:__PORT__", - "basePath": "/", - "tags": [ - { - "name": "business-service", - "description": "Services to demonstrate path variable resolution" - } - ], - "produces": [ - "application/json", - "application/xml" - ], - "paths": { - "/businesses/aliased/{otherId}": { - "get": { - "tags": [ - "business-service" - ], - "summary": "Find a business by its id", - "operationId": "findBusinessById", - "produces": [ - "*/*", - "application/json" - ], - "parameters": [ - { - "name": "otherId", - "in": "path", - "description": "ID of business", - "required": true, - "type": "string" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "string" - } - } - } - } - }, - "/businesses/byTypes": { - "get": { - "tags": [ - "business-service" - ], - "summary": "businessesByCategories", - "operationId": "businessesByCategoriesUsingGET", - "produces": [ - "application/json" - ], - "parameters": [ - { - "name": "types", - "in": "query", - "description": "types", - "required": true, - "type": "array", - "items": { - "type": "string", - "enum": [ - "PRODUCT", - "SERVICE" - ] - }, - "collectionFormat": "multi", - "enum": [ - "PRODUCT", - "SERVICE" - ] - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/Biz" - } - } - } - } - } - }, - "/businesses/demonstratesApiModelName": { - "post": { - "tags": [ - "business-service" - ], - "summary": "businessAsString", - "operationId": "businessAsStringUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "application/json" - ], - "responses": { - "200": { - "description": "Business", - "schema": { - "$ref": "#/definitions/Biz" - } - } - } - } - }, - "/businesses/non-aliased/{businessId}": { - "get": { - "tags": [ - "business-service" - ], - "summary": "Find a business by its id", - "operationId": "findBusinessById_1", - "produces": [ - "*/*", - "application/json" - ], - "parameters": [ - { - "name": "businessId", - "in": "path", - "description": "ID of business", - "required": true, - "type": "string" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "string" - } - } - }, - "security": [ - { - "oauth2": [ - "scope" - ] - } - ] - } - }, - "/businesses/responseEntity/{businessId}": { - "get": { - "tags": [ - "business-service" - ], - "summary": "getResponseEntity", - "operationId": "getResponseEntityUsingGET", - "produces": [ - "*/*", - "application/json" - ], - "parameters": [ - { - "name": "businessId", - "in": "path", - "description": "businessId", - "required": true, - "type": "string" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "string" - } - } - } - } - }, - "/businesses/typeEcho": { - "post": { - "tags": [ - "business-service" - ], - "summary": "businessTypeEcho", - "operationId": "businessTypeEchoUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "application/json" - ], - "parameters": [ - { - "in": "body", - "name": "business", - "description": "business", - "required": true, - "schema": { - "type": "string", - "enum": [ - "PRODUCT", - "SERVICE" - ] - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "string", - "enum": [ - "PRODUCT", - "SERVICE" - ] - } - } - } - } - }, - "/businesses/vanilla/{businessId}": { - "get": { - "tags": [ - "business-service" - ], - "summary": "getVanillaPathVariable", - "operationId": "getVanillaPathVariableUsingGET", - "produces": [ - "*/*", - "application/json" - ], - "parameters": [ - { - "name": "businessId", - "in": "path", - "description": "businessId", - "required": true, - "type": "string" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "string" - } - } - } - } - } - }, - "securityDefinitions": { - "api_key": { - "type": "apiKey", - "name": "api_key", - "in": "header" - }, - "petstore_auth": { - "type": "oauth2", - "authorizationUrl": "http://petstore.swagger.io/api/oauth/dialog", - "flow": "implicit", - "scopes": { - "write:pets": "modify pets in your account", - "read:pets": "read your pets" - } - } - }, - "definitions": { - "Biz": { - "type": "object", - "properties": { - "businessType": { - "type": "string", - "enum": [ - "PRODUCT", - "SERVICE" - ] - }, - "id": { - "type": "integer", - "format": "int32" - }, - "inception": { - "type": "string", - "format": "date" - }, - "name": { - "type": "string" - }, - "owner": { - "type": "string" - }, - "taxDate": { - "type": "string", - "format": "date-time" - } - }, - "title": "Biz" - } - } -} \ No newline at end of file diff --git a/swagger-contract-tests/src/test/resources/contract/swagger2/declaration-concrete-controller.json b/swagger-contract-tests/src/test/resources/contract/swagger2/declaration-concrete-controller.json deleted file mode 100644 index ccb6c771aed..00000000000 --- a/swagger-contract-tests/src/test/resources/contract/swagger2/declaration-concrete-controller.json +++ /dev/null @@ -1,246 +0,0 @@ -{ - "swagger": "2.0", - "info": { - "description": "Api Documentation", - "version": "1.0", - "title": "Api Documentation", - "termsOfService": "urn:tos", - "contact": { - - }, - "license": { - "name": "Apache 2.0", - "url": "http://www.apache.org/licenses/LICENSE-2.0" - } - }, - "host": "localhost:__PORT__", - "basePath": "/", - "tags": [ - { - "name": "concrete-controller", - "description": "Concrete Controller" - } - ], - "produces": [ - "application/json", - "application/xml" - ], - "paths": { - "/foo/create-t": { - "put": { - "tags": [ - "concrete-controller" - ], - "summary": "create", - "operationId": "createUsingPUT", - "consumes": [ - "application/json" - ], - "parameters": [ - { - "in": "body", - "name": "toCreate", - "description": "toCreate", - "required": true, - "schema": { - "$ref": "#/definitions/EntityModel«Pet»Req" - } - } - ], - "responses": { - "200": { - "description": "OK" - } - } - } - }, - "/foo/delete-t/{id}": { - "delete": { - "tags": [ - "concrete-controller" - ], - "summary": "delete", - "operationId": "deleteUsingDELETE", - "parameters": [ - { - "name": "id", - "in": "path", - "description": "id", - "required": true, - "type": "string" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/HttpEntity«EntityModel«Pet»»" - } - }, - "405": { - "description": "Invalid input" - } - } - } - }, - "/foo/get-t/{id}": { - "get": { - "tags": [ - "concrete-controller" - ], - "summary": "get", - "operationId": "getUsingGET", - "parameters": [ - { - "name": "id", - "in": "path", - "description": "id", - "required": true, - "type": "string" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/EntityModel«Pet»Res" - } - }, - "405": { - "description": "Invalid input" - } - } - } - } - }, - "securityDefinitions": { - "api_key": { - "type": "apiKey", - "name": "api_key", - "in": "header" - }, - "petstore_auth": { - "type": "oauth2", - "authorizationUrl": "http://petstore.swagger.io/api/oauth/dialog", - "flow": "implicit", - "scopes": { - "write:pets": "modify pets in your account", - "read:pets": "read your pets" - } - } - }, - "definitions": { - "EntityModel«Pet»Req": { - "type": "object", - "properties": { - "age": { - "type": "integer", - "format": "int32" - }, - "id": { - "type": "string" - }, - "links": { - "type": "array", - "items": { - "$ref": "#/definitions/Link" - } - }, - "name": { - "type": "string" - } - }, - "title": "EntityModel«Pet»Req" - }, - "EntityModel«Pet»Res": { - "type": "object", - "properties": { - "age": { - "type": "integer", - "format": "int32" - }, - "id": { - "type": "string" - }, - "links": { - "$ref": "#/definitions/Links" - }, - "name": { - "type": "string" - } - }, - "title": "EntityModel«Pet»Res" - }, - "HttpEntity«EntityModel«Pet»»": { - "type": "object", - "properties": { - "body": { - "$ref": "#/definitions/EntityModel«Pet»Res" - } - }, - "title": "HttpEntity«EntityModel«Pet»»" - }, - "Link": { - "type": "object", - "properties": { - "deprecation": { - "type": "string" - }, - "href": { - "type": "string" - }, - "hreflang": { - "type": "string" - }, - "media": { - "type": "string" - }, - "name": { - "type": "string" - }, - "profile": { - "type": "string" - }, - "rel": { - "$ref": "#/definitions/LinkRelation" - }, - "title": { - "type": "string" - }, - "type": { - "type": "string" - } - }, - "title": "Link" - }, - "LinkRelation": { - "type": "object", - "title": "LinkRelation" - }, - "Links": { - "type": "object", - "properties": { - "empty": { - "type": "boolean" - } - }, - "title": "Links" - }, - "Pet": { - "type": "object", - "properties": { - "age": { - "type": "integer", - "format": "int32" - }, - "id": { - "type": "string" - }, - "name": { - "type": "string" - } - }, - "title": "Pet" - } - } -} \ No newline at end of file diff --git a/swagger-contract-tests/src/test/resources/contract/swagger2/declaration-consumes-produces-not-on-document-context.json b/swagger-contract-tests/src/test/resources/contract/swagger2/declaration-consumes-produces-not-on-document-context.json deleted file mode 100644 index 65455f2281d..00000000000 --- a/swagger-contract-tests/src/test/resources/contract/swagger2/declaration-consumes-produces-not-on-document-context.json +++ /dev/null @@ -1,175 +0,0 @@ -{ - "swagger": "2.0", - "info": { - "description": "Api Documentation", - "version": "1.0", - "title": "Api Documentation", - "termsOfService": "urn:tos", - "contact": { - - }, - "license": { - "name": "Apache 2.0", - "url": "http://www.apache.org/licenses/LICENSE-2.0" - } - }, - "host": "localhost:__PORT__", - "basePath": "/", - "tags": [ - { - "name": "consumes-produces-service", - "description": "Services to demonstrate produces/consumes override behaviour on document and operation level" - } - ], - "paths": { - "/consumes-produces/with-operation-consumes": { - "post": { - "tags": [ - "consumes-produces-service" - ], - "summary": "Does have operation consumes defined", - "operationId": "withOperationConsumesUsingPOST", - "consumes": [ - "application/xml" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "test", - "description": "test", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "OK" - } - } - } - }, - "/consumes-produces/with-operation-consumes-produces": { - "post": { - "tags": [ - "consumes-produces-service" - ], - "summary": "Does have operation consumes and produces defined", - "operationId": "withOperationConsumesAndProducesUsingPOST", - "consumes": [ - "application/xml" - ], - "produces": [ - "application/xml" - ], - "parameters": [ - { - "in": "body", - "name": "test", - "description": "test", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "OK" - } - } - } - }, - "/consumes-produces/with-operation-produces": { - "get": { - "tags": [ - "consumes-produces-service" - ], - "summary": "Does have operation produces defined", - "operationId": "withOperationProducesUsingGET", - "produces": [ - "application/xml" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "string" - } - } - } - } - }, - "/consumes-produces/without-operation-consumes": { - "post": { - "tags": [ - "consumes-produces-service" - ], - "summary": "Does not have operation consumes defined", - "operationId": "withoutOperationConsumesUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "test", - "description": "test", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "OK" - } - } - } - }, - "/consumes-produces/without-operation-produces": { - "get": { - "tags": [ - "consumes-produces-service" - ], - "summary": "Does not have operation produces defined", - "operationId": "withoutOperationProducesUsingGET", - "produces": [ - "*/*" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "string" - } - } - } - } - } - }, - "securityDefinitions": { - "api_key": { - "type": "apiKey", - "name": "api_key", - "in": "header" - }, - "petstore_auth": { - "type": "oauth2", - "authorizationUrl": "http://petstore.swagger.io/api/oauth/dialog", - "flow": "implicit", - "scopes": { - "write:pets": "modify pets in your account", - "read:pets": "read your pets" - } - } - } -} \ No newline at end of file diff --git a/swagger-contract-tests/src/test/resources/contract/swagger2/declaration-consumes-produces-on-document-context.json b/swagger-contract-tests/src/test/resources/contract/swagger2/declaration-consumes-produces-on-document-context.json deleted file mode 100644 index 61cfd3bbf85..00000000000 --- a/swagger-contract-tests/src/test/resources/contract/swagger2/declaration-consumes-produces-on-document-context.json +++ /dev/null @@ -1,169 +0,0 @@ -{ - "swagger": "2.0", - "info": { - "description": "Api Documentation", - "version": "1.0", - "title": "Api Documentation", - "termsOfService": "urn:tos", - "contact": { - - }, - "license": { - "name": "Apache 2.0", - "url": "http://www.apache.org/licenses/LICENSE-2.0" - } - }, - "host": "localhost:__PORT__", - "basePath": "/", - "tags": [ - { - "name": "consumes-produces-service", - "description": "Services to demonstrate produces/consumes override behaviour on document and operation level" - } - ], - "consumes": [ - "text/plain" - ], - "produces": [ - "application/json" - ], - "paths": { - "/consumes-produces/with-operation-consumes": { - "post": { - "tags": [ - "consumes-produces-service" - ], - "summary": "Does have operation consumes defined", - "operationId": "withOperationConsumesUsingPOST_1", - "consumes": [ - "application/xml" - ], - "parameters": [ - { - "in": "body", - "name": "test", - "description": "test", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "OK" - } - } - } - }, - "/consumes-produces/with-operation-consumes-produces": { - "post": { - "tags": [ - "consumes-produces-service" - ], - "summary": "Does have operation consumes and produces defined", - "operationId": "withOperationConsumesAndProducesUsingPOST_1", - "consumes": [ - "application/xml" - ], - "produces": [ - "application/xml" - ], - "parameters": [ - { - "in": "body", - "name": "test", - "description": "test", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "OK" - } - } - } - }, - "/consumes-produces/with-operation-produces": { - "get": { - "tags": [ - "consumes-produces-service" - ], - "summary": "Does have operation produces defined", - "operationId": "withOperationProducesUsingGET_1", - "produces": [ - "application/xml" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "string" - } - } - } - } - }, - "/consumes-produces/without-operation-consumes": { - "post": { - "tags": [ - "consumes-produces-service" - ], - "summary": "Does not have operation consumes defined", - "operationId": "withoutOperationConsumesUsingPOST_1", - "parameters": [ - { - "in": "body", - "name": "test", - "description": "test", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "OK" - } - } - } - }, - "/consumes-produces/without-operation-produces": { - "get": { - "tags": [ - "consumes-produces-service" - ], - "summary": "Does not have operation produces defined", - "operationId": "withoutOperationProducesUsingGET_1", - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "string" - } - } - } - } - } - }, - "securityDefinitions": { - "api_key": { - "type": "apiKey", - "name": "api_key", - "in": "header" - }, - "petstore_auth": { - "type": "oauth2", - "authorizationUrl": "http://petstore.swagger.io/api/oauth/dialog", - "flow": "implicit", - "scopes": { - "write:pets": "modify pets in your account", - "read:pets": "read your pets" - } - } - } -} \ No newline at end of file diff --git a/swagger-contract-tests/src/test/resources/contract/swagger2/declaration-controller-with-no-request-mapping-service.json b/swagger-contract-tests/src/test/resources/contract/swagger2/declaration-controller-with-no-request-mapping-service.json deleted file mode 100644 index 427e3f6316c..00000000000 --- a/swagger-contract-tests/src/test/resources/contract/swagger2/declaration-controller-with-no-request-mapping-service.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "swagger": "2.0", - "info": { - "description": "Api Documentation", - "version": "1.0", - "title": "Api Documentation", - "termsOfService": "urn:tos", - "contact": { - - }, - "license": { - "name": "Apache 2.0", - "url": "http://www.apache.org/licenses/LICENSE-2.0" - } - }, - "host": "localhost:__PORT__", - "basePath": "/", - "produces": [ - "application/json", - "application/xml" - ], - "securityDefinitions": { - "api_key": { - "type": "apiKey", - "name": "api_key", - "in": "header" - }, - "petstore_auth": { - "type": "oauth2", - "authorizationUrl": "http://petstore.swagger.io/api/oauth/dialog", - "flow": "implicit", - "scopes": { - "write:pets": "modify pets in your account", - "read:pets": "read your pets" - } - } - } -} \ No newline at end of file diff --git a/swagger-contract-tests/src/test/resources/contract/swagger2/declaration-cyclic-controller.json b/swagger-contract-tests/src/test/resources/contract/swagger2/declaration-cyclic-controller.json deleted file mode 100644 index 0859a032731..00000000000 --- a/swagger-contract-tests/src/test/resources/contract/swagger2/declaration-cyclic-controller.json +++ /dev/null @@ -1,387 +0,0 @@ -{ - "swagger": "2.0", - "info": { - "description": "Api Documentation", - "version": "1.0", - "title": "Api Documentation", - "termsOfService": "urn:tos", - "contact": { - - }, - "license": { - "name": "Apache 2.0", - "url": "http://www.apache.org/licenses/LICENSE-2.0" - } - }, - "host": "localhost:__PORT__", - "basePath": "/", - "tags": [ - { - "name": "cyclic-structures-controller", - "description": "Cyclic Structures Controller" - } - ], - "produces": [ - "application/json", - "application/xml" - ], - "paths": { - "/cyclic-structures/create-city": { - "put": { - "tags": [ - "cyclic-structures-controller" - ], - "summary": "createCyclicCity", - "operationId": "createCyclicCityUsingPUT", - "consumes": [ - "application/json" - ], - "parameters": [ - { - "in": "body", - "name": "city", - "description": "city", - "required": true, - "schema": { - "$ref": "#/definitions/CityReq" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/DistrictRes" - } - } - } - } - } - }, - "/cyclic-structures/create-country": { - "put": { - "tags": [ - "cyclic-structures-controller" - ], - "summary": "createCyclicCountry", - "operationId": "createCyclicCountryUsingPUT", - "consumes": [ - "application/json" - ], - "parameters": [ - { - "in": "body", - "name": "country", - "description": "country", - "required": true, - "schema": { - "$ref": "#/definitions/CountryReq" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/RegionRes" - } - } - }, - "405": { - "description": "Invalid input" - } - } - } - }, - "/cyclic-structures/create-street": { - "put": { - "tags": [ - "cyclic-structures-controller" - ], - "summary": "createCyclicStreet", - "operationId": "createCyclicStreetUsingPUT", - "consumes": [ - "application/json" - ], - "parameters": [ - { - "in": "body", - "name": "street", - "description": "street", - "required": true, - "schema": { - "$ref": "#/definitions/StreetReq" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/HouseRes" - } - } - } - } - } - } - }, - "securityDefinitions": { - "api_key": { - "type": "apiKey", - "name": "api_key", - "in": "header" - }, - "petstore_auth": { - "type": "oauth2", - "authorizationUrl": "http://petstore.swagger.io/api/oauth/dialog", - "flow": "implicit", - "scopes": { - "write:pets": "modify pets in your account", - "read:pets": "read your pets" - } - } - }, - "definitions": { - "CityReq": { - "type": "object", - "properties": { - "country": { - "$ref": "#/definitions/CountryReq" - }, - "districts": { - "type": "array", - "items": { - "$ref": "#/definitions/DistrictReq" - } - }, - "region": { - "$ref": "#/definitions/RegionReq" - } - }, - "title": "CityReq" - }, - "CityRes": { - "type": "object", - "properties": { - "country": { - "$ref": "#/definitions/CountryRes" - }, - "districts": { - "type": "array", - "items": { - "$ref": "#/definitions/DistrictRes" - } - }, - "region": { - "$ref": "#/definitions/RegionRes" - } - }, - "title": "CityRes" - }, - "CountryReq": { - "type": "object", - "properties": { - "regions": { - "type": "array", - "items": { - "$ref": "#/definitions/RegionReq" - } - } - }, - "title": "CountryReq" - }, - "CountryRes": { - "type": "object", - "properties": { - "populatuion": { - "type": "integer", - "format": "int64" - }, - "regions": { - "type": "array", - "items": { - "$ref": "#/definitions/RegionRes" - } - } - }, - "title": "CountryRes" - }, - "DistrictReq": { - "type": "object", - "properties": { - "city": { - "$ref": "#/definitions/CityReq" - }, - "country": { - "$ref": "#/definitions/CountryReq" - }, - "region": { - "$ref": "#/definitions/RegionReq" - }, - "streets": { - "type": "array", - "items": { - "$ref": "#/definitions/StreetReq" - } - } - }, - "title": "DistrictReq" - }, - "DistrictRes": { - "type": "object", - "properties": { - "city": { - "$ref": "#/definitions/CityRes" - }, - "country": { - "$ref": "#/definitions/CountryRes" - }, - "region": { - "$ref": "#/definitions/RegionRes" - }, - "streets": { - "type": "array", - "items": { - "$ref": "#/definitions/StreetRes" - } - } - }, - "title": "DistrictRes" - }, - "HouseReq": { - "type": "object", - "properties": { - "city": { - "$ref": "#/definitions/CityReq" - }, - "country": { - "$ref": "#/definitions/CountryReq" - }, - "district": { - "$ref": "#/definitions/DistrictReq" - }, - "number": { - "type": "integer", - "format": "int32" - }, - "region": { - "$ref": "#/definitions/RegionReq" - }, - "street": { - "$ref": "#/definitions/StreetReq" - } - }, - "title": "HouseReq" - }, - "HouseRes": { - "type": "object", - "properties": { - "city": { - "$ref": "#/definitions/CityRes" - }, - "country": { - "$ref": "#/definitions/CountryRes" - }, - "district": { - "$ref": "#/definitions/DistrictRes" - }, - "number": { - "type": "integer", - "format": "int32" - }, - "region": { - "$ref": "#/definitions/RegionRes" - }, - "street": { - "$ref": "#/definitions/StreetRes" - } - }, - "title": "HouseRes" - }, - "RegionReq": { - "type": "object", - "properties": { - "cities": { - "type": "array", - "items": { - "$ref": "#/definitions/CityReq" - } - }, - "country": { - "$ref": "#/definitions/CountryReq" - } - }, - "title": "RegionReq" - }, - "RegionRes": { - "type": "object", - "properties": { - "cities": { - "type": "array", - "items": { - "$ref": "#/definitions/CityRes" - } - }, - "country": { - "$ref": "#/definitions/CountryRes" - } - }, - "title": "RegionRes" - }, - "StreetReq": { - "type": "object", - "properties": { - "city": { - "$ref": "#/definitions/CityReq" - }, - "country": { - "$ref": "#/definitions/CountryReq" - }, - "district": { - "$ref": "#/definitions/DistrictReq" - }, - "houses": { - "type": "array", - "items": { - "$ref": "#/definitions/HouseReq" - } - }, - "region": { - "$ref": "#/definitions/RegionReq" - } - }, - "title": "StreetReq" - }, - "StreetRes": { - "type": "object", - "properties": { - "city": { - "$ref": "#/definitions/CityRes" - }, - "country": { - "$ref": "#/definitions/CountryRes" - }, - "district": { - "$ref": "#/definitions/DistrictRes" - }, - "houses": { - "type": "array", - "items": { - "$ref": "#/definitions/HouseRes" - } - }, - "region": { - "$ref": "#/definitions/RegionRes" - } - }, - "title": "StreetRes" - } - } -} \ No newline at end of file diff --git a/swagger-contract-tests/src/test/resources/contract/swagger2/declaration-different-group.json b/swagger-contract-tests/src/test/resources/contract/swagger2/declaration-different-group.json deleted file mode 100644 index f949c5f40a7..00000000000 --- a/swagger-contract-tests/src/test/resources/contract/swagger2/declaration-different-group.json +++ /dev/null @@ -1,53 +0,0 @@ -{ - "swagger": "2.0", - "info": { - "description": "Api Documentation", - "version": "1.0", - "title": "Api Documentation", - "termsOfService": "urn:tos", - "contact": { - - }, - "license": { - "name": "Apache 2.0", - "url": "http://www.apache.org/licenses/LICENSE-2.0" - } - }, - "host": "localhost:__PORT__", - "basePath": "/", - "tags": [ - { - "name": "Different", - "description": "Different Group" - } - ], - "produces": [ - "application/json", - "application/xml" - ], - "paths": { - "/different/2219": { - "get": { - "description": "This is a test method", - "operationId": "bug2219GET_6", - "parameters": [ - { - "name": "description", - "in": "query", - "description": "description of bug 2219", - "required": true, - "type": "string" - } - ], - "responses": { - "200": { - "description": "Successfully received bug 1767 or 2219 response", - "schema": { - "type": "string" - } - } - } - } - } - } -} \ No newline at end of file diff --git a/swagger-contract-tests/src/test/resources/contract/swagger2/declaration-enum-service.json b/swagger-contract-tests/src/test/resources/contract/swagger2/declaration-enum-service.json deleted file mode 100644 index 49ef2efeea0..00000000000 --- a/swagger-contract-tests/src/test/resources/contract/swagger2/declaration-enum-service.json +++ /dev/null @@ -1,128 +0,0 @@ -{ - "swagger": "2.0", - "info": { - "description": "Api Documentation", - "version": "1.0", - "title": "Api Documentation", - "termsOfService": "urn:tos", - "contact": { - - }, - "license": { - "name": "Apache 2.0", - "url": "http://www.apache.org/licenses/LICENSE-2.0" - } - }, - "host": "localhost:__PORT__", - "basePath": "/", - "tags": [ - { - "name": "enum-service", - "description": "Service that return enums" - } - ], - "produces": [ - "application/json", - "application/xml" - ], - "paths": { - "/enums/collection": { - "get": { - "tags": [ - "enum-service" - ], - "summary": "Example with response entity collection", - "operationId": "getResponseEntityCollectionUsingGET", - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "array", - "uniqueItems": true, - "items": { - "type": "string", - "enum": [ - "ONE", - "TWO" - ] - } - } - } - } - } - }, - "/enums/entity": { - "get": { - "tags": [ - "enum-service" - ], - "summary": "Example with response entity single value", - "operationId": "getResponseEntityValueUsingGET", - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "string", - "enum": [ - "ONE", - "TWO" - ] - } - } - } - } - }, - "/enums/wrapped": { - "get": { - "tags": [ - "enum-service" - ], - "summary": "Example with wrapped enum collection", - "operationId": "getCollectionValueUsingGET", - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/EnumCollection" - } - } - } - } - } - }, - "securityDefinitions": { - "api_key": { - "type": "apiKey", - "name": "api_key", - "in": "header" - }, - "petstore_auth": { - "type": "oauth2", - "authorizationUrl": "http://petstore.swagger.io/api/oauth/dialog", - "flow": "implicit", - "scopes": { - "write:pets": "modify pets in your account", - "read:pets": "read your pets" - } - } - }, - "definitions": { - "EnumCollection": { - "type": "object", - "properties": { - "types": { - "type": "array", - "uniqueItems": true, - "items": { - "type": "string", - "enum": [ - "ONE", - "TWO" - ] - } - } - }, - "title": "EnumCollection" - } - } -} \ No newline at end of file diff --git a/swagger-contract-tests/src/test/resources/contract/swagger2/declaration-fancy-pet-service.json b/swagger-contract-tests/src/test/resources/contract/swagger2/declaration-fancy-pet-service.json deleted file mode 100644 index c40369af2b4..00000000000 --- a/swagger-contract-tests/src/test/resources/contract/swagger2/declaration-fancy-pet-service.json +++ /dev/null @@ -1,119 +0,0 @@ -{ - "swagger": "2.0", - "info": { - "description": "Api Documentation", - "version": "1.0", - "title": "Api Documentation", - "termsOfService": "urn:tos", - "contact": { - - }, - "license": { - "name": "Apache 2.0", - "url": "http://www.apache.org/licenses/LICENSE-2.0" - } - }, - "host": "localhost:__PORT__", - "basePath": "/", - "tags": [ - { - "name": "fancy-pet-service", - "description": "Operations about fancy pets" - } - ], - "produces": [ - "application/json", - "application/xml" - ], - "paths": { - "/fancypets/?{someId}": { - "post": { - "tags": [ - "fancy-pet-service" - ], - "summary": "createObject", - "operationId": "createObjectUsingPOST", - "consumes": [ - "application/json" - ], - "parameters": [ - { - "in": "body", - "name": "object", - "description": "object", - "required": true, - "schema": { - "$ref": "#/definitions/FancyPet" - } - }, - { - "name": "someId", - "in": "path", - "description": "someId", - "required": true, - "type": "integer", - "format": "int32" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "integer", - "format": "int32" - } - } - } - } - } - }, - "securityDefinitions": { - "api_key": { - "type": "apiKey", - "name": "api_key", - "in": "header" - }, - "petstore_auth": { - "type": "oauth2", - "authorizationUrl": "http://petstore.swagger.io/api/oauth/dialog", - "flow": "implicit", - "scopes": { - "write:pets": "modify pets in your account", - "read:pets": "read your pets" - } - } - }, - "definitions": { - "Category": { - "type": "object", - "properties": { - "name": { - "type": "string" - } - }, - "title": "Category" - }, - "FancyPet": { - "type": "object", - "properties": { - "age": { - "type": "integer", - "format": "int32" - }, - "categories": { - "type": "array", - "items": { - "$ref": "#/definitions/Category" - } - }, - "id": { - "type": "string" - }, - "name": { - "type": "string" - } - }, - "title": "FancyPet" - } - } -} \ No newline at end of file diff --git a/swagger-contract-tests/src/test/resources/contract/swagger2/declaration-feature-demonstration-service-codeGen.json b/swagger-contract-tests/src/test/resources/contract/swagger2/declaration-feature-demonstration-service-codeGen.json deleted file mode 100644 index 38f6c3f8054..00000000000 --- a/swagger-contract-tests/src/test/resources/contract/swagger2/declaration-feature-demonstration-service-codeGen.json +++ /dev/null @@ -1,1486 +0,0 @@ -{ - "swagger": "2.0", - "info": { - "description": "Api Documentation", - "version": "1.0", - "title": "Api Documentation", - "termsOfService": "urn:tos", - "contact": { - - }, - "license": { - "name": "Apache 2.0", - "url": "http://www.apache.org/licenses/LICENSE-2.0" - } - }, - "host": "localhost:__PORT__", - "basePath": "/", - "tags": [ - { - "name": "feature-demonstration-service", - "description": "Demonstration of features" - } - ], - "produces": [ - "application/json", - "application/xml" - ], - "paths": { - "/features/1367/{itemId}": { - "get": { - "tags": [ - "feature-demonstration-service" - ], - "summary": "findById", - "operationId": "findByIdUsingGET_1", - "produces": [ - "application/vnd.com.fancy-pet+json", - "application/vnd.com.pet+json" - ], - "parameters": [ - { - "name": "itemId", - "in": "path", - "description": "itemId", - "required": true, - "type": "string" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/FancyPet" - } - } - } - } - }, - "/features/1430-body": { - "post": { - "tags": [ - "feature-demonstration-service" - ], - "summary": "base64EncodedBody", - "operationId": "base64EncodedBodyUsingPOST_1", - "consumes": [ - "application/json" - ], - "parameters": [ - { - "in": "body", - "name": "base64Encoded", - "description": "base64Encoded", - "required": true, - "schema": { - "type": "string", - "format": "byte" - } - } - ], - "responses": { - "200": { - "description": "OK" - } - } - } - }, - "/features/1430-query": { - "post": { - "tags": [ - "feature-demonstration-service" - ], - "summary": "proper", - "operationId": "properUsingPOST_1", - "consumes": [ - "application/json" - ], - "parameters": [ - { - "name": "base64Encoded", - "in": "query", - "description": "base64Encoded", - "required": true, - "type": "string", - "format": "byte" - } - ], - "responses": { - "200": { - "description": "OK" - } - } - } - }, - "/features/1490/entity/{itemId}": { - "get": { - "tags": [ - "feature-demonstration-service" - ], - "summary": "serializablePetEntity", - "operationId": "serializablePetEntityUsingGET_1", - "parameters": [ - { - "name": "itemId", - "in": "path", - "description": "itemId", - "required": true, - "type": "string" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/PetWithSerializer" - } - } - } - } - }, - "/features/1490/{itemId}": { - "get": { - "tags": [ - "feature-demonstration-service" - ], - "summary": "serializablePet", - "operationId": "serializablePetUsingGET_1", - "parameters": [ - { - "name": "itemId", - "in": "path", - "description": "itemId", - "required": true, - "type": "string" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/PetWithSerializer" - } - } - } - }, - "put": { - "tags": [ - "feature-demonstration-service" - ], - "summary": "updateSerializablePet", - "operationId": "updateSerializablePetUsingPUT_1", - "consumes": [ - "application/json" - ], - "parameters": [ - { - "name": "itemId", - "in": "path", - "description": "itemId", - "required": true, - "type": "string" - }, - { - "in": "body", - "name": "pet", - "description": "pet", - "required": true, - "schema": { - "$ref": "#/definitions/PetWithSerializer" - } - } - ], - "responses": { - "200": { - "description": "OK" - } - } - } - }, - "/features/1570": { - "post": { - "tags": [ - "feature-demonstration-service" - ], - "summary": "Demo using examples", - "operationId": "saveUserUsingPOST_1", - "consumes": [ - "application/json" - ], - "responses": { - "200": { - "description": "OK" - }, - "404": { - "description": "User not found" - }, - "405": { - "description": "Validation exception", - "examples": { - "Example json": "{'invalidField': 'address'}", - "Example string": "The first name was invalid" - } - } - } - } - }, - "/features/2031": { - "post": { - "tags": [ - "feature-demonstration-service" - ], - "summary": "/2031", - "operationId": "saveUsingPOST_1", - "consumes": [ - "application/json" - ], - "parameters": [ - { - "in": "body", - "name": "contents", - "description": "contents", - "required": true, - "schema": { - "$ref": "#/definitions/CustomTypeFor2031" - }, - "x-examples": { - "application/json": "{'property': 'test'}" - } - }, - { - "name": "id", - "in": "path", - "description": "id", - "required": true, - "type": "string" - }, - { - "name": "keyId", - "in": "path", - "description": "keyId", - "required": true, - "type": "string" - } - ], - "responses": { - "200": { - "description": "OK" - } - } - } - }, - "/features/2831": { - "get": { - "tags": [ - "feature-demonstration-service" - ], - "summary": "Demo", - "description": "Demo optional header error", - "operationId": "feature2831UsingGET_1", - "parameters": [ - { - "name": "foo", - "in": "header", - "description": "foo msg", - "required": true, - "type": "string", - "x-example": "foo example" - } - ], - "responses": { - "200": { - "description": "okey", - "schema": { - "type": "object" - } - }, - "403": { - "description": "ko" - }, - "404": { - "description": "ko" - } - } - } - }, - "/features/3311": { - "post": { - "tags": [ - "feature-demonstration-service" - ], - "summary": "feature3311", - "operationId": "feature3311UsingPOST_1", - "consumes": [ - "multipart/form-data" - ], - "produces": [ - "application/json" - ], - "parameters": [ - { - "name": "attachments", - "in": "formData", - "required": false, - "type": "array", - "items": { - "type": "file" - }, - "collectionFormat": "multi" - } - ], - "responses": { - "200": { - "description": "OK" - } - } - } - }, - "/features/addFiles": { - "post": { - "tags": [ - "feature-demonstration-service" - ], - "summary": "Add a new contact with file attachment", - "operationId": "addFilesUsingPOST_1", - "consumes": [ - "application/json" - ], - "parameters": [ - { - "name": "files", - "in": "formData", - "required": false, - "type": "array", - "items": { - "type": "file" - }, - "collectionFormat": "multi" - } - ], - "responses": { - "200": { - "description": "OK" - } - } - } - }, - "/features/allMethodsAllowed": { - "get": { - "tags": [ - "feature-demonstration-service" - ], - "summary": "allMethodAllowed", - "operationId": "allMethodAllowedUsingGET_1", - "responses": { - "200": { - "description": "OK" - } - } - }, - "head": { - "tags": [ - "feature-demonstration-service" - ], - "summary": "allMethodAllowed", - "operationId": "allMethodAllowedUsingHEAD_1", - "consumes": [ - "application/json" - ], - "responses": { - "200": { - "description": "OK" - } - } - }, - "post": { - "tags": [ - "feature-demonstration-service" - ], - "summary": "allMethodAllowed", - "operationId": "allMethodAllowedUsingPOST_1", - "consumes": [ - "application/json" - ], - "responses": { - "200": { - "description": "OK" - } - } - }, - "put": { - "tags": [ - "feature-demonstration-service" - ], - "summary": "allMethodAllowed", - "operationId": "allMethodAllowedUsingPUT_1", - "consumes": [ - "application/json" - ], - "responses": { - "200": { - "description": "OK" - } - } - }, - "delete": { - "tags": [ - "feature-demonstration-service" - ], - "summary": "allMethodAllowed", - "operationId": "allMethodAllowedUsingDELETE_1", - "responses": { - "200": { - "description": "OK" - } - } - }, - "options": { - "tags": [ - "feature-demonstration-service" - ], - "summary": "allMethodAllowed", - "operationId": "allMethodAllowedUsingOPTIONS_1", - "consumes": [ - "application/json" - ], - "responses": { - "200": { - "description": "OK" - } - } - }, - "patch": { - "tags": [ - "feature-demonstration-service" - ], - "summary": "allMethodAllowed", - "operationId": "allMethodAllowedUsingPATCH_1", - "consumes": [ - "application/json" - ], - "responses": { - "200": { - "description": "OK" - } - } - } - }, - "/features/arrayOfArrays": { - "post": { - "tags": [ - "feature-demonstration-service" - ], - "summary": "arrayOfArrays", - "operationId": "arrayOfArraysUsingPOST_1", - "consumes": [ - "application/json" - ], - "parameters": [ - { - "in": "body", - "name": "arrayOfEnums", - "description": "arrayOfEnums", - "required": true, - "schema": { - "type": "array", - "items": { - "type": "array", - "items": { - "type": "string", - "enum": [ - "PRODUCT", - "SERVICE" - ] - } - } - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "array", - "items": { - "type": "array", - "items": { - "type": "integer", - "format": "int32" - } - } - } - } - } - } - }, - "/features/bare": { - "post": { - "tags": [ - "feature-demonstration-service" - ], - "summary": "getBare", - "operationId": "getBareUsingPOST_1", - "consumes": [ - "application/json" - ], - "parameters": [ - { - "name": "allCapsSet", - "in": "query", - "description": "description of allCapsSet", - "required": false, - "type": "array", - "items": { - "type": "string" - }, - "collectionFormat": "multi" - }, - { - "name": "annotatedEnumType", - "in": "query", - "description": "description of annotatedEnumType", - "required": false, - "type": "string", - "enum": [ - "ONE", - "TWO" - ] - }, - { - "name": "bar", - "in": "query", - "description": "description of bar", - "required": false, - "type": "integer", - "format": "int32", - "x-example": 10 - }, - { - "name": "enumType", - "in": "query", - "required": false, - "type": "string", - "enum": [ - "ONE", - "TWO" - ] - }, - { - "name": "foo", - "in": "query", - "description": "description of foo", - "required": true, - "type": "string", - "enum": [ - "chu", - "man" - ] - }, - { - "name": "localDateTime", - "in": "query", - "description": "local date time desc dd-MM-yyyy hh:mm:ss", - "required": true, - "type": "string", - "format": "date-time" - }, - { - "name": "nestedType.name", - "in": "query", - "required": false, - "type": "string" - }, - { - "name": "parentBeanProperty", - "in": "query", - "required": false, - "type": "string" - }, - { - "name": "propertyWithNoSetterMethod", - "in": "query", - "required": false, - "type": "string" - }, - { - "name": "readOnlyString", - "in": "query", - "description": "A read only string", - "required": false, - "type": "string" - } - ], - "responses": { - "200": { - "description": "OK" - } - } - } - }, - "/features/bigDecimal": { - "post": { - "tags": [ - "feature-demonstration-service" - ], - "summary": "updateBigDecimal", - "operationId": "updateBigDecimalUsingPOST_1", - "consumes": [ - "application/json" - ], - "parameters": [ - { - "name": "input", - "in": "query", - "description": "input", - "required": false, - "type": "number" - } - ], - "responses": { - "200": { - "description": "OK" - } - } - } - }, - "/features/boolean": { - "post": { - "tags": [ - "feature-demonstration-service" - ], - "summary": "updateBoolean", - "operationId": "updateBooleanUsingPOST_1", - "consumes": [ - "application/json" - ], - "parameters": [ - { - "name": "input", - "in": "query", - "description": "input", - "required": false, - "type": "boolean" - } - ], - "responses": { - "200": { - "description": "OK" - } - } - } - }, - "/features/date": { - "post": { - "tags": [ - "feature-demonstration-service" - ], - "summary": "updateDate", - "operationId": "updateDateUsingPOST_1", - "consumes": [ - "application/json" - ], - "parameters": [ - { - "name": "localDate", - "in": "query", - "description": "localDate", - "required": false, - "type": "string", - "format": "date" - } - ], - "responses": { - "200": { - "description": "OK" - } - } - } - }, - "/features/effective": { - "get": { - "tags": [ - "feature-demonstration-service" - ], - "summary": "getEffective", - "operationId": "getEffectiveUsingGET_1", - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/Example" - } - } - } - } - }, - "/features/effectives": { - "get": { - "tags": [ - "feature-demonstration-service" - ], - "summary": "getEffectives", - "operationId": "getEffectivesUsingGET_1", - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/Example" - } - } - } - } - } - }, - "/features/enumObject": { - "get": { - "tags": [ - "feature-demonstration-service" - ], - "summary": "getEnumAsObject", - "operationId": "getEnumAsObjectUsingGET_1", - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/EnumObjectType" - } - } - } - } - }, - "/features/examples": { - "put": { - "tags": [ - "feature-demonstration-service" - ], - "summary": "updateListOfExamples", - "operationId": "updateListOfExamplesUsingPUT_1", - "consumes": [ - "application/json" - ], - "parameters": [ - { - "name": "exampleList[0].allCapsSet", - "in": "query", - "description": "description of allCapsSet", - "required": false, - "type": "array", - "items": { - "type": "string" - }, - "collectionFormat": "multi" - }, - { - "name": "exampleList[0].annotatedEnumType", - "in": "query", - "description": "description of annotatedEnumType", - "required": false, - "type": "string", - "enum": [ - "ONE", - "TWO" - ] - }, - { - "name": "exampleList[0].bar", - "in": "query", - "description": "description of bar", - "required": false, - "type": "integer", - "format": "int32", - "x-example": 10 - }, - { - "name": "exampleList[0].enumType", - "in": "query", - "required": false, - "type": "string", - "enum": [ - "ONE", - "TWO" - ] - }, - { - "name": "exampleList[0].foo", - "in": "query", - "description": "description of foo", - "required": true, - "type": "string", - "enum": [ - "chu", - "man" - ] - }, - { - "name": "exampleList[0].localDateTime", - "in": "query", - "description": "local date time desc dd-MM-yyyy hh:mm:ss", - "required": true, - "type": "string", - "format": "date-time" - }, - { - "name": "exampleList[0].nestedType.name", - "in": "query", - "required": false, - "type": "string" - }, - { - "name": "exampleList[0].parentBeanProperty", - "in": "query", - "required": false, - "type": "string" - }, - { - "name": "exampleList[0].propertyWithNoSetterMethod", - "in": "query", - "required": false, - "type": "string" - }, - { - "name": "exampleList[0].readOnlyString", - "in": "query", - "description": "A read only string", - "required": false, - "type": "string" - } - ], - "responses": { - "200": { - "description": "OK" - } - } - } - }, - "/features/inheritance": { - "get": { - "tags": [ - "feature-demonstration-service" - ], - "summary": "findVehicles", - "operationId": "findVehiclesUsingGET_1", - "parameters": [ - { - "name": "type", - "in": "query", - "description": "type", - "required": true, - "type": "string" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/Vehicle" - } - } - } - } - } - }, - "/features/integers": { - "put": { - "tags": [ - "feature-demonstration-service" - ], - "summary": "updateListOfIntegers", - "operationId": "updateListOfIntegersUsingPUT_1", - "consumes": [ - "application/json" - ], - "parameters": [ - { - "name": "integers", - "in": "query", - "description": "integers", - "required": false, - "type": "array", - "items": { - "type": "integer", - "format": "int32" - }, - "collectionFormat": "multi" - } - ], - "responses": { - "200": { - "description": "OK" - } - } - } - }, - "/features/listOfMaps": { - "get": { - "tags": [ - "feature-demonstration-service" - ], - "summary": "listOfMaps", - "operationId": "listOfMapsUsingGET_1", - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "array", - "items": { - "type": "object", - "additionalProperties": { - "type": "string" - } - } - } - } - } - } - }, - "/features/mapOfMapOfExample": { - "get": { - "tags": [ - "feature-demonstration-service" - ], - "summary": "mapOfMapOfExample", - "operationId": "mapOfMapOfExampleUsingGET_1", - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "object", - "additionalProperties": { - "type": "object", - "additionalProperties": { - "$ref": "#/definitions/Example" - } - } - } - } - } - } - }, - "/features/mapProperty": { - "get": { - "tags": [ - "feature-demonstration-service" - ], - "summary": "modelWithMapProperty", - "operationId": "modelWithMapPropertyUsingGET_1", - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/ModelWithMapProperty" - } - } - } - } - }, - "/features/modelAttributes": { - "get": { - "tags": [ - "feature-demonstration-service" - ], - "summary": "getModelAttribute", - "operationId": "getModelAttributeUsingGET_1", - "parameters": [ - { - "name": "accountTypes", - "in": "query", - "required": false, - "type": "array", - "items": { - "type": "string", - "enum": [ - "BANK", - "CASH" - ] - }, - "collectionFormat": "multi", - "enum": [ - "BANK", - "CASH" - ] - }, - { - "name": "arrayProp", - "in": "query", - "required": false, - "type": "array", - "items": { - "type": "integer", - "format": "int32" - }, - "collectionFormat": "multi" - }, - { - "name": "complexProp.name", - "in": "query", - "required": false, - "type": "string" - }, - { - "name": "intProp", - "in": "query", - "required": false, - "type": "integer", - "format": "int32" - }, - { - "name": "listProp", - "in": "query", - "required": false, - "type": "array", - "items": { - "type": "string" - }, - "collectionFormat": "multi" - }, - { - "name": "stringProp", - "in": "query", - "required": false, - "type": "string" - } - ], - "responses": { - "200": { - "description": "OK" - } - } - } - }, - "/features/propertyWithArrayOfArrays": { - "post": { - "tags": [ - "feature-demonstration-service" - ], - "summary": "propertyWithArrayOfArrays", - "operationId": "propertyWithArrayOfArraysUsingPOST_1", - "consumes": [ - "application/json" - ], - "parameters": [ - { - "in": "body", - "name": "model", - "description": "model", - "required": true, - "schema": { - "$ref": "#/definitions/ModelWithArrayOfArrays" - } - } - ], - "responses": { - "200": { - "description": "OK" - } - } - } - }, - "/features/propertyWithObjectNode": { - "post": { - "tags": [ - "feature-demonstration-service" - ], - "summary": "propertyWithObjectNode", - "operationId": "propertyWithObjectNodeUsingPOST_1", - "consumes": [ - "application/json" - ], - "parameters": [ - { - "in": "body", - "name": "model", - "description": "model", - "required": true, - "schema": { - "$ref": "#/definitions/ModelWithObjectNode" - } - } - ], - "responses": { - "200": { - "description": "OK" - } - } - } - }, - "/features/status": { - "post": { - "tags": [ - "feature-demonstration-service" - ], - "summary": "updateBaz", - "operationId": "updateBazUsingPOST_1", - "consumes": [ - "application/json" - ], - "parameters": [ - { - "name": "enumType", - "in": "query", - "description": "enumType", - "required": false, - "type": "string", - "enum": [ - "ONE", - "TWO" - ] - } - ], - "responses": { - "200": { - "description": "OK" - } - } - } - }, - "/features/statuses": { - "post": { - "tags": [ - "feature-demonstration-service" - ], - "summary": "updateBazes", - "operationId": "updateBazesUsingPOST_1", - "consumes": [ - "application/json" - ], - "parameters": [ - { - "name": "enumType", - "in": "query", - "description": "enumType", - "required": false, - "type": "array", - "items": { - "type": "string", - "enum": [ - "ONE", - "TWO" - ] - }, - "collectionFormat": "multi", - "enum": [ - "ONE", - "TWO" - ] - } - ], - "responses": { - "200": { - "description": "OK" - } - } - } - }, - "/features/{petId}": { - "get": { - "tags": [ - "feature-demonstration-service" - ], - "summary": "Find pet by ID", - "description": "Returns a pet when ID < 10. ID > 10 or non-integers will simulate API error conditions", - "operationId": "getPetByIdUsingGET_1", - "parameters": [ - { - "name": "petId", - "in": "path", - "description": "ID of pet that needs to be fetched", - "required": true, - "type": "string", - "maxLength": 5, - "minLength": 1, - "x-example": "3" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/Pet" - } - } - }, - "x-test1": "value1", - "x-test2": { - "name2": "value2" - } - } - } - }, - "securityDefinitions": { - "api_key": { - "type": "apiKey", - "name": "api_key", - "in": "header" - }, - "petstore_auth": { - "type": "oauth2", - "authorizationUrl": "http://petstore.swagger.io/api/oauth/dialog", - "flow": "implicit", - "scopes": { - "write:pets": "modify pets in your account", - "read:pets": "read your pets" - } - } - }, - "definitions": { - "Car": { - "title": "Car", - "allOf": [ - { - "$ref": "#/definitions/Vehicle" - }, - { - "type": "object", - "properties": { - "make": { - "type": "string" - }, - "model": { - "type": "string" - }, - "seatingCapacity": { - "type": "integer", - "format": "int32" - }, - "topSpeed": { - "type": "number", - "format": "double" - } - }, - "title": "Car" - } - ] - }, - "Category": { - "type": "object", - "properties": { - "name": { - "type": "string" - } - }, - "title": "Category" - }, - "CustomTypeFor2031": { - "type": "object", - "properties": { - "property": { - "type": "string" - } - }, - "title": "CustomTypeFor2031" - }, - "EnumObjectType": { - "type": "object", - "properties": { - "description": { - "type": "string" - }, - "name": { - "type": "string" - } - }, - "title": "EnumObjectType" - }, - "Example": { - "type": "object", - "properties": { - "allCapsSet": { - "type": "array", - "uniqueItems": true, - "items": { - "type": "string" - } - }, - "annotatedEnumType": { - "type": "string", - "enum": [ - "ONE", - "TWO" - ] - }, - "bar": { - "type": "integer", - "format": "int32", - "example": 10, - "description": "description of bar" - }, - "enumType": { - "type": "string", - "enum": [ - "ONE", - "TWO" - ] - }, - "foo": { - "type": "string" - }, - "localDateTime": { - "type": "string", - "format": "date-time" - }, - "nestedType": { - "$ref": "#/definitions/NestedType" - }, - "parentBeanProperty": { - "type": "string" - }, - "propertyWithNoGetterMethod": { - "type": "string" - }, - "propertyWithNoSetterMethod": { - "type": "string" - }, - "readOnlyString": { - "type": "string", - "description": "A read only string", - "readOnly": true - } - }, - "title": "Example" - }, - "FancyPet": { - "type": "object", - "properties": { - "age": { - "type": "integer", - "format": "int32" - }, - "categories": { - "type": "array", - "items": { - "$ref": "#/definitions/Category" - } - }, - "id": { - "type": "string" - }, - "name": { - "type": "string" - } - }, - "title": "FancyPet" - }, - "Feature3311": { - "type": "object", - "properties": { - "value": { - "type": "string" - } - }, - "title": "Feature3311" - }, - "ModelWithArrayOfArrays": { - "type": "object", - "properties": { - "arrayOfArrayOfInts": { - "type": "array", - "items": { - "type": "array", - "items": { - "type": "integer", - "format": "int32" - } - } - } - }, - "title": "ModelWithArrayOfArrays" - }, - "ModelWithMapProperty": { - "type": "object", - "properties": { - "params": { - "type": "object", - "description": "Map of params to be sent", - "additionalProperties": { - "type": "string" - } - } - }, - "title": "ModelWithMapProperty", - "description": "Describes model with map property" - }, - "ModelWithObjectNode": { - "type": "object", - "properties": { - "anyObject": { - "$ref": "#/definitions/ObjectNode" - } - }, - "title": "ModelWithObjectNode" - }, - "NestedType": { - "type": "object", - "properties": { - "name": { - "type": "string" - } - }, - "title": "NestedType" - }, - "ObjectNode": { - "type": "object", - "title": "ObjectNode" - }, - "Pet": { - "type": "object", - "properties": { - "age": { - "type": "integer", - "format": "int32" - }, - "id": { - "type": "string" - }, - "name": { - "type": "string" - } - }, - "title": "Pet" - }, - "PetWithSerializer": { - "type": "object", - "title": "PetWithSerializer" - }, - "Truck": { - "title": "Truck", - "allOf": [ - { - "$ref": "#/definitions/Vehicle" - }, - { - "type": "object", - "properties": { - "make": { - "type": "string" - }, - "model": { - "type": "string" - }, - "payloadCapacity": { - "type": "number", - "format": "double" - } - }, - "title": "Truck" - } - ] - }, - "Vehicle": { - "type": "object", - "discriminator": "type", - "properties": { - "make": { - "type": "string" - }, - "model": { - "type": "string" - } - }, - "title": "Vehicle" - } - } -} \ No newline at end of file diff --git a/swagger-contract-tests/src/test/resources/contract/swagger2/declaration-feature-demonstration-service.json b/swagger-contract-tests/src/test/resources/contract/swagger2/declaration-feature-demonstration-service.json deleted file mode 100644 index e0b977fcd41..00000000000 --- a/swagger-contract-tests/src/test/resources/contract/swagger2/declaration-feature-demonstration-service.json +++ /dev/null @@ -1,1486 +0,0 @@ -{ - "swagger": "2.0", - "info": { - "description": "Api Documentation", - "version": "1.0", - "title": "Api Documentation", - "termsOfService": "urn:tos", - "contact": { - - }, - "license": { - "name": "Apache 2.0", - "url": "http://www.apache.org/licenses/LICENSE-2.0" - } - }, - "host": "localhost:__PORT__", - "basePath": "/", - "tags": [ - { - "name": "feature-demonstration-service", - "description": "Demonstration of features" - } - ], - "produces": [ - "application/json", - "application/xml" - ], - "paths": { - "/features/1367/{itemId}": { - "get": { - "tags": [ - "feature-demonstration-service" - ], - "summary": "findById", - "operationId": "findByIdUsingGET", - "produces": [ - "application/vnd.com.fancy-pet+json", - "application/vnd.com.pet+json" - ], - "parameters": [ - { - "name": "itemId", - "in": "path", - "description": "itemId", - "required": true, - "type": "string" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/FancyPet" - } - } - } - } - }, - "/features/1430-body": { - "post": { - "tags": [ - "feature-demonstration-service" - ], - "summary": "base64EncodedBody", - "operationId": "base64EncodedBodyUsingPOST", - "consumes": [ - "application/json" - ], - "parameters": [ - { - "in": "body", - "name": "base64Encoded", - "description": "base64Encoded", - "required": true, - "schema": { - "type": "string", - "format": "byte" - } - } - ], - "responses": { - "200": { - "description": "OK" - } - } - } - }, - "/features/1430-query": { - "post": { - "tags": [ - "feature-demonstration-service" - ], - "summary": "proper", - "operationId": "properUsingPOST", - "consumes": [ - "application/json" - ], - "parameters": [ - { - "name": "base64Encoded", - "in": "query", - "description": "base64Encoded", - "required": true, - "type": "string", - "format": "byte" - } - ], - "responses": { - "200": { - "description": "OK" - } - } - } - }, - "/features/1490/entity/{itemId}": { - "get": { - "tags": [ - "feature-demonstration-service" - ], - "summary": "serializablePetEntity", - "operationId": "serializablePetEntityUsingGET", - "parameters": [ - { - "name": "itemId", - "in": "path", - "description": "itemId", - "required": true, - "type": "string" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/PetWithSerializer" - } - } - } - } - }, - "/features/1490/{itemId}": { - "get": { - "tags": [ - "feature-demonstration-service" - ], - "summary": "serializablePet", - "operationId": "serializablePetUsingGET", - "parameters": [ - { - "name": "itemId", - "in": "path", - "description": "itemId", - "required": true, - "type": "string" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/PetWithSerializer" - } - } - } - }, - "put": { - "tags": [ - "feature-demonstration-service" - ], - "summary": "updateSerializablePet", - "operationId": "updateSerializablePetUsingPUT", - "consumes": [ - "application/json" - ], - "parameters": [ - { - "name": "itemId", - "in": "path", - "description": "itemId", - "required": true, - "type": "string" - }, - { - "in": "body", - "name": "pet", - "description": "pet", - "required": true, - "schema": { - "$ref": "#/definitions/PetWithSerializer" - } - } - ], - "responses": { - "200": { - "description": "OK" - } - } - } - }, - "/features/1570": { - "post": { - "tags": [ - "feature-demonstration-service" - ], - "summary": "Demo using examples", - "operationId": "saveUserUsingPOST", - "consumes": [ - "application/json" - ], - "responses": { - "200": { - "description": "OK" - }, - "404": { - "description": "User not found" - }, - "405": { - "description": "Validation exception", - "examples": { - "Example json": "{'invalidField': 'address'}", - "Example string": "The first name was invalid" - } - } - } - } - }, - "/features/2031": { - "post": { - "tags": [ - "feature-demonstration-service" - ], - "summary": "/2031", - "operationId": "saveUsingPOST", - "consumes": [ - "application/json" - ], - "parameters": [ - { - "in": "body", - "name": "contents", - "description": "contents", - "required": true, - "schema": { - "$ref": "#/definitions/CustomTypeFor2031" - }, - "x-examples": { - "application/json": "{'property': 'test'}" - } - }, - { - "name": "id", - "in": "path", - "description": "id", - "required": true, - "type": "string" - }, - { - "name": "keyId", - "in": "path", - "description": "keyId", - "required": true, - "type": "string" - } - ], - "responses": { - "200": { - "description": "OK" - } - } - } - }, - "/features/2831": { - "get": { - "tags": [ - "feature-demonstration-service" - ], - "summary": "Demo", - "description": "Demo optional header error", - "operationId": "feature2831UsingGET", - "parameters": [ - { - "name": "foo", - "in": "header", - "description": "foo msg", - "required": true, - "type": "string", - "x-example": "foo example" - } - ], - "responses": { - "200": { - "description": "okey", - "schema": { - "type": "object" - } - }, - "403": { - "description": "ko" - }, - "404": { - "description": "ko" - } - } - } - }, - "/features/3311": { - "post": { - "tags": [ - "feature-demonstration-service" - ], - "summary": "feature3311", - "operationId": "feature3311UsingPOST", - "consumes": [ - "multipart/form-data" - ], - "produces": [ - "application/json" - ], - "parameters": [ - { - "name": "attachments", - "in": "formData", - "required": false, - "type": "array", - "items": { - "type": "file" - }, - "collectionFormat": "multi" - } - ], - "responses": { - "200": { - "description": "OK" - } - } - } - }, - "/features/addFiles": { - "post": { - "tags": [ - "feature-demonstration-service" - ], - "summary": "Add a new contact with file attachment", - "operationId": "addFilesUsingPOST", - "consumes": [ - "application/json" - ], - "parameters": [ - { - "name": "files", - "in": "formData", - "required": false, - "type": "array", - "items": { - "type": "file" - }, - "collectionFormat": "multi" - } - ], - "responses": { - "200": { - "description": "OK" - } - } - } - }, - "/features/allMethodsAllowed": { - "get": { - "tags": [ - "feature-demonstration-service" - ], - "summary": "allMethodAllowed", - "operationId": "allMethodAllowedUsingGET", - "responses": { - "200": { - "description": "OK" - } - } - }, - "head": { - "tags": [ - "feature-demonstration-service" - ], - "summary": "allMethodAllowed", - "operationId": "allMethodAllowedUsingHEAD", - "consumes": [ - "application/json" - ], - "responses": { - "200": { - "description": "OK" - } - } - }, - "post": { - "tags": [ - "feature-demonstration-service" - ], - "summary": "allMethodAllowed", - "operationId": "allMethodAllowedUsingPOST", - "consumes": [ - "application/json" - ], - "responses": { - "200": { - "description": "OK" - } - } - }, - "put": { - "tags": [ - "feature-demonstration-service" - ], - "summary": "allMethodAllowed", - "operationId": "allMethodAllowedUsingPUT", - "consumes": [ - "application/json" - ], - "responses": { - "200": { - "description": "OK" - } - } - }, - "delete": { - "tags": [ - "feature-demonstration-service" - ], - "summary": "allMethodAllowed", - "operationId": "allMethodAllowedUsingDELETE", - "responses": { - "200": { - "description": "OK" - } - } - }, - "options": { - "tags": [ - "feature-demonstration-service" - ], - "summary": "allMethodAllowed", - "operationId": "allMethodAllowedUsingOPTIONS", - "consumes": [ - "application/json" - ], - "responses": { - "200": { - "description": "OK" - } - } - }, - "patch": { - "tags": [ - "feature-demonstration-service" - ], - "summary": "allMethodAllowed", - "operationId": "allMethodAllowedUsingPATCH", - "consumes": [ - "application/json" - ], - "responses": { - "200": { - "description": "OK" - } - } - } - }, - "/features/arrayOfArrays": { - "post": { - "tags": [ - "feature-demonstration-service" - ], - "summary": "arrayOfArrays", - "operationId": "arrayOfArraysUsingPOST", - "consumes": [ - "application/json" - ], - "parameters": [ - { - "in": "body", - "name": "arrayOfEnums", - "description": "arrayOfEnums", - "required": true, - "schema": { - "type": "array", - "items": { - "type": "array", - "items": { - "type": "string", - "enum": [ - "PRODUCT", - "SERVICE" - ] - } - } - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "array", - "items": { - "type": "array", - "items": { - "type": "integer", - "format": "int32" - } - } - } - } - } - } - }, - "/features/bare": { - "post": { - "tags": [ - "feature-demonstration-service" - ], - "summary": "getBare", - "operationId": "getBareUsingPOST", - "consumes": [ - "application/json" - ], - "parameters": [ - { - "name": "allCapsSet", - "in": "query", - "description": "description of allCapsSet", - "required": false, - "type": "array", - "items": { - "type": "string" - }, - "collectionFormat": "multi" - }, - { - "name": "annotatedEnumType", - "in": "query", - "description": "description of annotatedEnumType", - "required": false, - "type": "string", - "enum": [ - "ONE", - "TWO" - ] - }, - { - "name": "bar", - "in": "query", - "description": "description of bar", - "required": false, - "type": "integer", - "format": "int32", - "x-example": 10 - }, - { - "name": "enumType", - "in": "query", - "required": false, - "type": "string", - "enum": [ - "ONE", - "TWO" - ] - }, - { - "name": "foo", - "in": "query", - "description": "description of foo", - "required": true, - "type": "string", - "enum": [ - "chu", - "man" - ] - }, - { - "name": "localDateTime", - "in": "query", - "description": "local date time desc dd-MM-yyyy hh:mm:ss", - "required": true, - "type": "string", - "format": "date-time" - }, - { - "name": "nestedType.name", - "in": "query", - "required": false, - "type": "string" - }, - { - "name": "parentBeanProperty", - "in": "query", - "required": false, - "type": "string" - }, - { - "name": "propertyWithNoSetterMethod", - "in": "query", - "required": false, - "type": "string" - }, - { - "name": "readOnlyString", - "in": "query", - "description": "A read only string", - "required": false, - "type": "string" - } - ], - "responses": { - "200": { - "description": "OK" - } - } - } - }, - "/features/bigDecimal": { - "post": { - "tags": [ - "feature-demonstration-service" - ], - "summary": "updateBigDecimal", - "operationId": "updateBigDecimalUsingPOST", - "consumes": [ - "application/json" - ], - "parameters": [ - { - "name": "input", - "in": "query", - "description": "input", - "required": false, - "type": "number" - } - ], - "responses": { - "200": { - "description": "OK" - } - } - } - }, - "/features/boolean": { - "post": { - "tags": [ - "feature-demonstration-service" - ], - "summary": "updateBoolean", - "operationId": "updateBooleanUsingPOST", - "consumes": [ - "application/json" - ], - "parameters": [ - { - "name": "input", - "in": "query", - "description": "input", - "required": false, - "type": "boolean" - } - ], - "responses": { - "200": { - "description": "OK" - } - } - } - }, - "/features/date": { - "post": { - "tags": [ - "feature-demonstration-service" - ], - "summary": "updateDate", - "operationId": "updateDateUsingPOST", - "consumes": [ - "application/json" - ], - "parameters": [ - { - "name": "localDate", - "in": "query", - "description": "localDate", - "required": false, - "type": "string", - "format": "date" - } - ], - "responses": { - "200": { - "description": "OK" - } - } - } - }, - "/features/effective": { - "get": { - "tags": [ - "feature-demonstration-service" - ], - "summary": "getEffective", - "operationId": "getEffectiveUsingGET", - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/Example" - } - } - } - } - }, - "/features/effectives": { - "get": { - "tags": [ - "feature-demonstration-service" - ], - "summary": "getEffectives", - "operationId": "getEffectivesUsingGET", - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/Example" - } - } - } - } - } - }, - "/features/enumObject": { - "get": { - "tags": [ - "feature-demonstration-service" - ], - "summary": "getEnumAsObject", - "operationId": "getEnumAsObjectUsingGET", - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/EnumObjectType" - } - } - } - } - }, - "/features/examples": { - "put": { - "tags": [ - "feature-demonstration-service" - ], - "summary": "updateListOfExamples", - "operationId": "updateListOfExamplesUsingPUT", - "consumes": [ - "application/json" - ], - "parameters": [ - { - "name": "exampleList[0].allCapsSet", - "in": "query", - "description": "description of allCapsSet", - "required": false, - "type": "array", - "items": { - "type": "string" - }, - "collectionFormat": "multi" - }, - { - "name": "exampleList[0].annotatedEnumType", - "in": "query", - "description": "description of annotatedEnumType", - "required": false, - "type": "string", - "enum": [ - "ONE", - "TWO" - ] - }, - { - "name": "exampleList[0].bar", - "in": "query", - "description": "description of bar", - "required": false, - "type": "integer", - "format": "int32", - "x-example": 10 - }, - { - "name": "exampleList[0].enumType", - "in": "query", - "required": false, - "type": "string", - "enum": [ - "ONE", - "TWO" - ] - }, - { - "name": "exampleList[0].foo", - "in": "query", - "description": "description of foo", - "required": true, - "type": "string", - "enum": [ - "chu", - "man" - ] - }, - { - "name": "exampleList[0].localDateTime", - "in": "query", - "description": "local date time desc dd-MM-yyyy hh:mm:ss", - "required": true, - "type": "string", - "format": "date-time" - }, - { - "name": "exampleList[0].nestedType.name", - "in": "query", - "required": false, - "type": "string" - }, - { - "name": "exampleList[0].parentBeanProperty", - "in": "query", - "required": false, - "type": "string" - }, - { - "name": "exampleList[0].propertyWithNoSetterMethod", - "in": "query", - "required": false, - "type": "string" - }, - { - "name": "exampleList[0].readOnlyString", - "in": "query", - "description": "A read only string", - "required": false, - "type": "string" - } - ], - "responses": { - "200": { - "description": "OK" - } - } - } - }, - "/features/inheritance": { - "get": { - "tags": [ - "feature-demonstration-service" - ], - "summary": "findVehicles", - "operationId": "findVehiclesUsingGET", - "parameters": [ - { - "name": "type", - "in": "query", - "description": "type", - "required": true, - "type": "string" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/Vehicle" - } - } - } - } - } - }, - "/features/integers": { - "put": { - "tags": [ - "feature-demonstration-service" - ], - "summary": "updateListOfIntegers", - "operationId": "updateListOfIntegersUsingPUT", - "consumes": [ - "application/json" - ], - "parameters": [ - { - "name": "integers", - "in": "query", - "description": "integers", - "required": false, - "type": "array", - "items": { - "type": "integer", - "format": "int32" - }, - "collectionFormat": "multi" - } - ], - "responses": { - "200": { - "description": "OK" - } - } - } - }, - "/features/listOfMaps": { - "get": { - "tags": [ - "feature-demonstration-service" - ], - "summary": "listOfMaps", - "operationId": "listOfMapsUsingGET", - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "array", - "items": { - "type": "object", - "additionalProperties": { - "type": "string" - } - } - } - } - } - } - }, - "/features/mapOfMapOfExample": { - "get": { - "tags": [ - "feature-demonstration-service" - ], - "summary": "mapOfMapOfExample", - "operationId": "mapOfMapOfExampleUsingGET", - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "object", - "additionalProperties": { - "type": "object", - "additionalProperties": { - "$ref": "#/definitions/Example" - } - } - } - } - } - } - }, - "/features/mapProperty": { - "get": { - "tags": [ - "feature-demonstration-service" - ], - "summary": "modelWithMapProperty", - "operationId": "modelWithMapPropertyUsingGET", - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/ModelWithMapProperty" - } - } - } - } - }, - "/features/modelAttributes": { - "get": { - "tags": [ - "feature-demonstration-service" - ], - "summary": "getModelAttribute", - "operationId": "getModelAttributeUsingGET", - "parameters": [ - { - "name": "accountTypes", - "in": "query", - "required": false, - "type": "array", - "items": { - "type": "string", - "enum": [ - "BANK", - "CASH" - ] - }, - "collectionFormat": "multi", - "enum": [ - "BANK", - "CASH" - ] - }, - { - "name": "arrayProp", - "in": "query", - "required": false, - "type": "array", - "items": { - "type": "integer", - "format": "int32" - }, - "collectionFormat": "multi" - }, - { - "name": "complexProp.name", - "in": "query", - "required": false, - "type": "string" - }, - { - "name": "intProp", - "in": "query", - "required": false, - "type": "integer", - "format": "int32" - }, - { - "name": "listProp", - "in": "query", - "required": false, - "type": "array", - "items": { - "type": "string" - }, - "collectionFormat": "multi" - }, - { - "name": "stringProp", - "in": "query", - "required": false, - "type": "string" - } - ], - "responses": { - "200": { - "description": "OK" - } - } - } - }, - "/features/propertyWithArrayOfArrays": { - "post": { - "tags": [ - "feature-demonstration-service" - ], - "summary": "propertyWithArrayOfArrays", - "operationId": "propertyWithArrayOfArraysUsingPOST", - "consumes": [ - "application/json" - ], - "parameters": [ - { - "in": "body", - "name": "model", - "description": "model", - "required": true, - "schema": { - "$ref": "#/definitions/ModelWithArrayOfArrays" - } - } - ], - "responses": { - "200": { - "description": "OK" - } - } - } - }, - "/features/propertyWithObjectNode": { - "post": { - "tags": [ - "feature-demonstration-service" - ], - "summary": "propertyWithObjectNode", - "operationId": "propertyWithObjectNodeUsingPOST", - "consumes": [ - "application/json" - ], - "parameters": [ - { - "in": "body", - "name": "model", - "description": "model", - "required": true, - "schema": { - "$ref": "#/definitions/ModelWithObjectNode" - } - } - ], - "responses": { - "200": { - "description": "OK" - } - } - } - }, - "/features/status": { - "post": { - "tags": [ - "feature-demonstration-service" - ], - "summary": "updateBaz", - "operationId": "updateBazUsingPOST", - "consumes": [ - "application/json" - ], - "parameters": [ - { - "name": "enumType", - "in": "query", - "description": "enumType", - "required": false, - "type": "string", - "enum": [ - "ONE", - "TWO" - ] - } - ], - "responses": { - "200": { - "description": "OK" - } - } - } - }, - "/features/statuses": { - "post": { - "tags": [ - "feature-demonstration-service" - ], - "summary": "updateBazes", - "operationId": "updateBazesUsingPOST", - "consumes": [ - "application/json" - ], - "parameters": [ - { - "name": "enumType", - "in": "query", - "description": "enumType", - "required": false, - "type": "array", - "items": { - "type": "string", - "enum": [ - "ONE", - "TWO" - ] - }, - "collectionFormat": "multi", - "enum": [ - "ONE", - "TWO" - ] - } - ], - "responses": { - "200": { - "description": "OK" - } - } - } - }, - "/features/{petId}": { - "get": { - "tags": [ - "feature-demonstration-service" - ], - "summary": "Find pet by ID", - "description": "Returns a pet when ID < 10. ID > 10 or non-integers will simulate API error conditions", - "operationId": "getPetByIdUsingGET", - "parameters": [ - { - "name": "petId", - "in": "path", - "description": "ID of pet that needs to be fetched", - "required": true, - "type": "string", - "maxLength": 5, - "minLength": 1, - "x-example": "3" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/Pet" - } - } - }, - "x-test1": "value1", - "x-test2": { - "name2": "value2" - } - } - } - }, - "securityDefinitions": { - "api_key": { - "type": "apiKey", - "name": "api_key", - "in": "header" - }, - "petstore_auth": { - "type": "oauth2", - "authorizationUrl": "http://petstore.swagger.io/api/oauth/dialog", - "flow": "implicit", - "scopes": { - "write:pets": "modify pets in your account", - "read:pets": "read your pets" - } - } - }, - "definitions": { - "Car": { - "title": "Car", - "allOf": [ - { - "$ref": "#/definitions/Vehicle" - }, - { - "type": "object", - "properties": { - "make": { - "type": "string" - }, - "model": { - "type": "string" - }, - "seatingCapacity": { - "type": "integer", - "format": "int32" - }, - "topSpeed": { - "type": "number", - "format": "double" - } - }, - "title": "Car" - } - ] - }, - "Category": { - "type": "object", - "properties": { - "name": { - "type": "string" - } - }, - "title": "Category" - }, - "CustomTypeFor2031": { - "type": "object", - "properties": { - "property": { - "type": "string" - } - }, - "title": "CustomTypeFor2031" - }, - "EnumObjectType": { - "type": "object", - "properties": { - "description": { - "type": "string" - }, - "name": { - "type": "string" - } - }, - "title": "EnumObjectType" - }, - "Example": { - "type": "object", - "properties": { - "allCapsSet": { - "type": "array", - "uniqueItems": true, - "items": { - "type": "string" - } - }, - "annotatedEnumType": { - "type": "string", - "enum": [ - "ONE", - "TWO" - ] - }, - "bar": { - "type": "integer", - "format": "int32", - "example": 10, - "description": "description of bar" - }, - "enumType": { - "type": "string", - "enum": [ - "ONE", - "TWO" - ] - }, - "foo": { - "type": "string" - }, - "localDateTime": { - "type": "string", - "format": "date-time" - }, - "nestedType": { - "$ref": "#/definitions/NestedType" - }, - "parentBeanProperty": { - "type": "string" - }, - "propertyWithNoGetterMethod": { - "type": "string" - }, - "propertyWithNoSetterMethod": { - "type": "string" - }, - "readOnlyString": { - "type": "string", - "description": "A read only string", - "readOnly": true - } - }, - "title": "Example" - }, - "FancyPet": { - "type": "object", - "properties": { - "age": { - "type": "integer", - "format": "int32" - }, - "categories": { - "type": "array", - "items": { - "$ref": "#/definitions/Category" - } - }, - "id": { - "type": "string" - }, - "name": { - "type": "string" - } - }, - "title": "FancyPet" - }, - "Feature3311": { - "type": "object", - "properties": { - "value": { - "type": "string" - } - }, - "title": "Feature3311" - }, - "ModelWithArrayOfArrays": { - "type": "object", - "properties": { - "arrayOfArrayOfInts": { - "type": "array", - "items": { - "type": "array", - "items": { - "type": "integer", - "format": "int32" - } - } - } - }, - "title": "ModelWithArrayOfArrays" - }, - "ModelWithMapProperty": { - "type": "object", - "properties": { - "params": { - "type": "object", - "description": "Map of params to be sent", - "additionalProperties": { - "type": "string" - } - } - }, - "title": "ModelWithMapProperty", - "description": "Describes model with map property" - }, - "ModelWithObjectNode": { - "type": "object", - "properties": { - "anyObject": { - "$ref": "#/definitions/ObjectNode" - } - }, - "title": "ModelWithObjectNode" - }, - "NestedType": { - "type": "object", - "properties": { - "name": { - "type": "string" - } - }, - "title": "NestedType" - }, - "ObjectNode": { - "type": "object", - "title": "ObjectNode" - }, - "Pet": { - "type": "object", - "properties": { - "age": { - "type": "integer", - "format": "int32" - }, - "id": { - "type": "string" - }, - "name": { - "type": "string" - } - }, - "title": "Pet" - }, - "PetWithSerializer": { - "type": "object", - "title": "PetWithSerializer" - }, - "Truck": { - "title": "Truck", - "allOf": [ - { - "$ref": "#/definitions/Vehicle" - }, - { - "type": "object", - "properties": { - "make": { - "type": "string" - }, - "model": { - "type": "string" - }, - "payloadCapacity": { - "type": "number", - "format": "double" - } - }, - "title": "Truck" - } - ] - }, - "Vehicle": { - "type": "object", - "discriminator": "type", - "properties": { - "make": { - "type": "string" - }, - "model": { - "type": "string" - } - }, - "title": "Vehicle" - } - } -} \ No newline at end of file diff --git a/swagger-contract-tests/src/test/resources/contract/swagger2/declaration-groovy-service.json b/swagger-contract-tests/src/test/resources/contract/swagger2/declaration-groovy-service.json deleted file mode 100644 index 427e3f6316c..00000000000 --- a/swagger-contract-tests/src/test/resources/contract/swagger2/declaration-groovy-service.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "swagger": "2.0", - "info": { - "description": "Api Documentation", - "version": "1.0", - "title": "Api Documentation", - "termsOfService": "urn:tos", - "contact": { - - }, - "license": { - "name": "Apache 2.0", - "url": "http://www.apache.org/licenses/LICENSE-2.0" - } - }, - "host": "localhost:__PORT__", - "basePath": "/", - "produces": [ - "application/json", - "application/xml" - ], - "securityDefinitions": { - "api_key": { - "type": "apiKey", - "name": "api_key", - "in": "header" - }, - "petstore_auth": { - "type": "oauth2", - "authorizationUrl": "http://petstore.swagger.io/api/oauth/dialog", - "flow": "implicit", - "scopes": { - "write:pets": "modify pets in your account", - "read:pets": "read your pets" - } - } - } -} \ No newline at end of file diff --git a/swagger-contract-tests/src/test/resources/contract/swagger2/declaration-inherited-service-impl.json b/swagger-contract-tests/src/test/resources/contract/swagger2/declaration-inherited-service-impl.json deleted file mode 100644 index 9cd61b4042b..00000000000 --- a/swagger-contract-tests/src/test/resources/contract/swagger2/declaration-inherited-service-impl.json +++ /dev/null @@ -1,119 +0,0 @@ -{ - "swagger": "2.0", - "info": { - "description": "Api Documentation", - "version": "1.0", - "title": "Api Documentation", - "termsOfService": "urn:tos", - "contact": { - - }, - "license": { - "name": "Apache 2.0", - "url": "http://www.apache.org/licenses/LICENSE-2.0" - } - }, - "host": "localhost:__PORT__", - "basePath": "/", - "tags": [ - { - "name": "inherited-service-impl", - "description": "Interface API" - } - ], - "produces": [ - "application/json", - "application/xml" - ], - "paths": { - "/child/1575": { - "get": { - "tags": [ - "inherited-service-impl" - ], - "summary": "demonstrateInheritanceWithAnnotations", - "operationId": "demonstrateInheritanceWithAnnotationsUsingGET", - "produces": [ - "application/json" - ], - "parameters": [ - { - "name": "param1", - "in": "path", - "description": "param1", - "required": true, - "type": "string" - } - ], - "responses": { - "200": { - "description": "kkj", - "schema": { - "$ref": "#/definitions/Pet" - } - } - } - } - }, - "/child/child-method": { - "get": { - "tags": [ - "inherited-service-impl" - ], - "summary": "getSomething", - "operationId": "getSomethingUsingGET", - "parameters": [ - { - "name": "parameter", - "in": "query", - "description": "parameter", - "required": false, - "type": "string" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "string" - } - } - } - } - } - }, - "securityDefinitions": { - "api_key": { - "type": "apiKey", - "name": "api_key", - "in": "header" - }, - "petstore_auth": { - "type": "oauth2", - "authorizationUrl": "http://petstore.swagger.io/api/oauth/dialog", - "flow": "implicit", - "scopes": { - "write:pets": "modify pets in your account", - "read:pets": "read your pets" - } - } - }, - "definitions": { - "Pet": { - "type": "object", - "properties": { - "age": { - "type": "integer", - "format": "int32" - }, - "id": { - "type": "string" - }, - "name": { - "type": "string" - } - }, - "title": "Pet" - } - } -} \ No newline at end of file diff --git a/swagger-contract-tests/src/test/resources/contract/swagger2/declaration-pet-grooming-service.json b/swagger-contract-tests/src/test/resources/contract/swagger2/declaration-pet-grooming-service.json deleted file mode 100644 index fddd122a8dc..00000000000 --- a/swagger-contract-tests/src/test/resources/contract/swagger2/declaration-pet-grooming-service.json +++ /dev/null @@ -1,73 +0,0 @@ -{ - "swagger": "2.0", - "info": { - "description": "Api Documentation", - "version": "1.0", - "title": "Api Documentation", - "termsOfService": "urn:tos", - "contact": { - - }, - "license": { - "name": "Apache 2.0", - "url": "http://www.apache.org/licenses/LICENSE-2.0" - } - }, - "host": "localhost:__PORT__", - "basePath": "/", - "tags": [ - { - "name": "pet-grooming-service", - "description": "Grooming operations for pets" - } - ], - "produces": [ - "application/json", - "application/xml" - ], - "paths": { - "/petgrooming/voidMethod/{input}": { - "delete": { - "tags": [ - "pet-grooming-service" - ], - "summary": "groomingFunctionThatReturnsVoid", - "operationId": "groomingFunctionThatReturnsVoidUsingDELETE", - "produces": [ - "application/json", - "application/xml" - ], - "parameters": [ - { - "name": "input", - "in": "path", - "description": "input", - "required": true, - "type": "string" - } - ], - "responses": { - "200": { - "description": "Just testing" - } - } - } - } - }, - "securityDefinitions": { - "api_key": { - "type": "apiKey", - "name": "api_key", - "in": "header" - }, - "petstore_auth": { - "type": "oauth2", - "authorizationUrl": "http://petstore.swagger.io/api/oauth/dialog", - "flow": "implicit", - "scopes": { - "write:pets": "modify pets in your account", - "read:pets": "read your pets" - } - } - } -} \ No newline at end of file diff --git a/swagger-contract-tests/src/test/resources/contract/swagger2/declaration-pet-service.json b/swagger-contract-tests/src/test/resources/contract/swagger2/declaration-pet-service.json deleted file mode 100644 index 7c0bfec822d..00000000000 --- a/swagger-contract-tests/src/test/resources/contract/swagger2/declaration-pet-service.json +++ /dev/null @@ -1,704 +0,0 @@ -{ - "swagger": "2.0", - "info": { - "description": "Api Documentation", - "version": "1.0", - "title": "Api Documentation", - "termsOfService": "urn:tos", - "contact": { - - }, - "license": { - "name": "Apache 2.0", - "url": "http://www.apache.org/licenses/LICENSE-2.0" - } - }, - "host": "localhost:__PORT__", - "basePath": "/", - "tags": [ - { - "name": "pet-grooming-service", - "description": "Grooming operations for pets" - }, - { - "name": "pet-service", - "description": "Operations about pets" - } - ], - "produces": [ - "application/json", - "application/xml" - ], - "paths": { - "/pets/byName/{name}": { - "post": { - "tags": [ - "pet-service" - ], - "summary": "petEntities", - "operationId": "petEntitiesUsingPOST", - "consumes": [ - "application/json" - ], - "parameters": [ - { - "name": "name", - "in": "path", - "description": "name", - "required": true, - "type": "string" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/Pet" - } - } - } - } - } - }, - "/pets/echo": { - "post": { - "tags": [ - "pet-service" - ], - "summary": "echo", - "operationId": "echoUsingPOST", - "consumes": [ - "application/json" - ], - "parameters": [ - { - "in": "body", - "name": "someInput", - "description": "someInput", - "required": true, - "schema": { - "type": "object", - "additionalProperties": { - "$ref": "#/definitions/Pet" - } - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "object", - "additionalProperties": { - "$ref": "#/definitions/Pet" - } - } - } - } - } - }, - "/pets/findByAge{?age}": { - "get": { - "tags": [ - "pet-service" - ], - "summary": "Find Pet by age", - "description": "Exclusive range with infinity", - "operationId": "findPetsByAgeUsingGET", - "parameters": [ - { - "name": "age", - "in": "query", - "description": "Age values that need to be considered for filter", - "required": true, - "type": "integer", - "exclusiveMaximum": true, - "minimum": 0, - "exclusiveMinimum": true, - "format": "int32" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/Pet" - } - } - } - } - }, - "/pets/findByLegs{?legs}": { - "get": { - "tags": [ - "pet-service" - ], - "summary": "Find Pet by legs", - "description": "Exclusive range should work", - "operationId": "findPetsByLegsUsingGET", - "parameters": [ - { - "name": "legs", - "in": "query", - "description": "Legs values that need to be considered for filter", - "required": true, - "type": "integer", - "maximum": 10, - "exclusiveMaximum": true, - "minimum": 0, - "exclusiveMinimum": true, - "format": "int32" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/Pet" - } - } - } - } - }, - "/pets/findByStamina{?stamina}": { - "get": { - "tags": [ - "pet-service" - ], - "summary": "Find Pet by stamina", - "description": "Exclusive range with -infinity", - "operationId": "findPetsByStaminaUsingGET", - "parameters": [ - { - "name": "stamina", - "in": "query", - "description": "Stamina values", - "required": true, - "type": "integer", - "maximum": 12, - "exclusiveMaximum": true, - "exclusiveMinimum": false, - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/Pet" - } - } - } - } - }, - "/pets/findByStatus{?status}": { - "get": { - "tags": [ - "pet-service" - ], - "summary": "Find Pet by status", - "description": "Multiple status values can be provided with comma-separated strings", - "operationId": "findPetsByStatusUsingGET", - "parameters": [ - { - "name": "status", - "in": "query", - "description": "Status values that need to be considered for filter", - "required": true, - "type": "string", - "default": "available", - "enum": [ - "available", - "pending", - "sold" - ] - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/Pet" - } - }, - "400": { - "description": "Invalid status value" - } - } - } - }, - "/pets/findByTags{?tags}": { - "get": { - "tags": [ - "pet-service" - ], - "summary": "Find Pet by tags", - "description": "Multiple tags can be provided with comma-separated strings. Use tag1, tag2, tag3 for testing.", - "operationId": "findPetsByTagsUsingGET", - "parameters": [ - { - "name": "tags", - "in": "query", - "description": "Tags to filter by", - "required": true, - "type": "string" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/Pet" - } - }, - "400": { - "description": "Invalid tag value" - } - }, - "deprecated": true - } - }, - "/pets/grooming/voidMethod/{input}": { - "delete": { - "tags": [ - "pet-grooming-service" - ], - "summary": "groomingFunctionThatReturnsVoid", - "operationId": "groomingFunctionThatReturnsVoidUsingDELETE_1", - "produces": [ - "application/json", - "application/xml" - ], - "parameters": [ - { - "name": "input", - "in": "path", - "description": "input", - "required": true, - "type": "string" - } - ], - "responses": { - "200": { - "description": "Just testing" - } - } - } - }, - "/pets/grooming{?type}": { - "get": { - "tags": [ - "pet-grooming-service" - ], - "summary": "canGroom", - "operationId": "canGroomUsingGET", - "parameters": [ - { - "name": "type", - "in": "query", - "description": "type", - "required": true, - "type": "string" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "boolean" - } - } - } - } - }, - "/pets/nameToNickNamesMap": { - "post": { - "tags": [ - "pet-service" - ], - "summary": "nameToNickNamesMap", - "operationId": "nameToNickNamesMapUsingPOST", - "consumes": [ - "application/json" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "object", - "additionalProperties": { - "type": "array", - "items": { - "type": "string" - } - } - } - } - } - } - }, - "/pets/siblings{?age,id,name}": { - "post": { - "tags": [ - "pet-service" - ], - "summary": "siblings", - "operationId": "siblingsUsingPOST", - "consumes": [ - "application/json" - ], - "parameters": [ - { - "name": "age", - "in": "query", - "required": false, - "type": "integer", - "format": "int32" - }, - { - "name": "id", - "in": "query", - "required": false, - "type": "string" - }, - { - "name": "name", - "in": "query", - "required": false, - "type": "string" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/Pet" - } - } - } - } - } - }, - "/pets/transformPetNameToPetMapToAny": { - "post": { - "tags": [ - "pet-service" - ], - "summary": "transformPetNameToPetMapToAny", - "operationId": "transformPetNameToPetMapToAnyUsingPOST", - "consumes": [ - "application/json" - ], - "parameters": [ - { - "in": "body", - "name": "someInput", - "description": "someInput", - "required": true, - "schema": { - "type": "object", - "additionalProperties": { - "$ref": "#/definitions/Pet" - } - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "object" - } - } - } - } - }, - "/pets/transformPetNameToPetMapToGenericOpenMap": { - "post": { - "tags": [ - "pet-service" - ], - "summary": "transformPetNameToPetMapToGenericOpenMap", - "operationId": "transformPetNameToPetMapToGenericOpenMapUsingPOST", - "consumes": [ - "application/json" - ], - "parameters": [ - { - "in": "body", - "name": "someInput", - "description": "someInput", - "required": true, - "schema": { - "type": "object", - "additionalProperties": { - "$ref": "#/definitions/Pet" - } - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "object" - } - } - } - } - }, - "/pets/transformPetNameToPetMapToOpenMap": { - "post": { - "tags": [ - "pet-service" - ], - "summary": "transformPetNameToPetMapToOpenMap", - "operationId": "transformPetNameToPetMapToOpenMapUsingPOST", - "consumes": [ - "application/json" - ], - "parameters": [ - { - "in": "body", - "name": "someInput", - "description": "someInput", - "required": true, - "schema": { - "type": "object", - "additionalProperties": { - "$ref": "#/definitions/Pet" - } - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "object" - } - } - } - } - }, - "/pets/voidMethod/{input}": { - "delete": { - "tags": [ - "pet-grooming-service" - ], - "summary": "groomingFunctionThatReturnsVoid", - "operationId": "groomingFunctionThatReturnsVoidUsingDELETE_2", - "produces": [ - "application/json", - "application/xml" - ], - "parameters": [ - { - "name": "input", - "in": "path", - "description": "input", - "required": true, - "type": "string" - } - ], - "responses": { - "200": { - "description": "Just testing" - } - } - } - }, - "/pets/{a}/{b}": { - "get": { - "tags": [ - "pet-service" - ], - "summary": "method", - "operationId": "methodUsingGET", - "parameters": [ - { - "name": "a", - "in": "path", - "description": "a", - "required": true, - "type": "string" - }, - { - "name": "b", - "in": "path", - "description": "b", - "required": true, - "type": "string" - } - ], - "responses": { - "200": { - "description": "OK" - } - } - } - }, - "/pets/{name}": { - "post": { - "tags": [ - "pet-service" - ], - "summary": "petByName", - "operationId": "petByNameUsingPOST", - "consumes": [ - "application/json" - ], - "parameters": [ - { - "name": "name", - "in": "path", - "description": "name", - "required": true, - "type": "string" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/Pet" - } - } - } - } - }, - "/pets/{petId}": { - "get": { - "tags": [ - "pet-service" - ], - "summary": "Find pet by ID", - "description": "Returns a pet when ID < 10. ID > 10 or non-integers will simulate API error conditions", - "operationId": "getPetByIdUsingGET_2", - "parameters": [ - { - "name": "petId", - "in": "path", - "description": "ID of pet that needs to be fetched", - "required": true, - "type": "string", - "maxLength": 5, - "minLength": 1 - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/Pet" - } - } - } - } - }, - "/pets/{petId}/pic": { - "post": { - "tags": [ - "pet-service" - ], - "summary": "updatePic", - "operationId": "updatePicUsingPOST", - "consumes": [ - "multipart/form-data" - ], - "parameters": [ - { - "name": "petId", - "in": "path", - "description": "petId", - "required": true, - "type": "string" - }, - { - "in": "body", - "name": "pic", - "description": "pic", - "required": false, - "schema": { - "type": "string", - "format": "binary" - } - } - ], - "responses": { - "200": { - "description": "OK" - } - } - } - }, - "/pets/{petId}/pic/{picId}": { - "get": { - "tags": [ - "pet-service" - ], - "summary": "updatePic", - "operationId": "updatePicUsingGET", - "parameters": [ - { - "name": "petId", - "in": "path", - "description": "petId", - "required": true, - "type": "string" - }, - { - "name": "picId", - "in": "path", - "description": "picId", - "required": true, - "type": "string" - } - ], - "responses": { - "200": { - "description": "OK" - } - } - } - } - }, - "securityDefinitions": { - "api_key": { - "type": "apiKey", - "name": "api_key", - "in": "header" - }, - "petstore_auth": { - "type": "oauth2", - "authorizationUrl": "http://petstore.swagger.io/api/oauth/dialog", - "flow": "implicit", - "scopes": { - "write:pets": "modify pets in your account", - "read:pets": "read your pets" - } - } - }, - "definitions": { - "Pet": { - "type": "object", - "properties": { - "age": { - "type": "integer", - "format": "int32" - }, - "id": { - "type": "string" - }, - "name": { - "type": "string" - } - }, - "title": "Pet" - } - } -} \ No newline at end of file diff --git a/swagger-contract-tests/src/test/resources/contract/swagger2/declaration-root-controller.json b/swagger-contract-tests/src/test/resources/contract/swagger2/declaration-root-controller.json deleted file mode 100644 index ec669f8edd1..00000000000 --- a/swagger-contract-tests/src/test/resources/contract/swagger2/declaration-root-controller.json +++ /dev/null @@ -1,3477 +0,0 @@ -{ - "swagger": "2.0", - "info": { - "description": "Api Documentation", - "version": "1.0", - "title": "Api Documentation", - "termsOfService": "urn:tos", - "contact": { - }, - "license": { - "name": "Apache 2.0", - "url": "http://www.apache.org/licenses/LICENSE-2.0" - } - }, - "host": "localhost:__PORT__", - "basePath": "/", - "tags": [ - { - "name": "concrete-controller" - }, - { - "name": "pet-service" - }, - { - "name": "business-service" - }, - { - "name": "pet-grooming-service" - }, - { - "name": "environment-mvc-endpoint" - }, - { - "name": "root-controller" - }, - { - "name": "fancy-pet-service" - }, - { - "name": "inherited-service-impl" - }, - { - "name": "endpoint-mvc-adapter" - }, - { - "name": "health-mvc-endpoint" - }, - { - "name": "feature-demonstration-service" - }, - { - "name": "user" - }, - { - "name": "pet" - }, - { - "name": "controller-with-no-request-mapping-service" - }, - { - "name": "basic-error-controller" - }, - { - "name": "metrics-mvc-endpoint" - }, - { - "name": "store" - } - ], - "produces": [ - "application/xml", - "application/json" - ], - "paths": { - "/": { - "get": { - "tags": [ - "root-controller" - ], - "summary": "getAll", - "operationId": "getAllUsingGET", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "array", - "items": { - "type": "string" - } - } - } - } - } - }, - "/api/pet": { - "post": { - "tags": [ - "pet" - ], - "summary": "Add a new pet to the store", - "operationId": "addPetUsingPOST", - "consumes": [ - "application/json" - ], - "parameters": [ - { - "in": "body", - "name": "body", - "description": "Pet object that needs to be added to the store", - "required": true, - "schema": { - "$ref": "#/definitions/Pet" - } - } - ], - "responses": { - "405": { - "description": "Invalid input" - }, - "200": { - "description": "OK", - "schema": { - "type": "string" - } - } - }, - "security": [ - { - "petstore_auth": [ - "write:pets", - "read:pets" - ] - } - ] - }, - "put": { - "tags": [ - "pet" - ], - "summary": "Update an existing pet", - "operationId": "updatePetUsingPUT", - "consumes": [ - "application/json" - ], - "parameters": [ - { - "in": "body", - "name": "body", - "description": "Pet object that needs to be added to the store", - "required": true, - "schema": { - "$ref": "#/definitions/Pet" - } - } - ], - "responses": { - "405": { - "description": "Validation exception" - }, - "404": { - "description": "Pet not found" - }, - "200": { - "description": "OK", - "schema": { - "type": "string" - } - }, - "400": { - "description": "Invalid ID supplied" - } - }, - "security": [ - { - "petstore_auth": [ - "write:pets", - "read:pets" - ] - } - ] - } - }, - "/api/pet/findByStatus": { - "get": { - "tags": [ - "pet" - ], - "summary": "Finds Pets by status", - "description": "Multiple status values can be provided with comma-separated strings", - "operationId": "findPetsByStatusUsingGET", - "consumes": [ - "application/json" - ], - "parameters": [ - { - "name": "status", - "in": "query", - "description": "Status values that need to be considered for filter", - "required": true, - "type": "string", - "default": "available" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/Pet" - } - } - }, - "400": { - "description": "Invalid status value" - } - }, - "security": [ - { - "petstore_auth": [ - "write:pets", - "read:pets" - ] - } - ] - } - }, - "/api/pet/findByTags": { - "get": { - "tags": [ - "pet" - ], - "summary": "Finds Pets by tags", - "description": "Multiple tags can be provided with comma-separated strings. Use tag1, tag2, tag3 for testing.", - "operationId": "findPetsByTagsUsingGET", - "consumes": [ - "application/json" - ], - "parameters": [ - { - "name": "tags", - "in": "query", - "description": "Tags to filter by", - "required": true, - "type": "string" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/Pet" - } - } - }, - "400": { - "description": "Invalid tag value" - } - }, - "security": [ - { - "petstore_auth": [ - "write:pets", - "read:pets" - ] - } - ], - "deprecated": true - } - }, - "/api/pet/{petId}": { - "get": { - "tags": [ - "pet" - ], - "summary": "Find pet by ID", - "description": "Returns a pet when ID < 10. ID > 10 or non-integers will simulate API error conditions", - "operationId": "getPetByIdUsingGET", - "consumes": [ - "application/json" - ], - "parameters": [ - { - "name": "petId", - "in": "path", - "description": "ID of pet that needs to be fetched", - "required": true, - "type": "string" - } - ], - "responses": { - "404": { - "description": "Pet not found" - }, - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/Pet" - } - }, - "400": { - "description": "Invalid ID supplied" - } - }, - "security": [ - { - "api_key": [ - "" - ] - }, - { - "petstore_auth": [ - "write:pets", - "read:pets" - ] - } - ] - } - }, - "/api/store/order": { - "post": { - "tags": [ - "store" - ], - "summary": "Place an order for a pet", - "operationId": "placeOrderUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "application/json" - ], - "parameters": [ - { - "in": "body", - "name": "body", - "description": "order placed for purchasing the pet", - "required": true, - "schema": { - "$ref": "#/definitions/Order" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "string" - } - }, - "400": { - "description": "Invalid Order" - } - } - } - }, - "/api/store/order/{orderId}": { - "get": { - "tags": [ - "Pet Store" - ], - "summary": "Find purchase order by ID", - "description": "For valid response try integer IDs with value <= 5 or > 10. Other values will generated exceptions", - "operationId": "getOrderByIdUsingGET", - "consumes": [ - "application/json" - ], - "produces": [ - "application/json" - ], - "parameters": [ - { - "name": "orderId", - "in": "path", - "description": "ID of pet that needs to be fetched", - "required": true, - "type": "string" - } - ], - "responses": { - "404": { - "description": "Order not found" - }, - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/Order" - } - }, - "400": { - "description": "Invalid ID supplied" - } - } - }, - "delete": { - "tags": [ - "store" - ], - "summary": "Delete purchase order by ID", - "description": "For valid response try integer IDs with value < 1000. Anything above 1000 or non-integers will generate API errors", - "operationId": "deleteOrderUsingDELETE", - "consumes": [ - "application/json" - ], - "produces": [ - "application/json" - ], - "parameters": [ - { - "name": "orderId", - "in": "path", - "description": "ID of the order that needs to be deleted", - "required": true, - "type": "string" - } - ], - "responses": { - "404": { - "description": "Order not found" - }, - "200": { - "description": "OK", - "schema": { - "type": "string" - } - }, - "400": { - "description": "Invalid ID supplied" - } - } - } - }, - "/api/user": { - "post": { - "tags": [ - "user" - ], - "summary": "Create user", - "description": "This can only be done by the logged in user.", - "operationId": "createUserUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "application/json" - ], - "parameters": [ - { - "in": "body", - "name": "body", - "description": "Created user object", - "required": true, - "schema": { - "$ref": "#/definitions/User" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/User" - } - } - } - } - }, - "/api/user/createWithArray": { - "post": { - "tags": [ - "user" - ], - "summary": "Creates list of users with given input array", - "operationId": "createUsersWithArrayInputUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "application/json" - ], - "parameters": [ - { - "in": "body", - "name": "body", - "description": "List of user object", - "required": true, - "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/User" - } - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/User" - } - } - } - } - }, - "/api/user/createWithList": { - "post": { - "tags": [ - "user" - ], - "summary": "Creates list of users with given input array", - "operationId": "createUsersWithListInputUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "application/json" - ], - "parameters": [ - { - "in": "body", - "name": "body", - "description": "List of user object", - "required": true, - "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/User" - } - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "string" - } - } - } - } - }, - "/api/user/login": { - "get": { - "tags": [ - "user" - ], - "summary": "Logs user into the system", - "operationId": "loginUserUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "application/json" - ], - "parameters": [ - { - "name": "username", - "in": "query", - "description": "The user name for login", - "required": true, - "type": "string" - }, - { - "name": "password", - "in": "query", - "description": "The password for login in clear text", - "required": true, - "type": "string" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "string" - } - }, - "400": { - "description": "Invalid username/password supplied" - } - } - } - }, - "/api/user/logout": { - "get": { - "tags": [ - "user" - ], - "summary": "Logs out current logged in user session", - "operationId": "logoutUserUsingGET", - "consumes": [ - "application/json" - ], - "produces": [ - "application/json" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "string" - } - } - } - } - }, - "/api/user/{username}": { - "get": { - "tags": [ - "user" - ], - "summary": "Get user by user name", - "operationId": "getUserByNameUsingGET", - "consumes": [ - "application/json" - ], - "produces": [ - "application/json" - ], - "parameters": [ - { - "name": "username", - "in": "path", - "description": "The name that needs to be fetched. Use user1 for testing. ", - "required": true, - "type": "string" - } - ], - "responses": { - "404": { - "description": "User not found" - }, - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/User" - } - }, - "400": { - "description": "Invalid username supplied" - } - } - }, - "put": { - "tags": [ - "user" - ], - "summary": "Updated user", - "description": "This can only be done by the logged in user.", - "operationId": "updateUserUsingPUT", - "consumes": [ - "application/json" - ], - "produces": [ - "application/json" - ], - "parameters": [ - { - "name": "username", - "in": "path", - "description": "name that need to be deleted", - "required": true, - "type": "string" - }, - { - "in": "body", - "name": "body", - "description": "Updated user object", - "required": true, - "schema": { - "$ref": "#/definitions/User" - } - } - ], - "responses": { - "404": { - "description": "User not found" - }, - "200": { - "description": "OK", - "schema": { - "type": "string" - } - }, - "400": { - "description": "Invalid user supplied" - } - } - }, - "delete": { - "tags": [ - "user" - ], - "summary": "Delete user", - "description": "This can only be done by the logged in user.", - "operationId": "deleteUserUsingDELETE", - "consumes": [ - "application/json" - ], - "produces": [ - "application/json" - ], - "parameters": [ - { - "name": "username", - "in": "path", - "description": "The name that needs to be deleted", - "required": true, - "type": "string" - } - ], - "responses": { - "404": { - "description": "User not found" - }, - "200": { - "description": "OK", - "schema": { - "type": "string" - } - }, - "400": { - "description": "Invalid username supplied" - } - } - } - }, - "/autoconfig": { - "get": { - "tags": [ - "endpoint-mvc-adapter" - ], - "summary": "invoke", - "operationId": "invokeUsingGET", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "object" - } - } - } - } - }, - "/beans": { - "get": { - "tags": [ - "endpoint-mvc-adapter" - ], - "summary": "invoke", - "operationId": "invokeUsingGET", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "object" - } - } - } - } - }, - "/businesses/aliased/{otherId}": { - "get": { - "tags": [ - "business-service" - ], - "summary": "Find a business by its id", - "operationId": "getAliasedPathVariableUsinGET", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*", - "application/json" - ], - "parameters": [ - { - "name": "otherId", - "in": "path", - "description": "ID of business", - "required": true, - "type": "string" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "string" - } - } - } - } - }, - "/businesses/byTypes": { - "get": { - "tags": [ - "business-service" - ], - "summary": "businessesByCategories", - "operationId": "businessesByCategoriesUsingGET", - "consumes": [ - "application/json" - ], - "produces": [ - "application/json" - ], - "parameters": [ - { - "name": "types", - "in": "query", - "description": "types", - "required": true, - "type": "array", - "items": { - "type": "string" - }, - "collectionFormat": "csv" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/Biz" - } - } - } - } - } - }, - "/businesses/non-aliased/{businessId}": { - "get": { - "tags": [ - "business-service" - ], - "summary": "Find a business by its id", - "operationId": "getNonAliasedPathVariableUsingGET", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*", - "application/json" - ], - "parameters": [ - { - "name": "businessId", - "in": "path", - "description": "ID of business", - "required": true, - "type": "string" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "string" - } - } - }, - "security": [ - { - "oauth2": [ - "scope" - ] - } - ] - } - }, - "/businesses/responseEntity/{businessId}": { - "get": { - "tags": [ - "business-service" - ], - "summary": "getResponseEntity", - "operationId": "getResponseEntityUsingGET", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*", - "application/json" - ], - "parameters": [ - { - "name": "businessId", - "in": "path", - "description": "businessId", - "required": true, - "type": "string" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "string" - } - } - } - } - }, - "/businesses/typeEcho": { - "post": { - "tags": [ - "business-service" - ], - "summary": "businessTypeEcho", - "operationId": "businessTypeEchoUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "application/json" - ], - "parameters": [ - { - "in": "body", - "name": "body", - "description": "business", - "required": false, - "schema": { - "$ref": "#/definitions/string" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "string" - } - } - } - } - }, - "/businesses/vanilla/{businessId}": { - "get": { - "tags": [ - "business-service" - ], - "summary": "getVanillaPathVariable", - "operationId": "getVanillaPathVariableUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*", - "application/json" - ], - "parameters": [ - { - "name": "businessId", - "in": "path", - "description": "businessId", - "required": true, - "type": "string" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "string" - } - } - } - } - }, - "/child/child-method": { - "get": { - "tags": [ - "inherited-service-impl" - ], - "summary": "getSomething", - "operationId": "getSomethingUsingGET", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "body", - "description": "parameter", - "required": false, - "schema": { - "$ref": "#/definitions/string" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "string" - } - } - } - } - }, - "/configprops": { - "get": { - "tags": [ - "endpoint-mvc-adapter" - ], - "summary": "invoke", - "operationId": "invokeUsingGET", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "object" - } - } - } - } - }, - "/dump": { - "get": { - "tags": [ - "endpoint-mvc-adapter" - ], - "summary": "invoke", - "operationId": "invokeUsingGET", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "object" - } - } - } - } - }, - "/env": { - "get": { - "tags": [ - "environment-mvc-endpoint" - ], - "summary": "invoke", - "operationId": "invokeUsingGET", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "object" - } - } - } - } - }, - "/env/{name}": { - "get": { - "tags": [ - "environment-mvc-endpoint" - ], - "summary": "value", - "operationId": "valueUsingGET", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "name", - "in": "path", - "description": "name", - "required": true, - "type": "string" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "object" - } - } - } - } - }, - "/error": { - "get": { - "tags": [ - "basic-error-controller" - ], - "summary": "errorHtml", - "operationId": "errorHtmlUsingGET", - "consumes": [ - "application/json" - ], - "produces": [ - "text/html" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/ModelAndView" - } - } - } - }, - "post": { - "tags": [ - "basic-error-controller" - ], - "summary": "errorHtml", - "operationId": "errorHtmlUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "text/html" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/ModelAndView" - } - } - } - }, - "put": { - "tags": [ - "basic-error-controller" - ], - "summary": "errorHtml", - "operationId": "errorHtmlUsingPUT", - "consumes": [ - "application/json" - ], - "produces": [ - "text/html" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/ModelAndView" - } - } - } - }, - "delete": { - "tags": [ - "basic-error-controller" - ], - "summary": "errorHtml", - "operationId": "errorHtmlUsingDELETE", - "consumes": [ - "application/json" - ], - "produces": [ - "text/html" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/ModelAndView" - } - } - } - }, - "options": { - "tags": [ - "basic-error-controller" - ], - "summary": "errorHtml", - "operationId": "errorHtmlUsingOPTIONS", - "consumes": [ - "application/json" - ], - "produces": [ - "text/html" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/ModelAndView" - } - } - } - }, - "patch": { - "tags": [ - "basic-error-controller" - ], - "summary": "errorHtml", - "operationId": "errorHtmlUsingPATCH", - "consumes": [ - "application/json" - ], - "produces": [ - "text/html" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/ModelAndView" - } - } - } - } - }, - "/fancypets": { - "post": { - "tags": [ - "fancy-pet-service" - ], - "summary": "createObject", - "operationId": "createObjectUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "body", - "description": "object", - "required": false, - "schema": { - "$ref": "#/definitions/FancyPet" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "integer", - "format": "int32" - } - } - } - }, - "put": { - "tags": [ - "fancy-pet-service" - ], - "summary": "updatePet", - "operationId": "updatePetUsingPUT", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "body", - "description": "pet", - "required": false, - "schema": { - "$ref": "#/definitions/Pet" - } - } - ], - "responses": { - "200": { - "description": "OK" - } - } - } - }, - "/fancypets/?{someId}": { - "post": { - "tags": [ - "fancy-pet-service" - ], - "summary": "createObject", - "operationId": "createObjectUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "body", - "description": "object", - "required": false, - "schema": { - "$ref": "#/definitions/FancyPet" - } - }, - { - "name": "someId", - "in": "path", - "description": "someId", - "required": true, - "type": "integer", - "format": "int32" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "integer", - "format": "int32" - } - } - } - } - }, - "/features": { - "get": { - "tags": [ - "feature-demonstration-service" - ], - "summary": "all", - "operationId": "allUsingGET", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "string" - } - } - } - }, - "post": { - "tags": [ - "feature-demonstration-service" - ], - "summary": "all", - "operationId": "allUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "string" - } - } - } - }, - "put": { - "tags": [ - "feature-demonstration-service" - ], - "summary": "all", - "operationId": "allUsingPUT", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "string" - } - } - } - }, - "delete": { - "tags": [ - "feature-demonstration-service" - ], - "summary": "all", - "operationId": "allUsingDELETE", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "string" - } - } - } - }, - "options": { - "tags": [ - "feature-demonstration-service" - ], - "summary": "all", - "operationId": "allUsingOPTIONS", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "string" - } - } - } - }, - "patch": { - "tags": [ - "feature-demonstration-service" - ], - "summary": "all", - "operationId": "allUsingPATCH", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "string" - } - } - } - } - }, - "/features/allMethodsAllowed": { - "get": { - "tags": [ - "feature-demonstration-service" - ], - "summary": "allMethodAllowed", - "operationId": "allMethodAllowedUsingGET", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "responses": { - "200": { - "description": "OK" - } - } - }, - "post": { - "tags": [ - "feature-demonstration-service" - ], - "summary": "allMethodAllowed", - "operationId": "allMethodAllowedUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "responses": { - "200": { - "description": "OK" - } - } - }, - "put": { - "tags": [ - "feature-demonstration-service" - ], - "summary": "allMethodAllowed", - "operationId": "allMethodAllowedUsingPUT", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "responses": { - "200": { - "description": "OK" - } - } - }, - "delete": { - "tags": [ - "feature-demonstration-service" - ], - "summary": "allMethodAllowed", - "operationId": "allMethodAllowedUsingDELETE", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "responses": { - "200": { - "description": "OK" - } - } - }, - "options": { - "tags": [ - "feature-demonstration-service" - ], - "summary": "allMethodAllowed", - "operationId": "allMethodAllowedUsingOPTIONS", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "responses": { - "200": { - "description": "OK" - } - } - }, - "patch": { - "tags": [ - "feature-demonstration-service" - ], - "summary": "allMethodAllowed", - "operationId": "allMethodAllowedUsingPATCH", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "responses": { - "200": { - "description": "OK" - } - } - } - }, - "/features/bare": { - "post": { - "tags": [ - "feature-demonstration-service" - ], - "summary": "getBare", - "operationId": "getBareUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "body", - "description": "example", - "required": false, - "schema": { - "$ref": "#/definitions/Example" - } - } - ], - "responses": { - "200": { - "description": "OK" - } - } - } - }, - "/features/bigDecimal": { - "post": { - "tags": [ - "feature-demonstration-service" - ], - "summary": "updateBigDecimal", - "operationId": "updateBigDecimalUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "body", - "description": "input", - "required": false, - "schema": { - "$ref": "#/definitions/double" - } - } - ], - "responses": { - "200": { - "description": "OK" - } - } - } - }, - "/features/date": { - "post": { - "tags": [ - "feature-demonstration-service" - ], - "summary": "updateDate", - "operationId": "updateDateUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "body", - "description": "localDate", - "required": false, - "schema": { - "$ref": "#/definitions/LocalDate" - } - } - ], - "responses": { - "200": { - "description": "OK" - } - } - } - }, - "/features/effective": { - "get": { - "tags": [ - "feature-demonstration-service" - ], - "summary": "getEffective", - "operationId": "getEffectiveUsingGET", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/Example" - } - } - } - } - }, - "/features/effectives": { - "get": { - "tags": [ - "feature-demonstration-service" - ], - "summary": "getEffectives", - "operationId": "getEffectivesUsingGET", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/Example" - } - } - } - } - }, - "/features/enumObject": { - "get": { - "tags": [ - "enum-object-demonstration-service" - ], - "summary": "getEnumObject", - "operationId": "getEnumObjectUsingGET", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/EnumObjectType" - } - } - } - } - }, - "/features/status": { - "post": { - "tags": [ - "feature-demonstration-service" - ], - "summary": "updateBaz", - "operationId": "updateBazUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "body", - "description": "enumType", - "required": false, - "schema": { - "$ref": "#/definitions/string" - } - } - ], - "responses": { - "200": { - "description": "OK" - } - } - } - }, - "/features/statuses": { - "post": { - "tags": [ - "feature-demonstration-service" - ], - "summary": "updateBazes", - "operationId": "updateBazesUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "body", - "description": "enumType", - "required": false, - "schema": { - "$ref": "#/definitions/Collection«string»" - } - } - ], - "responses": { - "200": { - "description": "OK" - } - } - } - }, - "/features/{petId}": { - "get": { - "tags": [ - "feature-demonstration-service" - ], - "summary": "Find pet by ID", - "description": "Returns a pet when ID < 10. ID > 10 or non-integers will simulate API error conditions", - "operationId": "getPetByIdUsingGET", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "petId", - "in": "path", - "description": "ID of pet that needs to be fetched", - "required": true, - "type": "string" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/Pet" - } - } - } - } - }, - "/foo/create-t": { - "put": { - "tags": [ - "concrete-controller" - ], - "summary": "create", - "operationId": "createUsingPUT", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "body", - "description": "toCreate", - "required": false, - "schema": { - "$ref": "#/definitions/Pet" - } - } - ], - "responses": { - "200": { - "description": "OK" - } - } - } - }, - "/foo/get-t": { - "get": { - "tags": [ - "concrete-controller" - ], - "summary": "get", - "operationId": "getUsingPUT", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "responses": { - "405": { - "description": "Invalid input" - }, - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/Pet" - } - } - } - } - }, - "/health": { - "get": { - "tags": [ - "health-mvc-endpoint" - ], - "summary": "invoke", - "operationId": "invokeUsingGET", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "object" - } - } - } - }, - "post": { - "tags": [ - "health-mvc-endpoint" - ], - "summary": "invoke", - "operationId": "invokeUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "object" - } - } - } - }, - "put": { - "tags": [ - "health-mvc-endpoint" - ], - "summary": "invoke", - "operationId": "invokeUsingPUT", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "object" - } - } - } - }, - "delete": { - "tags": [ - "health-mvc-endpoint" - ], - "summary": "invoke", - "operationId": "invokeUsingDELETE", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "object" - } - } - } - }, - "options": { - "tags": [ - "health-mvc-endpoint" - ], - "summary": "invoke", - "operationId": "invokeUsingOPTIONS", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "object" - } - } - } - }, - "patch": { - "tags": [ - "health-mvc-endpoint" - ], - "summary": "invoke", - "operationId": "invokeUsingPATCH", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "object" - } - } - } - } - }, - "/info": { - "get": { - "tags": [ - "endpoint-mvc-adapter" - ], - "summary": "invoke", - "operationId": "invokeUsingGET", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "object" - } - } - } - } - }, - "/mappings": { - "get": { - "tags": [ - "endpoint-mvc-adapter" - ], - "summary": "invoke", - "operationId": "invokeUsingGET", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "object" - } - } - } - } - }, - "/metrics": { - "get": { - "tags": [ - "metrics-mvc-endpoint" - ], - "summary": "invoke", - "operationId": "invokeUsingGET", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "object" - } - } - } - } - }, - "/metrics/{name}": { - "get": { - "tags": [ - "metrics-mvc-endpoint" - ], - "summary": "value", - "operationId": "valueUsingGET", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "name", - "in": "path", - "description": "name", - "required": true, - "type": "string" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "object" - } - } - } - } - }, - "/no-request-mapping": { - "get": { - "tags": [ - "controller-with-no-request-mapping-service" - ], - "summary": "exampleWithNoRequestMapping", - "operationId": "exampleWithNoRequestMappingUsingGET", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/Example" - } - } - } - } - }, - "/petgrooming": { - "get": { - "tags": [ - "pet-grooming-service" - ], - "summary": "canGroom", - "operationId": "canGroomUsingGET", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "type", - "in": "query", - "description": "type", - "required": true, - "type": "string" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "boolean" - } - } - } - } - }, - "/petgrooming/voidMethod/{input}": { - "delete": { - "tags": [ - "pet-grooming-service" - ], - "summary": "groomingFunctionThatReturnsVoid", - "operationId": "groomingFunctionThatReturnsVoidUsingDELETE", - "consumes": [ - "application/json" - ], - "parameters": [ - { - "name": "input", - "in": "path", - "description": "input", - "required": true, - "type": "string" - } - ], - "responses": { - "200": { - "description": "Just testing" - } - } - } - }, - "/pets": { - "get": { - "tags": [ - "pet-service" - ], - "summary": "List all pets", - "operationId": "listPetsUsingGET", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/Pet" - } - } - } - } - }, - "post": { - "tags": [ - "pet-service" - ], - "summary": "Add a new pet to the store", - "operationId": "addPetUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "body", - "description": "Pet object that needs to be added to the store", - "required": true, - "schema": { - "$ref": "#/definitions/Pet" - } - } - ], - "responses": { - "405": { - "description": "Invalid input" - }, - "200": { - "description": "OK" - } - } - }, - "put": { - "tags": [ - "pet-service" - ], - "summary": "Update an existing pet", - "operationId": "updatePetUsingPUT", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "body", - "description": "Pet object that needs to be added to the store", - "required": true, - "schema": { - "$ref": "#/definitions/Pet" - } - } - ], - "responses": { - "405": { - "description": "Validation exception" - }, - "404": { - "description": "Pet not found" - }, - "200": { - "description": "OK" - }, - "400": { - "description": "Invalid ID supplied" - } - } - } - }, - "/pets/byName/{name}": { - "post": { - "tags": [ - "pet-service" - ], - "summary": "petEntities", - "operationId": "petEntitiesUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "name", - "in": "path", - "description": "name", - "required": true, - "type": "string" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/Pet" - } - } - } - } - } - }, - "/pets/echo": { - "post": { - "tags": [ - "pet-service" - ], - "summary": "echo", - "operationId": "echoUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "body", - "description": "someInput", - "required": false, - "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/Entry«string,Pet»" - } - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/Entry«string,Pet»" - } - } - } - } - } - }, - "/pets/findByStatus": { - "get": { - "tags": [ - "pet-service" - ], - "summary": "Finds Pets by status", - "description": "Multiple status values can be provided with comma-separated strings", - "operationId": "findPetsByStatusUsingGET", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "status", - "in": "query", - "description": "Status values that need to be considered for filter", - "required": true, - "type": "string", - "default": "available" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/Pet" - } - }, - "400": { - "description": "Invalid status value" - } - } - } - }, - "/pets/findByTags": { - "get": { - "tags": [ - "pet-service" - ], - "summary": "Finds Pets by tags", - "description": "Multiple tags can be provided with comma-separated strings. Use tag1, tag2, tag3 for testing.", - "operationId": "findPetsByTagsUsingGET", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "tags", - "in": "query", - "description": "Tags to filter by", - "required": true, - "type": "string" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/Pet" - } - }, - "400": { - "description": "Invalid tag value" - } - }, - "deprecated": true - } - }, - "/pets/grooming": { - "get": { - "tags": [ - "pet-grooming-service" - ], - "summary": "canGroom", - "operationId": "canGroomUsingGET", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "type", - "in": "query", - "description": "type", - "required": true, - "type": "string" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "boolean" - } - } - } - } - }, - "/pets/grooming/voidMethod/{input}": { - "delete": { - "tags": [ - "pet-grooming-service" - ], - "summary": "groomingFunctionThatReturnsVoid", - "operationId": "groomingFunctionThatReturnsVoidUsingGET", - "consumes": [ - "application/json" - ], - "parameters": [ - { - "name": "input", - "in": "path", - "description": "input", - "required": true, - "type": "string" - } - ], - "responses": { - "200": { - "description": "Just testing" - } - } - } - }, - "/pets/nameToNickNamesMap": { - "post": { - "tags": [ - "pet-service" - ], - "summary": "nameToNickNamesMap", - "operationId": "nameToNickNamesMapUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/Entry«string,List«string»»" - } - } - } - } - } - }, - "/pets/siblings": { - "post": { - "tags": [ - "pet-service" - ], - "summary": "siblings", - "operationId": "siblingsUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "body", - "description": "pet", - "required": false, - "schema": { - "$ref": "#/definitions/Pet" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/Pet" - } - } - } - } - } - }, - "/pets/transformPetNameToPetMapToAny": { - "post": { - "tags": [ - "pet-service" - ], - "summary": "transformPetNameToPetMapToAny", - "operationId": "transformPetNameToPetMapToAnyUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "body", - "description": "someInput", - "required": false, - "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/Entry«string,Pet»" - } - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "object" - } - } - } - } - }, - "/pets/transformPetNameToPetMapToGenericOpenMap": { - "post": { - "tags": [ - "pet-service" - ], - "summary": "transformPetNameToPetMapToGenericOpenMap", - "operationId": "transformPetNameToPetMapToGenericOpenMapUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "body", - "description": "someInput", - "required": false, - "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/Entry«string,Pet»" - } - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "object" - } - } - } - } - }, - "/pets/transformPetNameToPetMapToOpenMap": { - "post": { - "tags": [ - "pet-service" - ], - "summary": "transformPetNameToPetMapToOpenMap", - "operationId": "transformPetNameToPetMapToOpenMapUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "body", - "description": "someInput", - "required": false, - "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/Entry«string,Pet»" - } - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "object" - } - } - } - } - }, - "/pets/voidMethod/{input}": { - "delete": { - "tags": [ - "pet-grooming-service" - ], - "summary": "groomingFunctionThatReturnsVoid", - "operationId": "groomingFunctionThatReturnsVoidUsingDELETE", - "consumes": [ - "application/json" - ], - "parameters": [ - { - "name": "input", - "in": "path", - "description": "input", - "required": true, - "type": "string" - } - ], - "responses": { - "200": { - "description": "Just testing" - } - } - } - }, - "/pets/{a}/{b}": { - "get": { - "tags": [ - "pet-service" - ], - "summary": "method", - "operationId": "methodUsingGET", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "a", - "in": "path", - "description": "a", - "required": true, - "type": "string" - }, - { - "name": "b", - "in": "path", - "description": "b", - "required": true, - "type": "string" - } - ], - "responses": { - "200": { - "description": "OK" - } - } - } - }, - "/pets/{name}": { - "post": { - "tags": [ - "pet-service" - ], - "summary": "petByName", - "operationId": "petByNameUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "name", - "in": "path", - "description": "name", - "required": true, - "type": "string" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/Pet" - } - } - } - } - }, - "/pets/{petId}": { - "get": { - "tags": [ - "pet-service" - ], - "summary": "Find pet by ID", - "description": "Returns a pet when ID < 10. ID > 10 or non-integers will simulate API error conditions", - "operationId": "getPetByIdUsingGET", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "petId", - "in": "path", - "description": "ID of pet that needs to be fetched", - "required": true, - "type": "string" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/Pet" - } - } - } - } - }, - "/pets/{petId}/pic": { - "post": { - "tags": [ - "pet-service" - ], - "summary": "updatePic", - "operationId": "updatePicUsingPOST", - "consumes": [ - "multipart/form-data" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "petId", - "in": "path", - "description": "petId", - "required": true, - "type": "string" - }, - { - "name": "pic", - "in": "formData", - "description": "pic", - "required": false, - "type": "ref" - } - ], - "responses": { - "200": { - "description": "OK" - } - } - } - }, - "/pets/{petId}/pic/{picId}": { - "get": { - "tags": [ - "pet-service" - ], - "summary": "updatePic", - "operationId": "updatePicUsingGET", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "petId", - "in": "path", - "description": "petId", - "required": true, - "type": "string" - }, - { - "name": "picId", - "in": "path", - "description": "picId", - "required": true, - "type": "string" - } - ], - "responses": { - "200": { - "description": "OK" - } - } - } - }, - "/trace": { - "get": { - "tags": [ - "endpoint-mvc-adapter" - ], - "summary": "invoke", - "operationId": "invokeUsingGET", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "object" - } - } - } - } - } - }, - "securityDefinitions": { - "api_key": { - "type": "apiKey", - "name": "api_key", - "in": "header" - }, - "petstore_auth": { - "type": "oauth2", - "authorizationUrl": "http://petstore.swagger.io/api/oauth/dialog", - "flow": "implicit", - "scopes": { - "write:pets": "modify pets in your account", - "read:pets": "read your pets" - } - } - }, - "definitions": { - "User": { - "type": "object", - "properties": { - "email": { - "type": "string" - }, - "firstName": { - "type": "string" - }, - "id": { - "type": "integer", - "format": "int64" - }, - "identifier": { - "type": "string" - }, - "lastName": { - "type": "string" - }, - "password": { - "type": "string" - }, - "phone": { - "type": "string" - }, - "userStatus": { - "type": "integer", - "format": "int32", - "description": "User Status" - }, - "username": { - "type": "string" - } - } - }, - "DateTimeField": { - "type": "object", - "properties": { - "durationField": { - "$ref": "#/definitions/DurationField" - }, - "leapDurationField": { - "$ref": "#/definitions/DurationField" - }, - "lenient": { - "type": "boolean" - }, - "maximumValue": { - "type": "integer", - "format": "int32" - }, - "minimumValue": { - "type": "integer", - "format": "int32" - }, - "name": { - "type": "string" - }, - "rangeDurationField": { - "$ref": "#/definitions/DurationField" - }, - "supported": { - "type": "boolean" - }, - "type": { - "$ref": "#/definitions/DateTimeFieldType" - } - } - }, - "Biz": { - "type": "object", - "properties": { - "businessType": { - "type": "string", - "enum": [ - "PRODUCT", - "SERVICE" - ] - }, - "id": { - "type": "integer", - "format": "int32" - }, - "inception": { - "$ref": "#/definitions/LocalDate" - }, - "name": { - "type": "string" - }, - "owner": { - "type": "string" - }, - "taxDate": { - "type": "string", - "format": "date-time" - } - } - }, - "Entry«string,List«string»»": { - "type": "object", - "properties": { - "key": { - "type": "array", - "items": { - "type": "string" - } - } - } - }, - "Void": {}, - "Order": { - "type": "object", - "properties": { - "complete": { - "type": "boolean" - }, - "id": { - "type": "integer", - "format": "int64" - }, - "identifier": { - "type": "integer", - "format": "int64" - }, - "petId": { - "type": "integer", - "format": "int64" - }, - "quantity": { - "type": "integer", - "format": "int32" - }, - "shipDate": { - "type": "string", - "format": "date-time" - }, - "status": { - "type": "string", - "description": "Order Status", - "enum": [ - "placed", - "approved", - "delivered" - ] - } - } - }, - "LocalDateTime": { - "type": "object", - "properties": { - "centuryOfEra": { - "type": "integer", - "format": "int32" - }, - "chronology": { - "$ref": "#/definitions/Chronology" - }, - "dayOfMonth": { - "type": "integer", - "format": "int32" - }, - "dayOfWeek": { - "type": "integer", - "format": "int32" - }, - "dayOfYear": { - "type": "integer", - "format": "int32" - }, - "era": { - "type": "integer", - "format": "int32" - }, - "fieldTypes": { - "type": "array", - "items": { - "$ref": "#/definitions/DateTimeFieldType" - } - }, - "fields": { - "type": "array", - "items": { - "$ref": "#/definitions/DateTimeField" - } - }, - "hourOfDay": { - "type": "integer", - "format": "int32" - }, - "millisOfDay": { - "type": "integer", - "format": "int32" - }, - "millisOfSecond": { - "type": "integer", - "format": "int32" - }, - "minuteOfHour": { - "type": "integer", - "format": "int32" - }, - "monthOfYear": { - "type": "integer", - "format": "int32" - }, - "secondOfMinute": { - "type": "integer", - "format": "int32" - }, - "values": { - "type": "array", - "items": { - "type": "integer", - "format": "int32" - } - }, - "weekOfWeekyear": { - "type": "integer", - "format": "int32" - }, - "weekyear": { - "type": "integer", - "format": "int32" - }, - "year": { - "type": "integer", - "format": "int32" - }, - "yearOfCentury": { - "type": "integer", - "format": "int32" - }, - "yearOfEra": { - "type": "integer", - "format": "int32" - } - } - }, - "DurationField": { - "type": "object", - "properties": { - "name": { - "type": "string" - }, - "precise": { - "type": "boolean" - }, - "supported": { - "type": "boolean" - }, - "type": { - "$ref": "#/definitions/DurationFieldType" - }, - "unitMillis": { - "type": "integer", - "format": "int64" - } - } - }, - "View": { - "type": "object", - "properties": { - "contentType": { - "type": "string" - } - } - }, - "Category": { - "type": "object", - "properties": { - "id": { - "type": "integer", - "format": "int64" - }, - "name": { - "type": "string" - } - } - }, - "Example": { - "type": "object", - "properties": { - "allCapsSet": { - "type": "array", - "items": { - "type": "string" - } - }, - "annotatedEnumType": { - "type": "string", - "enum": [ - "ONE", - "TWO" - ] - }, - "bar": { - "type": "integer", - "format": "int32", - "description": "description of bar" - }, - "enumType": { - "type": "string", - "enum": [ - "ONE", - "TWO" - ] - }, - "foo": { - "type": "string" - }, - "localDateTime": { - "$ref": "#/definitions/LocalDateTime" - }, - "nestedType": { - "$ref": "#/definitions/NestedType" - }, - "parentBeanProperty": { - "type": "string" - }, - "propertyWithNoSetterMethod": { - "type": "string" - } - } - }, - "EnumObjectType": { - "type": "object", - "properties": { - "name": { - "type": "string" - }, - "description": { - "type": "string" - } - } - }, - "DateTimeZone": { - "type": "object", - "properties": { - "fixed": { - "type": "boolean" - } - } - }, - "Pet": { - "type": "object", - "properties": { - "age": { - "type": "integer", - "format": "int32" - }, - "id": { - "type": "string" - }, - "name": { - "type": "string" - } - } - }, - "LocalDate": { - "type": "object", - "properties": { - "centuryOfEra": { - "type": "integer", - "format": "int32" - }, - "chronology": { - "$ref": "#/definitions/Chronology" - }, - "dayOfMonth": { - "type": "integer", - "format": "int32" - }, - "dayOfWeek": { - "type": "integer", - "format": "int32" - }, - "dayOfYear": { - "type": "integer", - "format": "int32" - }, - "era": { - "type": "integer", - "format": "int32" - }, - "fieldTypes": { - "type": "array", - "items": { - "$ref": "#/definitions/DateTimeFieldType" - } - }, - "fields": { - "type": "array", - "items": { - "$ref": "#/definitions/DateTimeField" - } - }, - "monthOfYear": { - "type": "integer", - "format": "int32" - }, - "values": { - "type": "array", - "items": { - "type": "integer", - "format": "int32" - } - }, - "weekOfWeekyear": { - "type": "integer", - "format": "int32" - }, - "weekyear": { - "type": "integer", - "format": "int32" - }, - "year": { - "type": "integer", - "format": "int32" - }, - "yearOfCentury": { - "type": "integer", - "format": "int32" - }, - "yearOfEra": { - "type": "integer", - "format": "int32" - } - } - }, - "DurationFieldType": { - "type": "object", - "properties": { - "name": { - "type": "string" - } - } - }, - "Tag": { - "type": "object", - "properties": { - "id": { - "type": "integer", - "format": "int64" - }, - "name": { - "type": "string" - } - } - }, - "Entry«string,Pet»": { - "type": "object", - "properties": { - "key": { - "$ref": "#/definitions/Pet" - } - } - }, - "ModelAndView": { - "type": "object", - "properties": { - "empty": { - "type": "boolean" - }, - "model": { - "type": "object" - }, - "modelMap": { - "$ref": "#/definitions/ModelMap" - }, - "reference": { - "type": "boolean" - }, - "view": { - "$ref": "#/definitions/View" - }, - "viewName": { - "type": "string" - } - } - }, - "NestedType": { - "type": "object", - "properties": { - "name": { - "type": "string" - } - } - }, - "ModelMap": { - "type": "object", - "properties": { - "empty": { - "type": "boolean" - } - } - }, - "Chronology": { - "type": "object", - "properties": { - "zone": { - "$ref": "#/definitions/DateTimeZone" - } - } - }, - "FancyPet": { - "type": "object", - "properties": { - "age": { - "type": "integer", - "format": "int32" - }, - "id": { - "type": "string" - }, - "name": { - "type": "string" - } - } - }, - "DateTimeFieldType": { - "type": "object", - "properties": { - "durationType": { - "$ref": "#/definitions/DurationFieldType" - }, - "name": { - "type": "string" - }, - "rangeDurationType": { - "$ref": "#/definitions/DurationFieldType" - } - } - } - } -} \ No newline at end of file diff --git a/swagger-contract-tests/src/test/resources/contract/swagger2/declaration-same-controller.json b/swagger-contract-tests/src/test/resources/contract/swagger2/declaration-same-controller.json deleted file mode 100644 index c88b4595983..00000000000 --- a/swagger-contract-tests/src/test/resources/contract/swagger2/declaration-same-controller.json +++ /dev/null @@ -1,347 +0,0 @@ -{ - "swagger": "2.0", - "info": { - "description": "Api Documentation", - "version": "1.0", - "title": "Api Documentation", - "termsOfService": "urn:tos", - "contact": { - - }, - "license": { - "name": "Apache 2.0", - "url": "http://www.apache.org/licenses/LICENSE-2.0" - } - }, - "host": "localhost:__PORT__", - "basePath": "/", - "tags": [ - { - "name": "same-controller", - "description": "Same Controller" - } - ], - "produces": [ - "application/json", - "application/xml" - ], - "paths": { - "/same/create-same": { - "put": { - "tags": [ - "same-controller" - ], - "summary": "create", - "operationId": "createUsingPUT_3", - "consumes": [ - "application/json" - ], - "parameters": [ - { - "in": "body", - "name": "toCreate", - "description": "toCreate", - "required": true, - "schema": { - "$ref": "#/definitions/ModelWithSameNameClassesReq" - } - } - ], - "responses": { - "200": { - "description": "OK" - } - } - } - }, - "/same/get-same/{id}": { - "get": { - "tags": [ - "same-controller" - ], - "summary": "get", - "operationId": "getUsingGET_3", - "parameters": [ - { - "name": "id", - "in": "path", - "description": "id", - "required": true, - "type": "string" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/ModelWithSameNameClassesRes" - } - }, - "405": { - "description": "Invalid input" - } - } - } - } - }, - "securityDefinitions": { - "api_key": { - "type": "apiKey", - "name": "api_key", - "in": "header" - }, - "petstore_auth": { - "type": "oauth2", - "authorizationUrl": "http://petstore.swagger.io/api/oauth/dialog", - "flow": "implicit", - "scopes": { - "write:pets": "modify pets in your account", - "read:pets": "read your pets" - } - } - }, - "definitions": { - "Category": { - "type": "object", - "properties": { - "name": { - "type": "string" - } - }, - "title": "Category" - }, - "FancyPet": { - "type": "object", - "properties": { - "age": { - "type": "integer", - "format": "int32" - }, - "categories": { - "type": "array", - "items": { - "$ref": "#/definitions/Category" - } - }, - "id": { - "type": "string" - }, - "name": { - "type": "string" - } - }, - "title": "FancyPet" - }, - "ModelWithSameNameClassesReq": { - "type": "object", - "properties": { - "crazyFancyPets": { - "type": "array", - "items": { - "type": "array", - "items": { - "type": "array", - "items": { - "type": "array", - "items": { - "$ref": "#/definitions/FancyPet" - } - } - } - } - }, - "fancyPet": { - "$ref": "#/definitions/FancyPet" - }, - "fancyPets": { - "type": "array", - "items": { - "$ref": "#/definitions/FancyPet" - } - }, - "fancyPetsMap": { - "type": "object", - "additionalProperties": { - "$ref": "#/definitions/SameFancyPetReq" - } - }, - "madFancyPets": { - "type": "object", - "additionalProperties": { - "type": "array", - "items": { - "type": "array", - "items": { - "$ref": "#/definitions/SameFancyPetReq" - } - } - } - }, - "moreFancyPet": { - "$ref": "#/definitions/SameFancyPetReq" - }, - "weirdFancyPets": { - "type": "array", - "items": { - "type": "array", - "items": { - "type": "array", - "items": { - "type": "array", - "items": { - "$ref": "#/definitions/SameFancyPetReq" - } - } - } - } - } - }, - "title": "ModelWithSameNameClassesReq" - }, - "ModelWithSameNameClassesRes": { - "type": "object", - "properties": { - "crazyFancyPets": { - "type": "array", - "items": { - "type": "array", - "items": { - "type": "array", - "items": { - "type": "array", - "items": { - "$ref": "#/definitions/FancyPet" - } - } - } - } - }, - "fancyPet": { - "$ref": "#/definitions/FancyPet" - }, - "fancyPets": { - "type": "array", - "items": { - "$ref": "#/definitions/FancyPet" - } - }, - "fancyPetsMap": { - "type": "object", - "additionalProperties": { - "$ref": "#/definitions/SameFancyPetRes" - } - }, - "madFancyPets": { - "type": "object", - "additionalProperties": { - "type": "array", - "items": { - "type": "array", - "items": { - "$ref": "#/definitions/SameFancyPetRes" - } - } - } - }, - "moreFancyPet": { - "$ref": "#/definitions/SameFancyPetRes" - }, - "weirdFancyPets": { - "type": "array", - "items": { - "type": "array", - "items": { - "type": "array", - "items": { - "type": "array", - "items": { - "$ref": "#/definitions/SameFancyPetRes" - } - } - } - } - } - }, - "title": "ModelWithSameNameClassesRes" - }, - "SameCategoryReq": { - "type": "object", - "required": [ - "id" - ], - "properties": { - "id": { - "type": "integer", - "format": "int32", - "description": "Id field" - }, - "name": { - "type": "string" - } - }, - "title": "SameCategoryReq" - }, - "SameCategoryRes": { - "type": "object", - "properties": { - "_type": { - "type": "string", - "description": "Type field", - "readOnly": true - }, - "name": { - "type": "string" - } - }, - "title": "SameCategoryRes" - }, - "SameFancyPetReq": { - "type": "object", - "properties": { - "age": { - "type": "integer", - "format": "int32" - }, - "color": { - "type": "string" - }, - "extendedCategory": { - "$ref": "#/definitions/SameCategoryReq" - }, - "id": { - "type": "string" - }, - "name": { - "type": "string" - }, - "pet_weight": { - "type": "number", - "format": "double" - } - }, - "title": "SameFancyPetReq" - }, - "SameFancyPetRes": { - "type": "object", - "properties": { - "age": { - "type": "integer", - "format": "int32" - }, - "color": { - "type": "string" - }, - "extendedCategory": { - "$ref": "#/definitions/SameCategoryRes" - }, - "id": { - "type": "string" - }, - "name": { - "type": "string" - } - }, - "title": "SameFancyPetRes" - } - } -} \ No newline at end of file diff --git a/swagger-contract-tests/src/test/resources/contract/swagger2/declaration-spring-data-rest.json b/swagger-contract-tests/src/test/resources/contract/swagger2/declaration-spring-data-rest.json deleted file mode 100644 index 61450a727fb..00000000000 --- a/swagger-contract-tests/src/test/resources/contract/swagger2/declaration-spring-data-rest.json +++ /dev/null @@ -1,2019 +0,0 @@ -{ - "swagger": "2.0", - "info": { - "description": "Api Documentation", - "version": "1.0", - "title": "Api Documentation", - "termsOfService": "urn:tos", - "contact": { - - }, - "license": { - "name": "Apache 2.0", - "url": "http://www.apache.org/licenses/LICENSE-2.0" - } - }, - "host": "localhost:__PORT__", - "basePath": "/", - "tags": [ - { - "name": "Address Entity", - "description": "Simple Jpa Repository" - }, - { - "name": "Person Entity", - "description": "Simple Jpa Repository" - }, - { - "name": "Tag Entity", - "description": "Simple Jpa Repository" - }, - { - "name": "person-controller", - "description": "Person Controller" - } - ], - "produces": [ - "application/json", - "application/xml" - ], - "paths": { - "/rest/addresses": { - "post": { - "tags": [ - "Address Entity" - ], - "summary": "saveAddress", - "operationId": "saveAddressUsingPOST_1", - "consumes": [ - "application/json" - ], - "parameters": [ - { - "in": "body", - "name": "body", - "description": "body", - "required": true, - "schema": { - "$ref": "#/definitions/Address" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/EntityModelOfAddress" - } - } - } - } - }, - "/rest/addresses/{id}": { - "get": { - "tags": [ - "Address Entity" - ], - "summary": "findByIdAddress", - "operationId": "findByIdAddressUsingGET_1", - "parameters": [ - { - "name": "id", - "in": "path", - "description": "id", - "required": true, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/EntityModelOfAddress" - } - } - } - }, - "put": { - "tags": [ - "Address Entity" - ], - "summary": "saveAddress", - "operationId": "saveAddressUsingPUT_1", - "consumes": [ - "application/json" - ], - "parameters": [ - { - "in": "body", - "name": "body", - "description": "body", - "required": true, - "schema": { - "$ref": "#/definitions/Address" - } - }, - { - "name": "id", - "in": "path", - "description": "id", - "required": true, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/EntityModelOfAddress" - } - } - } - }, - "delete": { - "tags": [ - "Address Entity" - ], - "summary": "deleteAddress", - "operationId": "deleteAddressUsingDELETE_1", - "parameters": [ - { - "name": "id", - "in": "path", - "description": "id", - "required": true, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK" - } - } - }, - "patch": { - "tags": [ - "Address Entity" - ], - "summary": "saveAddress", - "operationId": "saveAddressUsingPATCH_1", - "consumes": [ - "application/json" - ], - "parameters": [ - { - "in": "body", - "name": "body", - "description": "body", - "required": true, - "schema": { - "$ref": "#/definitions/Address" - } - }, - { - "name": "id", - "in": "path", - "description": "id", - "required": true, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/EntityModelOfAddress" - } - } - } - } - }, - "/rest/addresses/{id}/person": { - "get": { - "tags": [ - "Address Entity" - ], - "summary": "addressPerson", - "operationId": "addressPersonUsingGET_1", - "produces": [ - "application/hal+json" - ], - "parameters": [ - { - "name": "id", - "in": "path", - "description": "id", - "required": true, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/EntityModelOfPerson" - } - } - } - }, - "post": { - "tags": [ - "Address Entity" - ], - "summary": "addressPerson", - "operationId": "addressPersonUsingPOST_1", - "consumes": [ - "text/uri-list", - "application/x-spring-data-compact+json" - ], - "parameters": [ - { - "in": "body", - "name": "body", - "description": "body", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "id", - "in": "path", - "description": "id", - "required": true, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/EntityModelOfPerson" - } - } - } - }, - "put": { - "tags": [ - "Address Entity" - ], - "summary": "addressPerson", - "operationId": "addressPersonUsingPUT_1", - "consumes": [ - "text/uri-list", - "application/x-spring-data-compact+json" - ], - "parameters": [ - { - "in": "body", - "name": "body", - "description": "body", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "id", - "in": "path", - "description": "id", - "required": true, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/EntityModelOfPerson" - } - } - } - }, - "delete": { - "tags": [ - "Address Entity" - ], - "summary": "addressPerson", - "operationId": "addressPersonUsingDELETE_1", - "consumes": [ - "text/uri-list", - "application/x-spring-data-compact+json" - ], - "parameters": [ - { - "name": "id", - "in": "path", - "description": "id", - "required": true, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK" - } - } - }, - "patch": { - "tags": [ - "Address Entity" - ], - "summary": "addressPerson", - "operationId": "addressPersonUsingPATCH_1", - "consumes": [ - "text/uri-list", - "application/x-spring-data-compact+json" - ], - "parameters": [ - { - "in": "body", - "name": "body", - "description": "body", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "id", - "in": "path", - "description": "id", - "required": true, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/EntityModelOfPerson" - } - } - } - } - }, - "/rest/addresses{?page,size,sort}": { - "get": { - "tags": [ - "Address Entity" - ], - "summary": "findAllAddress", - "operationId": "findAllAddressUsingGET_1", - "produces": [ - "application/hal+json", - "application/json", - "application/x-spring-data-compact+json", - "text/uri-list" - ], - "parameters": [ - { - "name": "page", - "in": "query", - "description": "page", - "required": false, - "type": "integer", - "format": "int32" - }, - { - "name": "size", - "in": "query", - "description": "size", - "required": false, - "type": "integer", - "format": "int32" - }, - { - "name": "sort", - "in": "query", - "description": "sort", - "required": false, - "type": "string" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/CollectionModelOfAddress" - } - } - } - } - }, - "/rest/people": { - "post": { - "tags": [ - "Person Entity" - ], - "summary": "savePerson", - "operationId": "savePersonUsingPOST_1", - "consumes": [ - "application/json" - ], - "parameters": [ - { - "in": "body", - "name": "body", - "description": "body", - "required": true, - "schema": { - "$ref": "#/definitions/Person" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/EntityModelOfPerson" - } - } - } - } - }, - "/rest/people/pageable{?page,size,sort}": { - "patch": { - "tags": [ - "person-controller" - ], - "summary": "pageableResults", - "operationId": "pageableResultsUsingPATCH_1", - "consumes": [ - "application/json" - ], - "parameters": [ - { - "name": "page", - "in": "query", - "required": false, - "type": "integer", - "format": "int32" - }, - { - "name": "size", - "in": "query", - "required": false, - "type": "integer", - "format": "int32" - }, - { - "name": "sort", - "in": "query", - "required": false, - "type": "string" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "object", - "additionalProperties": { - "$ref": "#/definitions/Person" - } - } - } - } - } - }, - "/rest/people/search/findByFirstName{?firstName}": { - "get": { - "tags": [ - "Person Entity" - ], - "summary": "findByFirstNamePerson", - "operationId": "findByFirstNamePersonUsingGET_1", - "parameters": [ - { - "name": "firstName", - "in": "query", - "description": "firstName", - "required": false, - "type": "string" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/CollectionModelOfPerson" - } - } - } - } - }, - "/rest/people/search/findByLastName{?name}": { - "get": { - "tags": [ - "Person Entity" - ], - "summary": "findByLastName", - "description": "Finds persons by last name", - "operationId": "findByLastNamePersonUsingGET_1", - "parameters": [ - { - "name": "name", - "in": "query", - "description": "name parameter", - "required": true, - "type": "string" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/CollectionModelOfPerson" - } - } - } - } - }, - "/rest/people/{id}": { - "get": { - "tags": [ - "Person Entity" - ], - "summary": "findByIdPerson", - "operationId": "findByIdPersonUsingGET_1", - "parameters": [ - { - "name": "id", - "in": "path", - "description": "id", - "required": true, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/EntityModelOfPerson" - } - } - } - }, - "put": { - "tags": [ - "Person Entity" - ], - "summary": "savePerson", - "operationId": "savePersonUsingPUT_1", - "consumes": [ - "application/json" - ], - "parameters": [ - { - "in": "body", - "name": "body", - "description": "body", - "required": true, - "schema": { - "$ref": "#/definitions/Person" - } - }, - { - "name": "id", - "in": "path", - "description": "id", - "required": true, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/EntityModelOfPerson" - } - } - } - }, - "delete": { - "tags": [ - "Person Entity" - ], - "summary": "deletePerson", - "operationId": "deletePersonUsingDELETE_1", - "parameters": [ - { - "name": "id", - "in": "path", - "description": "id", - "required": true, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK" - } - } - }, - "patch": { - "tags": [ - "Person Entity" - ], - "summary": "savePerson", - "operationId": "savePersonUsingPATCH_1", - "consumes": [ - "application/json" - ], - "parameters": [ - { - "in": "body", - "name": "body", - "description": "body", - "required": true, - "schema": { - "$ref": "#/definitions/Person" - } - }, - { - "name": "id", - "in": "path", - "description": "id", - "required": true, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/EntityModelOfPerson" - } - } - } - } - }, - "/rest/people/{id}/personAddress": { - "get": { - "tags": [ - "Person Entity" - ], - "summary": "personAddress", - "operationId": "personAddressUsingGET_1", - "produces": [ - "application/hal+json" - ], - "parameters": [ - { - "name": "id", - "in": "path", - "description": "id", - "required": true, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/EntityModelOfAddress" - } - } - } - }, - "post": { - "tags": [ - "Person Entity" - ], - "summary": "personAddress", - "operationId": "personAddressUsingPOST_1", - "consumes": [ - "text/uri-list", - "application/x-spring-data-compact+json" - ], - "parameters": [ - { - "in": "body", - "name": "body", - "description": "body", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "id", - "in": "path", - "description": "id", - "required": true, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/EntityModelOfAddress" - } - } - } - }, - "put": { - "tags": [ - "Person Entity" - ], - "summary": "personAddress", - "operationId": "personAddressUsingPUT_1", - "consumes": [ - "text/uri-list", - "application/x-spring-data-compact+json" - ], - "parameters": [ - { - "in": "body", - "name": "body", - "description": "body", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "id", - "in": "path", - "description": "id", - "required": true, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/EntityModelOfAddress" - } - } - } - }, - "delete": { - "tags": [ - "Person Entity" - ], - "summary": "personAddress", - "operationId": "personAddressUsingDELETE_1", - "consumes": [ - "text/uri-list", - "application/x-spring-data-compact+json" - ], - "parameters": [ - { - "name": "id", - "in": "path", - "description": "id", - "required": true, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK" - } - } - }, - "patch": { - "tags": [ - "Person Entity" - ], - "summary": "personAddress", - "operationId": "personAddressUsingPATCH_1", - "consumes": [ - "text/uri-list", - "application/x-spring-data-compact+json" - ], - "parameters": [ - { - "in": "body", - "name": "body", - "description": "body", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "id", - "in": "path", - "description": "id", - "required": true, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/EntityModelOfAddress" - } - } - } - } - }, - "/rest/people/{id}/tags": { - "get": { - "tags": [ - "Person Entity" - ], - "summary": "personTags", - "operationId": "personTagsUsingGET_2", - "produces": [ - "application/hal+json" - ], - "parameters": [ - { - "name": "id", - "in": "path", - "description": "id", - "required": true, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/CollectionModelOfTag" - } - } - } - }, - "post": { - "tags": [ - "Person Entity" - ], - "summary": "personTags", - "operationId": "personTagsUsingPOST_1", - "consumes": [ - "text/uri-list", - "application/x-spring-data-compact+json" - ], - "parameters": [ - { - "in": "body", - "name": "body", - "description": "body", - "required": true, - "schema": { - "type": "array", - "items": { - "type": "string" - } - } - }, - { - "name": "id", - "in": "path", - "description": "id", - "required": true, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/CollectionModelOfTag" - } - } - } - }, - "put": { - "tags": [ - "Person Entity" - ], - "summary": "personTags", - "operationId": "personTagsUsingPUT_1", - "consumes": [ - "text/uri-list", - "application/x-spring-data-compact+json" - ], - "parameters": [ - { - "in": "body", - "name": "body", - "description": "body", - "required": true, - "schema": { - "type": "array", - "items": { - "type": "string" - } - } - }, - { - "name": "id", - "in": "path", - "description": "id", - "required": true, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/CollectionModelOfTag" - } - } - } - }, - "delete": { - "tags": [ - "Person Entity" - ], - "summary": "personTags", - "operationId": "personTagsUsingDELETE_3", - "consumes": [ - "text/uri-list", - "application/x-spring-data-compact+json" - ], - "parameters": [ - { - "name": "id", - "in": "path", - "description": "id", - "required": true, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK" - } - } - }, - "patch": { - "tags": [ - "Person Entity" - ], - "summary": "personTags", - "operationId": "personTagsUsingPATCH_1", - "consumes": [ - "text/uri-list", - "application/x-spring-data-compact+json" - ], - "parameters": [ - { - "in": "body", - "name": "body", - "description": "body", - "required": true, - "schema": { - "type": "array", - "items": { - "type": "string" - } - } - }, - { - "name": "id", - "in": "path", - "description": "id", - "required": true, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/CollectionModelOfTag" - } - } - } - } - }, - "/rest/people/{id}/tags/{tagId}": { - "get": { - "tags": [ - "Person Entity" - ], - "summary": "personTags", - "operationId": "personTagsUsingGET_3", - "consumes": [ - "application/hal+json" - ], - "parameters": [ - { - "name": "id", - "in": "path", - "description": "id", - "required": true, - "type": "integer", - "format": "int64" - }, - { - "name": "tagId", - "in": "path", - "description": "tagId", - "required": true, - "type": "string" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/EntityModelOfTag" - } - } - } - }, - "delete": { - "tags": [ - "Person Entity" - ], - "summary": "personTags", - "operationId": "personTagsUsingDELETE_2", - "consumes": [ - "text/uri-list", - "application/x-spring-data-compact+json" - ], - "parameters": [ - { - "name": "id", - "in": "path", - "description": "id", - "required": true, - "type": "integer", - "format": "int64" - }, - { - "name": "tagId", - "in": "path", - "description": "tagId", - "required": true, - "type": "string" - } - ], - "responses": { - "200": { - "description": "OK" - } - } - } - }, - "/rest/people/{id}{?lastName}": { - "patch": { - "tags": [ - "person-controller" - ], - "summary": "updateLastName", - "description": "Updates the persons last name", - "operationId": "updateLastNameUsingPATCH_1", - "consumes": [ - "application/json" - ], - "parameters": [ - { - "name": "lastName", - "in": "query", - "description": "lastName parameter", - "required": true, - "type": "string" - } - ], - "responses": { - "200": { - "description": "OK" - } - } - } - }, - "/rest/people{?page,size,sort}": { - "get": { - "tags": [ - "Person Entity" - ], - "summary": "findAllPerson", - "operationId": "findAllPersonUsingGET_1", - "produces": [ - "application/hal+json", - "application/json", - "application/x-spring-data-compact+json", - "text/uri-list" - ], - "parameters": [ - { - "name": "page", - "in": "query", - "description": "page", - "required": false, - "type": "integer", - "format": "int32" - }, - { - "name": "size", - "in": "query", - "description": "size", - "required": false, - "type": "integer", - "format": "int32" - }, - { - "name": "sort", - "in": "query", - "description": "sort", - "required": false, - "type": "string" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/CollectionModelOfPerson" - } - } - } - } - }, - "/rest/tags": { - "post": { - "tags": [ - "Tag Entity" - ], - "summary": "saveTag", - "operationId": "saveTagUsingPOST_1", - "consumes": [ - "application/json" - ], - "parameters": [ - { - "in": "body", - "name": "body", - "description": "body", - "required": true, - "schema": { - "$ref": "#/definitions/Tag" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/EntityModelOfTag" - } - } - } - } - }, - "/rest/tags/{id}": { - "get": { - "tags": [ - "Tag Entity" - ], - "summary": "findByIdTag", - "operationId": "findByIdTagUsingGET_1", - "parameters": [ - { - "name": "id", - "in": "path", - "description": "id", - "required": true, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/EntityModelOfTag" - } - } - } - }, - "put": { - "tags": [ - "Tag Entity" - ], - "summary": "saveTag", - "operationId": "saveTagUsingPUT_1", - "consumes": [ - "application/json" - ], - "parameters": [ - { - "in": "body", - "name": "body", - "description": "body", - "required": true, - "schema": { - "$ref": "#/definitions/Tag" - } - }, - { - "name": "id", - "in": "path", - "description": "id", - "required": true, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/EntityModelOfTag" - } - } - } - }, - "delete": { - "tags": [ - "Tag Entity" - ], - "summary": "deleteTag", - "operationId": "deleteTagUsingDELETE_1", - "parameters": [ - { - "name": "id", - "in": "path", - "description": "id", - "required": true, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK" - } - } - }, - "patch": { - "tags": [ - "Tag Entity" - ], - "summary": "saveTag", - "operationId": "saveTagUsingPATCH_1", - "consumes": [ - "application/json" - ], - "parameters": [ - { - "in": "body", - "name": "body", - "description": "body", - "required": true, - "schema": { - "$ref": "#/definitions/Tag" - } - }, - { - "name": "id", - "in": "path", - "description": "id", - "required": true, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/EntityModelOfTag" - } - } - } - } - }, - "/rest/tags/{id}/people": { - "get": { - "tags": [ - "Tag Entity" - ], - "summary": "tagPeople", - "operationId": "tagPeopleUsingGET_2", - "produces": [ - "application/hal+json" - ], - "parameters": [ - { - "name": "id", - "in": "path", - "description": "id", - "required": true, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/CollectionModelOfPerson" - } - } - } - }, - "post": { - "tags": [ - "Tag Entity" - ], - "summary": "tagPeople", - "operationId": "tagPeopleUsingPOST_1", - "consumes": [ - "text/uri-list", - "application/x-spring-data-compact+json" - ], - "parameters": [ - { - "in": "body", - "name": "body", - "description": "body", - "required": true, - "schema": { - "type": "array", - "items": { - "type": "string" - } - } - }, - { - "name": "id", - "in": "path", - "description": "id", - "required": true, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/CollectionModelOfPerson" - } - } - } - }, - "put": { - "tags": [ - "Tag Entity" - ], - "summary": "tagPeople", - "operationId": "tagPeopleUsingPUT_1", - "consumes": [ - "text/uri-list", - "application/x-spring-data-compact+json" - ], - "parameters": [ - { - "in": "body", - "name": "body", - "description": "body", - "required": true, - "schema": { - "type": "array", - "items": { - "type": "string" - } - } - }, - { - "name": "id", - "in": "path", - "description": "id", - "required": true, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/CollectionModelOfPerson" - } - } - } - }, - "delete": { - "tags": [ - "Tag Entity" - ], - "summary": "tagPeople", - "operationId": "tagPeopleUsingDELETE_3", - "consumes": [ - "text/uri-list", - "application/x-spring-data-compact+json" - ], - "parameters": [ - { - "name": "id", - "in": "path", - "description": "id", - "required": true, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK" - } - } - }, - "patch": { - "tags": [ - "Tag Entity" - ], - "summary": "tagPeople", - "operationId": "tagPeopleUsingPATCH_1", - "consumes": [ - "text/uri-list", - "application/x-spring-data-compact+json" - ], - "parameters": [ - { - "in": "body", - "name": "body", - "description": "body", - "required": true, - "schema": { - "type": "array", - "items": { - "type": "string" - } - } - }, - { - "name": "id", - "in": "path", - "description": "id", - "required": true, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/CollectionModelOfPerson" - } - } - } - } - }, - "/rest/tags/{id}/people/{personId}": { - "get": { - "tags": [ - "Tag Entity" - ], - "summary": "tagPeople", - "operationId": "tagPeopleUsingGET_3", - "consumes": [ - "application/hal+json" - ], - "parameters": [ - { - "name": "id", - "in": "path", - "description": "id", - "required": true, - "type": "integer", - "format": "int64" - }, - { - "name": "personId", - "in": "path", - "description": "personId", - "required": true, - "type": "string" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/EntityModelOfPerson" - } - } - } - }, - "delete": { - "tags": [ - "Tag Entity" - ], - "summary": "tagPeople", - "operationId": "tagPeopleUsingDELETE_2", - "consumes": [ - "text/uri-list", - "application/x-spring-data-compact+json" - ], - "parameters": [ - { - "name": "id", - "in": "path", - "description": "id", - "required": true, - "type": "integer", - "format": "int64" - }, - { - "name": "personId", - "in": "path", - "description": "personId", - "required": true, - "type": "string" - } - ], - "responses": { - "200": { - "description": "OK" - } - } - } - }, - "/rest/tags{?page,size,sort}": { - "get": { - "tags": [ - "Tag Entity" - ], - "summary": "findAllTag", - "operationId": "findAllTagUsingGET_1", - "produces": [ - "application/hal+json", - "application/json", - "application/x-spring-data-compact+json", - "text/uri-list" - ], - "parameters": [ - { - "name": "page", - "in": "query", - "description": "page", - "required": false, - "type": "integer", - "format": "int32" - }, - { - "name": "size", - "in": "query", - "description": "size", - "required": false, - "type": "integer", - "format": "int32" - }, - { - "name": "sort", - "in": "query", - "description": "sort", - "required": false, - "type": "string" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/CollectionModelOfTag" - } - } - } - } - } - }, - "definitions": { - "Address": { - "type": "object", - "properties": { - "address1": { - "type": "string" - }, - "address2": { - "type": "string" - }, - "city": { - "type": "string" - }, - "id": { - "type": "integer", - "format": "int64" - }, - "person": { - "$ref": "#/definitions/Person" - }, - "state": { - "type": "string" - }, - "zip": { - "type": "string" - } - }, - "title": "Address" - }, - "Category": { - "type": "object", - "properties": { - "id": { - "type": "integer", - "format": "int64" - }, - "name": { - "type": "string" - }, - "people": { - "type": "array", - "items": { - "$ref": "#/definitions/Person" - } - } - }, - "title": "Category" - }, - "CollectionModelOfAddress": { - "type": "object", - "required": [ - "_embedded", - "_links" - ], - "properties": { - "_embedded": { - "$ref": "#/definitions/EmbeddedCollectionOfAddress" - }, - "_links": { - "type": "object", - "description": "Link collection", - "additionalProperties": { - "$ref": "#/definitions/Link" - } - } - }, - "title": "CollectionModelOfAddress", - "xml": { - "name": "entities", - "attribute": false, - "wrapped": false - }, - "description": "Resources of Address" - }, - "CollectionModelOfPerson": { - "type": "object", - "required": [ - "_embedded", - "_links" - ], - "properties": { - "_embedded": { - "$ref": "#/definitions/EmbeddedCollectionOfPerson" - }, - "_links": { - "type": "object", - "description": "Link collection", - "additionalProperties": { - "$ref": "#/definitions/Link" - } - } - }, - "title": "CollectionModelOfPerson", - "xml": { - "name": "entities", - "attribute": false, - "wrapped": false - }, - "description": "Resources of Person" - }, - "CollectionModelOfTag": { - "type": "object", - "required": [ - "_embedded", - "_links" - ], - "properties": { - "_embedded": { - "$ref": "#/definitions/EmbeddedCollectionOfTag" - }, - "_links": { - "type": "object", - "description": "Link collection", - "additionalProperties": { - "$ref": "#/definitions/Link" - } - } - }, - "title": "CollectionModelOfTag", - "xml": { - "name": "entities", - "attribute": false, - "wrapped": false - }, - "description": "Resources of Tag" - }, - "EmbeddedCollectionOfAddress": { - "type": "object", - "required": [ - "addresses" - ], - "properties": { - "addresses": { - "type": "array", - "description": "Resource collection", - "items": { - "$ref": "#/definitions/Address" - } - } - }, - "title": "EmbeddedCollectionOfAddress", - "xml": { - "name": "content", - "wrapped": true - }, - "description": "Embedded collection of Address" - }, - "EmbeddedCollectionOfPerson": { - "type": "object", - "required": [ - "people" - ], - "properties": { - "people": { - "type": "array", - "description": "Resource collection", - "items": { - "$ref": "#/definitions/Person" - } - } - }, - "title": "EmbeddedCollectionOfPerson", - "xml": { - "name": "content", - "wrapped": true - }, - "description": "Embedded collection of Person" - }, - "EmbeddedCollectionOfTag": { - "type": "object", - "required": [ - "tags" - ], - "properties": { - "tags": { - "type": "array", - "description": "Resource collection", - "items": { - "$ref": "#/definitions/Tag" - } - } - }, - "title": "EmbeddedCollectionOfTag", - "xml": { - "name": "content", - "wrapped": true - }, - "description": "Embedded collection of Tag" - }, - "EntityModelOfAddress": { - "type": "object", - "properties": { - "address1": { - "type": "string" - }, - "address2": { - "type": "string" - }, - "city": { - "type": "string" - }, - "id": { - "type": "integer", - "format": "int64" - }, - "links": { - "$ref": "#/definitions/Links" - }, - "person": { - "$ref": "#/definitions/Person" - }, - "state": { - "type": "string" - }, - "zip": { - "type": "string" - } - }, - "title": "EntityModelOfAddress" - }, - "EntityModelOfPerson": { - "type": "object", - "properties": { - "address": { - "$ref": "#/definitions/Address" - }, - "category": { - "$ref": "#/definitions/Category" - }, - "firstName": { - "type": "string" - }, - "id": { - "type": "integer", - "format": "int64" - }, - "lastName": { - "type": "string" - }, - "links": { - "$ref": "#/definitions/Links" - }, - "tags": { - "type": "array", - "items": { - "$ref": "#/definitions/Tag" - } - } - }, - "title": "EntityModelOfPerson" - }, - "EntityModelOfTag": { - "type": "object", - "properties": { - "id": { - "type": "integer", - "format": "int64" - }, - "links": { - "$ref": "#/definitions/Links" - }, - "name": { - "type": "string" - }, - "people": { - "type": "array", - "items": { - "$ref": "#/definitions/Person" - } - } - }, - "title": "EntityModelOfTag" - }, - "Link": { - "type": "object", - "properties": { - "deprecation": { - "type": "string" - }, - "href": { - "type": "string" - }, - "hreflang": { - "type": "string" - }, - "media": { - "type": "string" - }, - "name": { - "type": "string" - }, - "profile": { - "type": "string" - }, - "rel": { - "$ref": "#/definitions/LinkRelation" - }, - "title": { - "type": "string" - }, - "type": { - "type": "string" - } - }, - "title": "Link" - }, - "LinkRelation": { - "type": "object", - "title": "LinkRelation" - }, - "Links": { - "type": "object", - "properties": { - "empty": { - "type": "boolean" - } - }, - "title": "Links" - }, - "Person": { - "type": "object", - "properties": { - "address": { - "$ref": "#/definitions/Address" - }, - "category": { - "$ref": "#/definitions/Category" - }, - "firstName": { - "type": "string" - }, - "id": { - "type": "integer", - "format": "int64" - }, - "lastName": { - "type": "string" - }, - "tags": { - "type": "array", - "items": { - "$ref": "#/definitions/Tag" - } - } - }, - "title": "Person" - }, - "Tag": { - "type": "object", - "properties": { - "id": { - "type": "integer", - "format": "int64" - }, - "name": { - "type": "string" - }, - "people": { - "type": "array", - "items": { - "$ref": "#/definitions/Person" - } - } - }, - "title": "Tag" - }, - "TemplateVariable": { - "type": "object", - "properties": { - "description": { - "type": "string" - }, - "name": { - "type": "string" - }, - "type": { - "type": "string", - "enum": [ - "COMPOSITE_PARAM", - "FRAGMENT", - "PATH_VARIABLE", - "REQUEST_PARAM", - "REQUEST_PARAM_CONTINUED", - "SEGMENT" - ] - } - }, - "title": "TemplateVariable" - }, - "UriTemplate": { - "type": "object", - "properties": { - "variableNames": { - "type": "array", - "items": { - "type": "string" - } - }, - "variables": { - "type": "array", - "items": { - "$ref": "#/definitions/TemplateVariable" - } - } - }, - "title": "UriTemplate" - } - } -} \ No newline at end of file diff --git a/swagger-contract-tests/src/test/resources/contract/swagger2/swagger.json b/swagger-contract-tests/src/test/resources/contract/swagger2/swagger.json deleted file mode 100644 index 87818e79e31..00000000000 --- a/swagger-contract-tests/src/test/resources/contract/swagger2/swagger.json +++ /dev/null @@ -1,1032 +0,0 @@ -{ - "swagger": "2.0", - "info": { - "description": "Api Documentation", - "version": "1.0", - "title": "Api Documentation", - "termsOfService": "urn:tos", - "contact": { - - }, - "license": { - "name": "Apache 2.0", - "url": "http://www.apache.org/licenses/LICENSE-2.0" - } - }, - "host": "petstore.swagger.io", - "basePath": "/", - "tags": [ - { - "name": "pet-controller", - "description": "Operations about pets" - }, - { - "name": "pet-store-resource", - "description": "Operations about store" - }, - { - "name": "user-controller", - "description": "Operations about user" - } - ], - "schemes": [ - "http", - "https" - ], - "produces": [ - "application/json", - "application/xml" - ], - "paths": { - "/api/pet": { - "post": { - "tags": [ - "pet-controller" - ], - "summary": "Add a new pet to the store", - "operationId": "addPetUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "application/json", - "application/xml" - ], - "parameters": [ - { - "in": "body", - "name": "pet", - "description": "Pet object that needs to be added to the store", - "required": true, - "schema": { - "$ref": "#/definitions/PetReq" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "string" - } - }, - "405": { - "description": "Invalid input" - } - }, - "security": [ - { - "petstore_auth": [ - "write:pets", - "read:pets" - ] - } - ] - }, - "put": { - "tags": [ - "pet-controller" - ], - "summary": "Update an existing pet", - "operationId": "updatePetUsingPUT", - "consumes": [ - "application/json" - ], - "produces": [ - "application/json", - "application/xml" - ], - "parameters": [ - { - "in": "body", - "name": "pet", - "description": "Pet object that needs to be added to the store", - "required": true, - "schema": { - "$ref": "#/definitions/PetReq" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "string" - } - }, - "400": { - "description": "Invalid ID supplied" - }, - "404": { - "description": "Pet not found" - }, - "405": { - "description": "Validation exception" - } - }, - "security": [ - { - "petstore_auth": [ - "write:pets", - "read:pets" - ] - } - ] - } - }, - "/api/pet/findByStatus": { - "get": { - "tags": [ - "pet-controller" - ], - "summary": "Finds Pets by status", - "description": "Multiple status values can be provided with comma-separated strings", - "operationId": "findPetsByStatusUsingGET_1", - "produces": [ - "application/json", - "application/xml" - ], - "parameters": [ - { - "name": "status", - "in": "query", - "description": "Status values that need to be considered for filter", - "required": true, - "type": "string", - "default": "available", - "enum": [ - "available", - "pending", - "sold" - ] - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/PetRes" - } - } - }, - "400": { - "description": "Invalid status value" - } - }, - "security": [ - { - "petstore_auth": [ - "write:pets", - "read:pets" - ] - } - ] - } - }, - "/api/pet/findByTags": { - "get": { - "tags": [ - "pet-controller" - ], - "summary": "Finds Pets by tags", - "description": "Multiple tags can be provided with comma-separated strings. Use tag1, tag2, tag3 for testing.", - "operationId": "findPetsByTagsUsingGET_1", - "produces": [ - "application/json", - "application/xml" - ], - "parameters": [ - { - "name": "tags", - "in": "query", - "description": "Tags to filter by", - "required": true, - "type": "string" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/PetRes" - } - } - }, - "400": { - "description": "Invalid tag value" - } - }, - "security": [ - { - "petstore_auth": [ - "write:pets", - "read:pets" - ] - } - ], - "deprecated": true - } - }, - "/api/pet/{petId}": { - "get": { - "tags": [ - "pet-controller" - ], - "summary": "Find pet by ID", - "description": "Returns a pet when ID < 10. ID > 10 or non-integers will simulate API error conditions", - "operationId": "getPetByIdUsingGET_3", - "produces": [ - "application/json", - "application/xml" - ], - "parameters": [ - { - "name": "petId", - "in": "path", - "description": "ID of pet that needs to be fetched", - "required": true, - "type": "string", - "maxLength": 5, - "minLength": 1 - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/PetRes" - } - }, - "400": { - "description": "Invalid ID supplied", - "headers": { - "header4": { - "type": "string" - }, - "header3": { - "type": "string" - }, - "header2": { - "type": "string" - }, - "header1": { - "type": "string" - } - } - }, - "404": { - "description": "Pet not found", - "headers": { - "header4": { - "type": "string" - }, - "header3": { - "type": "string" - } - } - } - }, - "security": [ - { - "petstore_auth": [ - "write:pets", - "read:pets" - ] - }, - { - "api_key": [ - - ] - } - ] - } - }, - "/api/store/order": { - "post": { - "tags": [ - "pet-store-resource" - ], - "summary": "Place an order for a pet", - "operationId": "placeOrderUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "application/json" - ], - "parameters": [ - { - "name": "complete", - "in": "query", - "required": false, - "type": "boolean" - }, - { - "name": "id", - "in": "query", - "required": false, - "type": "integer", - "format": "int64" - }, - { - "name": "identifier", - "in": "query", - "required": false, - "type": "integer", - "format": "int64" - }, - { - "name": "petId", - "in": "query", - "required": false, - "type": "integer", - "format": "int64" - }, - { - "name": "quantity", - "in": "query", - "required": false, - "type": "integer", - "format": "int32" - }, - { - "name": "shipDate", - "in": "query", - "required": false, - "type": "string", - "format": "date-time" - }, - { - "name": "status", - "in": "query", - "description": "Order Status", - "required": false, - "type": "string", - "enum": [ - "approved", - "delivered", - "placed" - ] - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "string" - } - }, - "400": { - "description": "Invalid Order" - } - } - } - }, - "/api/store/order/{orderId}": { - "get": { - "tags": [ - "Pet Store" - ], - "summary": "Find purchase order by ID", - "description": "For valid response try integer IDs with value <= 5 or > 10. Other values will generated exceptions", - "operationId": "getOrderByIdUsingGET", - "produces": [ - "application/json" - ], - "parameters": [ - { - "name": "orderId", - "in": "path", - "description": "ID of pet that needs to be fetched", - "required": true, - "type": "string", - "maxLength": 5, - "minLength": 1 - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/Order" - } - }, - "400": { - "description": "Invalid ID supplied" - }, - "404": { - "description": "Order not found" - } - } - }, - "delete": { - "tags": [ - "pet-store-resource" - ], - "summary": "Delete purchase order by ID", - "description": "For valid response try integer IDs with value < 1000. Anything above 1000 or non-integers will generate API errors", - "operationId": "deleteOrderUsingDELETE", - "produces": [ - "application/json" - ], - "parameters": [ - { - "name": "orderId", - "in": "path", - "description": "ID of the order that needs to be deleted", - "required": true, - "type": "string", - "minLength": 1 - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "string" - } - }, - "400": { - "description": "Invalid ID supplied" - }, - "404": { - "description": "Order not found" - } - } - } - }, - "/api/user": { - "post": { - "tags": [ - "user-controller" - ], - "summary": "Create user", - "description": "This can only be done by the logged in user.", - "operationId": "createUserUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "application/json" - ], - "parameters": [ - { - "in": "body", - "name": "user", - "description": "Created user object", - "required": true, - "schema": { - "$ref": "#/definitions/UserReq" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/UserRes" - } - } - } - } - }, - "/api/user/createWithArray": { - "post": { - "tags": [ - "user-controller" - ], - "summary": "Creates list of users with given input array", - "operationId": "createUsersWithArrayInputUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "application/json" - ], - "parameters": [ - { - "in": "body", - "name": "users", - "description": "List of user object", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/UserRes" - } - } - } - } - }, - "/api/user/createWithList": { - "post": { - "tags": [ - "user-controller" - ], - "summary": "Creates list of users with given input array", - "operationId": "createUsersWithListInputUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "application/json" - ], - "parameters": [ - { - "in": "body", - "name": "users", - "description": "List of user object", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "string" - } - } - } - } - }, - "/api/user/login": { - "get": { - "tags": [ - "user-controller" - ], - "summary": "Logs user into the system", - "operationId": "loginUserUsingGET", - "produces": [ - "application/json" - ], - "parameters": [ - { - "name": "password", - "in": "query", - "description": "The password for login in clear text", - "required": true, - "type": "string" - }, - { - "name": "username", - "in": "query", - "description": "The user name for login", - "required": true, - "type": "string" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "string" - } - }, - "400": { - "description": "Invalid username/password supplied" - } - } - } - }, - "/api/user/logout": { - "get": { - "tags": [ - "user-controller" - ], - "summary": "Logs out current logged in user session", - "operationId": "logoutUserUsingGET", - "produces": [ - "application/json" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "string" - } - } - } - } - }, - "/api/user/{username}": { - "get": { - "tags": [ - "user-controller" - ], - "summary": "Get user by user name", - "operationId": "getUserByNameUsingGET", - "produces": [ - "application/json" - ], - "parameters": [ - { - "name": "username", - "in": "path", - "description": "The name that needs to be fetched. Use user1 for testing. ", - "required": true, - "type": "string" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/UserRes" - } - }, - "400": { - "description": "Invalid username supplied" - }, - "404": { - "description": "User not found" - } - } - }, - "put": { - "tags": [ - "user-controller" - ], - "summary": "Updated user", - "description": "This can only be done by the logged in user.", - "operationId": "updateUserUsingPUT", - "consumes": [ - "application/json" - ], - "produces": [ - "application/json" - ], - "parameters": [ - { - "name": "email", - "in": "query", - "required": false, - "type": "string" - }, - { - "name": "firstName", - "in": "query", - "required": false, - "type": "string" - }, - { - "name": "id", - "in": "query", - "required": false, - "type": "integer", - "format": "int64" - }, - { - "name": "identifier", - "in": "query", - "required": false, - "type": "string" - }, - { - "name": "lastName", - "in": "query", - "required": false, - "type": "string" - }, - { - "name": "password", - "in": "query", - "required": false, - "type": "string" - }, - { - "name": "phone", - "in": "query", - "required": false, - "type": "string" - }, - { - "name": "username", - "in": "path", - "description": "name that need to be deleted", - "required": true, - "type": "string" - }, - { - "name": "userStatus", - "in": "query", - "description": "User Status", - "required": false, - "type": "integer", - "format": "int32", - "enum": [ - "1-registered", - "2-active", - "3-closed" - ] - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "string" - } - }, - "400": { - "description": "Invalid user supplied" - }, - "404": { - "description": "User not found" - } - } - }, - "delete": { - "tags": [ - "user-controller" - ], - "summary": "Delete user", - "description": "This can only be done by the logged in user.", - "operationId": "deleteUserUsingDELETE", - "produces": [ - "application/json" - ], - "parameters": [ - { - "name": "username", - "in": "path", - "description": "The name that needs to be deleted", - "required": true, - "type": "string" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "string" - } - }, - "400": { - "description": "Invalid username supplied" - }, - "404": { - "description": "User not found" - } - } - } - } - }, - "securityDefinitions": { - "api_key": { - "type": "apiKey", - "name": "api_key", - "in": "header" - }, - "petstore_auth": { - "type": "oauth2", - "authorizationUrl": "http://petstore.swagger.io/api/oauth/dialog", - "flow": "implicit", - "scopes": { - "write:pets": "modify pets in your account", - "read:pets": "read your pets" - } - } - }, - "definitions": { - "CategoryReq": { - "type": "object", - "required": [ - "id" - ], - "properties": { - "id": { - "type": "integer", - "format": "int64" - }, - "name": { - "type": "string" - } - }, - "title": "CategoryReq" - }, - "CategoryRes": { - "type": "object", - "properties": { - "id": { - "type": "integer", - "format": "int64" - }, - "name": { - "type": "string" - } - }, - "title": "CategoryRes" - }, - "Order": { - "type": "object", - "properties": { - "complete": { - "type": "boolean" - }, - "id": { - "type": "integer", - "format": "int64" - }, - "identifier": { - "type": "integer", - "format": "int64" - }, - "petId": { - "type": "integer", - "format": "int64" - }, - "quantity": { - "type": "integer", - "format": "int32" - }, - "shipDate": { - "type": "string", - "format": "date-time" - }, - "status": { - "type": "string", - "description": "Order Status", - "enum": [ - "approved", - "delivered", - "placed" - ] - } - }, - "title": "Order" - }, - "PetReq": { - "type": "object", - "properties": { - "category": { - "$ref": "#/definitions/CategoryReq" - }, - "id": { - "type": "integer", - "format": "int64" - }, - "name": { - "type": "string" - }, - "photoUrls": { - "type": "array", - "items": { - "type": "string" - } - }, - "status": { - "type": "string", - "description": "pet status in the store", - "enum": [ - "available", - "pending", - "sold" - ] - }, - "tags": { - "type": "array", - "items": { - "$ref": "#/definitions/Tag" - } - } - }, - "title": "PetReq" - }, - "PetRes": { - "type": "object", - "properties": { - "category": { - "$ref": "#/definitions/CategoryRes" - }, - "id": { - "type": "integer", - "format": "int64" - }, - "identifier": { - "type": "integer", - "format": "int64" - }, - "name": { - "type": "string" - }, - "photoUrls": { - "type": "array", - "items": { - "type": "string" - } - }, - "status": { - "type": "string", - "description": "pet status in the store", - "enum": [ - "available", - "pending", - "sold" - ] - }, - "tags": { - "type": "array", - "items": { - "$ref": "#/definitions/Tag" - } - } - }, - "title": "PetRes" - }, - "Tag": { - "type": "object", - "properties": { - "id": { - "type": "integer", - "format": "int64" - }, - "name": { - "type": "string" - } - }, - "title": "Tag" - }, - "UserReq": { - "type": "object", - "properties": { - "email": { - "type": "string" - }, - "firstName": { - "type": "string" - }, - "id": { - "type": "integer", - "format": "int64" - }, - "lastName": { - "type": "string" - }, - "password": { - "type": "string" - }, - "phone": { - "type": "string" - }, - "userStatus": { - "type": "integer", - "format": "int32", - "description": "User Status" - }, - "username": { - "type": "string" - } - }, - "title": "UserReq" - }, - "UserRes": { - "type": "object", - "properties": { - "email": { - "type": "string" - }, - "firstName": { - "type": "string" - }, - "id": { - "type": "integer", - "format": "int64" - }, - "identifier": { - "type": "string" - }, - "lastName": { - "type": "string" - }, - "password": { - "type": "string" - }, - "phone": { - "type": "string" - }, - "userStatus": { - "type": "integer", - "format": "int32", - "description": "User Status" - }, - "username": { - "type": "string" - } - }, - "title": "UserRes" - } - } -} \ No newline at end of file diff --git a/swagger-contract-tests/src/test/resources/contract/swagger2/swaggerTemplated.json b/swagger-contract-tests/src/test/resources/contract/swagger2/swaggerTemplated.json deleted file mode 100644 index fae3d462766..00000000000 --- a/swagger-contract-tests/src/test/resources/contract/swagger2/swaggerTemplated.json +++ /dev/null @@ -1,183 +0,0 @@ -{ - "swagger": "2.0", - "info": { - "description": "Api Documentation", - "version": "1.0", - "title": "Api Documentation", - "termsOfService": "urn:tos", - "contact": { - - }, - "license": { - "name": "Apache 2.0", - "url": "http://www.apache.org/licenses/LICENSE-2.0" - } - }, - "host": "petstore.swagger.io", - "basePath": "/", - "tags": [ - { - "name": "pet-store-resource", - "description": "Operations about store" - } - ], - "schemes": [ - "http", - "https" - ], - "produces": [ - "application/json", - "application/xml" - ], - "paths": { - "/api/store/search?x=CA": { - "get": { - "tags": [ - "pet-store-resource" - ], - "summary": "getPetInCA", - "operationId": "getPetInCAUsingGET", - "produces": [ - "application/json" - ], - "parameters": [ - { - "name": "x", - "in": "query", - "required": true, - "type": "string", - "default": "CA", - "enum": [ - "CA" - ] - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/Pet" - } - } - } - } - }, - "/api/store/search?x=TX": { - "get": { - "tags": [ - "pet-store-resource" - ], - "summary": "getPetInTx", - "operationId": "getPetInTxUsingGET", - "produces": [ - "application/json" - ], - "parameters": [ - { - "name": "x", - "in": "query", - "required": true, - "type": "string", - "default": "TX", - "enum": [ - "TX" - ] - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/Pet" - } - } - } - } - } - }, - "securityDefinitions": { - "api_key": { - "type": "apiKey", - "name": "api_key", - "in": "header" - }, - "petstore_auth": { - "type": "oauth2", - "authorizationUrl": "http://petstore.swagger.io/api/oauth/dialog", - "flow": "implicit", - "scopes": { - "write:pets": "modify pets in your account", - "read:pets": "read your pets" - } - } - }, - "definitions": { - "Category": { - "type": "object", - "properties": { - "id": { - "type": "integer", - "format": "int64" - }, - "name": { - "type": "string" - } - }, - "title": "Category" - }, - "Pet": { - "type": "object", - "properties": { - "category": { - "$ref": "#/definitions/Category" - }, - "id": { - "type": "integer", - "format": "int64" - }, - "identifier": { - "type": "integer", - "format": "int64" - }, - "name": { - "type": "string" - }, - "photoUrls": { - "type": "array", - "items": { - "type": "string" - } - }, - "status": { - "type": "string", - "description": "pet status in the store", - "enum": [ - "available", - "pending", - "sold" - ] - }, - "tags": { - "type": "array", - "items": { - "$ref": "#/definitions/Tag" - } - } - }, - "title": "Pet" - }, - "Tag": { - "type": "object", - "properties": { - "id": { - "type": "integer", - "format": "int64" - }, - "name": { - "type": "string" - } - }, - "title": "Tag" - } - } -} \ No newline at end of file