diff --git a/samples/standalone/http-client/.gitignore b/samples/standalone/dsl/http-client/.gitignore
similarity index 100%
rename from samples/standalone/http-client/.gitignore
rename to samples/standalone/dsl/http-client/.gitignore
diff --git a/samples/standalone/http-client/.mvn/jvm.config b/samples/standalone/dsl/http-client/.mvn/jvm.config
similarity index 100%
rename from samples/standalone/http-client/.mvn/jvm.config
rename to samples/standalone/dsl/http-client/.mvn/jvm.config
diff --git a/samples/standalone/http-client/.mvn/maven.config b/samples/standalone/dsl/http-client/.mvn/maven.config
similarity index 100%
rename from samples/standalone/http-client/.mvn/maven.config
rename to samples/standalone/dsl/http-client/.mvn/maven.config
diff --git a/samples/standalone/http-client/.mvn/wrapper/maven-wrapper.jar b/samples/standalone/dsl/http-client/.mvn/wrapper/maven-wrapper.jar
similarity index 100%
rename from samples/standalone/http-client/.mvn/wrapper/maven-wrapper.jar
rename to samples/standalone/dsl/http-client/.mvn/wrapper/maven-wrapper.jar
diff --git a/samples/standalone/http-client/.mvn/wrapper/maven-wrapper.properties b/samples/standalone/dsl/http-client/.mvn/wrapper/maven-wrapper.properties
similarity index 100%
rename from samples/standalone/http-client/.mvn/wrapper/maven-wrapper.properties
rename to samples/standalone/dsl/http-client/.mvn/wrapper/maven-wrapper.properties
diff --git a/samples/standalone/http-client/README.adoc b/samples/standalone/dsl/http-client/README.adoc
similarity index 100%
rename from samples/standalone/http-client/README.adoc
rename to samples/standalone/dsl/http-client/README.adoc
diff --git a/samples/standalone/http-client/build.gradle b/samples/standalone/dsl/http-client/build.gradle
similarity index 100%
rename from samples/standalone/http-client/build.gradle
rename to samples/standalone/dsl/http-client/build.gradle
diff --git a/samples/standalone/http-client/gradle.properties b/samples/standalone/dsl/http-client/gradle.properties
similarity index 100%
rename from samples/standalone/http-client/gradle.properties
rename to samples/standalone/dsl/http-client/gradle.properties
diff --git a/samples/standalone/http-client/gradle/wrapper/gradle-wrapper.jar b/samples/standalone/dsl/http-client/gradle/wrapper/gradle-wrapper.jar
similarity index 100%
rename from samples/standalone/http-client/gradle/wrapper/gradle-wrapper.jar
rename to samples/standalone/dsl/http-client/gradle/wrapper/gradle-wrapper.jar
diff --git a/samples/standalone/http-client/gradle/wrapper/gradle-wrapper.properties b/samples/standalone/dsl/http-client/gradle/wrapper/gradle-wrapper.properties
similarity index 100%
rename from samples/standalone/http-client/gradle/wrapper/gradle-wrapper.properties
rename to samples/standalone/dsl/http-client/gradle/wrapper/gradle-wrapper.properties
diff --git a/samples/standalone/http-client/gradlew b/samples/standalone/dsl/http-client/gradlew
similarity index 100%
rename from samples/standalone/http-client/gradlew
rename to samples/standalone/dsl/http-client/gradlew
diff --git a/samples/standalone/http-client/gradlew.bat b/samples/standalone/dsl/http-client/gradlew.bat
similarity index 100%
rename from samples/standalone/http-client/gradlew.bat
rename to samples/standalone/dsl/http-client/gradlew.bat
diff --git a/samples/standalone/http-client/mvnw b/samples/standalone/dsl/http-client/mvnw
similarity index 100%
rename from samples/standalone/http-client/mvnw
rename to samples/standalone/dsl/http-client/mvnw
diff --git a/samples/standalone/http-client/mvnw.cmd b/samples/standalone/dsl/http-client/mvnw.cmd
similarity index 100%
rename from samples/standalone/http-client/mvnw.cmd
rename to samples/standalone/dsl/http-client/mvnw.cmd
diff --git a/samples/standalone/http-client/pom.xml b/samples/standalone/dsl/http-client/pom.xml
similarity index 98%
rename from samples/standalone/http-client/pom.xml
rename to samples/standalone/dsl/http-client/pom.xml
index 40caed598f..fd4fd25a9e 100644
--- a/samples/standalone/http-client/pom.xml
+++ b/samples/standalone/dsl/http-client/pom.xml
@@ -4,7 +4,7 @@
4.0.0
com.example
- http-client
+ http-client-dsl
0.0.1-SNAPSHOT
Spring Cloud Contract Verifier Http Client Sample
diff --git a/samples/standalone/http-client/settings.gradle b/samples/standalone/dsl/http-client/settings.gradle
similarity index 100%
rename from samples/standalone/http-client/settings.gradle
rename to samples/standalone/dsl/http-client/settings.gradle
diff --git a/samples/standalone/http-client/src/main/java/com/example/loan/Application.java b/samples/standalone/dsl/http-client/src/main/java/com/example/loan/Application.java
similarity index 100%
rename from samples/standalone/http-client/src/main/java/com/example/loan/Application.java
rename to samples/standalone/dsl/http-client/src/main/java/com/example/loan/Application.java
diff --git a/samples/standalone/http-client/src/main/java/com/example/loan/LoanApplicationService.java b/samples/standalone/dsl/http-client/src/main/java/com/example/loan/LoanApplicationService.java
similarity index 100%
rename from samples/standalone/http-client/src/main/java/com/example/loan/LoanApplicationService.java
rename to samples/standalone/dsl/http-client/src/main/java/com/example/loan/LoanApplicationService.java
diff --git a/samples/standalone/http-client/src/main/java/com/example/loan/model/Client.java b/samples/standalone/dsl/http-client/src/main/java/com/example/loan/model/Client.java
similarity index 100%
rename from samples/standalone/http-client/src/main/java/com/example/loan/model/Client.java
rename to samples/standalone/dsl/http-client/src/main/java/com/example/loan/model/Client.java
diff --git a/samples/standalone/http-client/src/main/java/com/example/loan/model/FraudCheckStatus.java b/samples/standalone/dsl/http-client/src/main/java/com/example/loan/model/FraudCheckStatus.java
similarity index 100%
rename from samples/standalone/http-client/src/main/java/com/example/loan/model/FraudCheckStatus.java
rename to samples/standalone/dsl/http-client/src/main/java/com/example/loan/model/FraudCheckStatus.java
diff --git a/samples/standalone/http-client/src/main/java/com/example/loan/model/FraudServiceRequest.java b/samples/standalone/dsl/http-client/src/main/java/com/example/loan/model/FraudServiceRequest.java
similarity index 100%
rename from samples/standalone/http-client/src/main/java/com/example/loan/model/FraudServiceRequest.java
rename to samples/standalone/dsl/http-client/src/main/java/com/example/loan/model/FraudServiceRequest.java
diff --git a/samples/standalone/http-client/src/main/java/com/example/loan/model/FraudServiceResponse.java b/samples/standalone/dsl/http-client/src/main/java/com/example/loan/model/FraudServiceResponse.java
similarity index 100%
rename from samples/standalone/http-client/src/main/java/com/example/loan/model/FraudServiceResponse.java
rename to samples/standalone/dsl/http-client/src/main/java/com/example/loan/model/FraudServiceResponse.java
diff --git a/samples/standalone/http-client/src/main/java/com/example/loan/model/LoanApplication.java b/samples/standalone/dsl/http-client/src/main/java/com/example/loan/model/LoanApplication.java
similarity index 100%
rename from samples/standalone/http-client/src/main/java/com/example/loan/model/LoanApplication.java
rename to samples/standalone/dsl/http-client/src/main/java/com/example/loan/model/LoanApplication.java
diff --git a/samples/standalone/http-client/src/main/java/com/example/loan/model/LoanApplicationResult.java b/samples/standalone/dsl/http-client/src/main/java/com/example/loan/model/LoanApplicationResult.java
similarity index 100%
rename from samples/standalone/http-client/src/main/java/com/example/loan/model/LoanApplicationResult.java
rename to samples/standalone/dsl/http-client/src/main/java/com/example/loan/model/LoanApplicationResult.java
diff --git a/samples/standalone/http-client/src/main/java/com/example/loan/model/LoanApplicationStatus.java b/samples/standalone/dsl/http-client/src/main/java/com/example/loan/model/LoanApplicationStatus.java
similarity index 100%
rename from samples/standalone/http-client/src/main/java/com/example/loan/model/LoanApplicationStatus.java
rename to samples/standalone/dsl/http-client/src/main/java/com/example/loan/model/LoanApplicationStatus.java
diff --git a/samples/standalone/http-client/src/main/resources/application.yml b/samples/standalone/dsl/http-client/src/main/resources/application.yml
similarity index 100%
rename from samples/standalone/http-client/src/main/resources/application.yml
rename to samples/standalone/dsl/http-client/src/main/resources/application.yml
diff --git a/samples/standalone/http-client/src/test/java/com/example/loan/LoanApplicationServiceTests.java b/samples/standalone/dsl/http-client/src/test/java/com/example/loan/LoanApplicationServiceTests.java
similarity index 100%
rename from samples/standalone/http-client/src/test/java/com/example/loan/LoanApplicationServiceTests.java
rename to samples/standalone/dsl/http-client/src/test/java/com/example/loan/LoanApplicationServiceTests.java
diff --git a/samples/standalone/http-client/src/test/resources/application-test-repo.yaml b/samples/standalone/dsl/http-client/src/test/resources/application-test-repo.yaml
similarity index 100%
rename from samples/standalone/http-client/src/test/resources/application-test-repo.yaml
rename to samples/standalone/dsl/http-client/src/test/resources/application-test-repo.yaml
diff --git a/samples/standalone/http-client/src/test/resources/application.yaml b/samples/standalone/dsl/http-client/src/test/resources/application.yaml
similarity index 100%
rename from samples/standalone/http-client/src/test/resources/application.yaml
rename to samples/standalone/dsl/http-client/src/test/resources/application.yaml
diff --git a/samples/standalone/http-server/.gitignore b/samples/standalone/dsl/http-server/.gitignore
similarity index 100%
rename from samples/standalone/http-server/.gitignore
rename to samples/standalone/dsl/http-server/.gitignore
diff --git a/samples/standalone/http-server/.mvn/jvm.config b/samples/standalone/dsl/http-server/.mvn/jvm.config
similarity index 100%
rename from samples/standalone/http-server/.mvn/jvm.config
rename to samples/standalone/dsl/http-server/.mvn/jvm.config
diff --git a/samples/standalone/http-server/.mvn/maven.config b/samples/standalone/dsl/http-server/.mvn/maven.config
similarity index 100%
rename from samples/standalone/http-server/.mvn/maven.config
rename to samples/standalone/dsl/http-server/.mvn/maven.config
diff --git a/samples/standalone/http-server/.mvn/wrapper/maven-wrapper.jar b/samples/standalone/dsl/http-server/.mvn/wrapper/maven-wrapper.jar
similarity index 100%
rename from samples/standalone/http-server/.mvn/wrapper/maven-wrapper.jar
rename to samples/standalone/dsl/http-server/.mvn/wrapper/maven-wrapper.jar
diff --git a/samples/standalone/http-server/.mvn/wrapper/maven-wrapper.properties b/samples/standalone/dsl/http-server/.mvn/wrapper/maven-wrapper.properties
similarity index 100%
rename from samples/standalone/http-server/.mvn/wrapper/maven-wrapper.properties
rename to samples/standalone/dsl/http-server/.mvn/wrapper/maven-wrapper.properties
diff --git a/samples/standalone/http-server/README.adoc b/samples/standalone/dsl/http-server/README.adoc
similarity index 100%
rename from samples/standalone/http-server/README.adoc
rename to samples/standalone/dsl/http-server/README.adoc
diff --git a/samples/standalone/http-server/build.gradle b/samples/standalone/dsl/http-server/build.gradle
similarity index 100%
rename from samples/standalone/http-server/build.gradle
rename to samples/standalone/dsl/http-server/build.gradle
diff --git a/samples/standalone/http-server/gradle.properties b/samples/standalone/dsl/http-server/gradle.properties
similarity index 100%
rename from samples/standalone/http-server/gradle.properties
rename to samples/standalone/dsl/http-server/gradle.properties
diff --git a/samples/standalone/http-server/gradle/wrapper/gradle-wrapper.jar b/samples/standalone/dsl/http-server/gradle/wrapper/gradle-wrapper.jar
similarity index 100%
rename from samples/standalone/http-server/gradle/wrapper/gradle-wrapper.jar
rename to samples/standalone/dsl/http-server/gradle/wrapper/gradle-wrapper.jar
diff --git a/samples/standalone/http-server/gradle/wrapper/gradle-wrapper.properties b/samples/standalone/dsl/http-server/gradle/wrapper/gradle-wrapper.properties
similarity index 100%
rename from samples/standalone/http-server/gradle/wrapper/gradle-wrapper.properties
rename to samples/standalone/dsl/http-server/gradle/wrapper/gradle-wrapper.properties
diff --git a/samples/standalone/http-server/gradlew b/samples/standalone/dsl/http-server/gradlew
similarity index 100%
rename from samples/standalone/http-server/gradlew
rename to samples/standalone/dsl/http-server/gradlew
diff --git a/samples/standalone/http-server/gradlew.bat b/samples/standalone/dsl/http-server/gradlew.bat
similarity index 100%
rename from samples/standalone/http-server/gradlew.bat
rename to samples/standalone/dsl/http-server/gradlew.bat
diff --git a/samples/standalone/http-server/mvnw b/samples/standalone/dsl/http-server/mvnw
similarity index 100%
rename from samples/standalone/http-server/mvnw
rename to samples/standalone/dsl/http-server/mvnw
diff --git a/samples/standalone/http-server/mvnw.cmd b/samples/standalone/dsl/http-server/mvnw.cmd
similarity index 100%
rename from samples/standalone/http-server/mvnw.cmd
rename to samples/standalone/dsl/http-server/mvnw.cmd
diff --git a/samples/standalone/http-server/pom.xml b/samples/standalone/dsl/http-server/pom.xml
similarity index 99%
rename from samples/standalone/http-server/pom.xml
rename to samples/standalone/dsl/http-server/pom.xml
index 80bdb58cd8..76dc7f43fa 100644
--- a/samples/standalone/http-server/pom.xml
+++ b/samples/standalone/dsl/http-server/pom.xml
@@ -4,7 +4,7 @@
4.0.0
com.example
- http-server
+ http-server-dsl
0.0.1-SNAPSHOT
Spring Cloud Contract Verifier Http Server Sample
diff --git a/samples/standalone/http-server/settings.gradle b/samples/standalone/dsl/http-server/settings.gradle
similarity index 100%
rename from samples/standalone/http-server/settings.gradle
rename to samples/standalone/dsl/http-server/settings.gradle
diff --git a/samples/standalone/http-server/src/main/java/com/example/fraud/Application.java b/samples/standalone/dsl/http-server/src/main/java/com/example/fraud/Application.java
similarity index 100%
rename from samples/standalone/http-server/src/main/java/com/example/fraud/Application.java
rename to samples/standalone/dsl/http-server/src/main/java/com/example/fraud/Application.java
diff --git a/samples/standalone/http-server/src/main/java/com/example/fraud/FraudDetectionController.java b/samples/standalone/dsl/http-server/src/main/java/com/example/fraud/FraudDetectionController.java
similarity index 100%
rename from samples/standalone/http-server/src/main/java/com/example/fraud/FraudDetectionController.java
rename to samples/standalone/dsl/http-server/src/main/java/com/example/fraud/FraudDetectionController.java
diff --git a/samples/standalone/http-server/src/main/java/com/example/fraud/model/FraudCheck.java b/samples/standalone/dsl/http-server/src/main/java/com/example/fraud/model/FraudCheck.java
similarity index 100%
rename from samples/standalone/http-server/src/main/java/com/example/fraud/model/FraudCheck.java
rename to samples/standalone/dsl/http-server/src/main/java/com/example/fraud/model/FraudCheck.java
diff --git a/samples/standalone/http-server/src/main/java/com/example/fraud/model/FraudCheckResult.java b/samples/standalone/dsl/http-server/src/main/java/com/example/fraud/model/FraudCheckResult.java
similarity index 100%
rename from samples/standalone/http-server/src/main/java/com/example/fraud/model/FraudCheckResult.java
rename to samples/standalone/dsl/http-server/src/main/java/com/example/fraud/model/FraudCheckResult.java
diff --git a/samples/standalone/http-server/src/main/java/com/example/fraud/model/FraudCheckStatus.java b/samples/standalone/dsl/http-server/src/main/java/com/example/fraud/model/FraudCheckStatus.java
similarity index 100%
rename from samples/standalone/http-server/src/main/java/com/example/fraud/model/FraudCheckStatus.java
rename to samples/standalone/dsl/http-server/src/main/java/com/example/fraud/model/FraudCheckStatus.java
diff --git a/samples/standalone/http-server/src/main/resources/application.yml b/samples/standalone/dsl/http-server/src/main/resources/application.yml
similarity index 100%
rename from samples/standalone/http-server/src/main/resources/application.yml
rename to samples/standalone/dsl/http-server/src/main/resources/application.yml
diff --git a/samples/standalone/http-server/src/test/java/com/example/fraud/MvcTest.java b/samples/standalone/dsl/http-server/src/test/java/com/example/fraud/MvcTest.java
similarity index 100%
rename from samples/standalone/http-server/src/test/java/com/example/fraud/MvcTest.java
rename to samples/standalone/dsl/http-server/src/test/java/com/example/fraud/MvcTest.java
diff --git a/samples/standalone/http-server/src/test/resources/contracts/shouldMarkClientAsFraud.groovy b/samples/standalone/dsl/http-server/src/test/resources/contracts/shouldMarkClientAsFraud.groovy
similarity index 100%
rename from samples/standalone/http-server/src/test/resources/contracts/shouldMarkClientAsFraud.groovy
rename to samples/standalone/dsl/http-server/src/test/resources/contracts/shouldMarkClientAsFraud.groovy
diff --git a/samples/standalone/http-server/src/test/resources/contracts/shouldMarkClientAsNotFraud.groovy b/samples/standalone/dsl/http-server/src/test/resources/contracts/shouldMarkClientAsNotFraud.groovy
similarity index 100%
rename from samples/standalone/http-server/src/test/resources/contracts/shouldMarkClientAsNotFraud.groovy
rename to samples/standalone/dsl/http-server/src/test/resources/contracts/shouldMarkClientAsNotFraud.groovy
diff --git a/samples/standalone/dsl/pom.xml b/samples/standalone/dsl/pom.xml
new file mode 100644
index 0000000000..345fdd2052
--- /dev/null
+++ b/samples/standalone/dsl/pom.xml
@@ -0,0 +1,51 @@
+
+
+ 4.0.0
+
+
+ org.springframework.cloud
+ spring-cloud-contract-samples-standalone
+ 1.0.0.BUILD-SNAPSHOT
+ ..
+
+
+ spring-cloud-contract-samples-dsl
+ pom
+
+ Spring Cloud Contract Standalone Test Samples
+ Spring Cloud Contract Standalone Test Samples used for end to end tests
+
+
+ http-server
+ http-client
+
+
+
+
+
+ maven-deploy-plugin
+
+ true
+
+
+
+
+
+
+ org.codehaus.gmavenplus
+ gmavenplus-plugin
+ 1.5
+
+
+
+ testCompile
+
+
+
+
+
+
+
+
+
diff --git a/samples/standalone/pom.xml b/samples/standalone/pom.xml
index 98e33aa48c..25389e6d61 100644
--- a/samples/standalone/pom.xml
+++ b/samples/standalone/pom.xml
@@ -17,8 +17,8 @@
Spring Cloud Contract Standalone Test Samples used for end to end tests
- http-server
- http-client
+ dsl
+ restdocs
stream-source
stream-sink
diff --git a/samples/standalone/restdocs/http-client/.gitignore b/samples/standalone/restdocs/http-client/.gitignore
new file mode 100644
index 0000000000..b05ba7bd6d
--- /dev/null
+++ b/samples/standalone/restdocs/http-client/.gitignore
@@ -0,0 +1,6 @@
+
+target/
+
+.gradle
+build/
+
diff --git a/samples/standalone/restdocs/http-client/.mvn/jvm.config b/samples/standalone/restdocs/http-client/.mvn/jvm.config
new file mode 100644
index 0000000000..894bef17a5
--- /dev/null
+++ b/samples/standalone/restdocs/http-client/.mvn/jvm.config
@@ -0,0 +1 @@
+-Xmx1024m -XX:MaxPermSize=256m -Djava.awt.headless=true
\ No newline at end of file
diff --git a/samples/standalone/restdocs/http-client/.mvn/maven.config b/samples/standalone/restdocs/http-client/.mvn/maven.config
new file mode 100644
index 0000000000..affad39a42
--- /dev/null
+++ b/samples/standalone/restdocs/http-client/.mvn/maven.config
@@ -0,0 +1 @@
+-T2
\ No newline at end of file
diff --git a/samples/standalone/restdocs/http-client/.mvn/wrapper/maven-wrapper.jar b/samples/standalone/restdocs/http-client/.mvn/wrapper/maven-wrapper.jar
new file mode 100644
index 0000000000..c6feb8bb6f
Binary files /dev/null and b/samples/standalone/restdocs/http-client/.mvn/wrapper/maven-wrapper.jar differ
diff --git a/samples/standalone/restdocs/http-client/.mvn/wrapper/maven-wrapper.properties b/samples/standalone/restdocs/http-client/.mvn/wrapper/maven-wrapper.properties
new file mode 100644
index 0000000000..6637cedb28
--- /dev/null
+++ b/samples/standalone/restdocs/http-client/.mvn/wrapper/maven-wrapper.properties
@@ -0,0 +1 @@
+distributionUrl=https://repo1.maven.org/maven2/org/apache/maven/apache-maven/3.3.9/apache-maven-3.3.9-bin.zip
\ No newline at end of file
diff --git a/samples/standalone/restdocs/http-client/README.adoc b/samples/standalone/restdocs/http-client/README.adoc
new file mode 100644
index 0000000000..cdcb0e4a56
--- /dev/null
+++ b/samples/standalone/restdocs/http-client/README.adoc
@@ -0,0 +1,26 @@
+= Http Client
+
+== Prerequisites
+
+First you have to publish to Maven Local the stubs of the *http-server* module
+
+== How to run it?
+
+Run
+
+[source=groovy]
+--------
+./gradlew clean build
+--------
+
+or
+
+--------
+./mvnw clean package
+--------
+
+To
+
+- build the app
+- use spring-cloud-contract-stub-runner-spring[Stub Runner Spring] to download the stub of `Http Server`
+- run the tests against stubbed server
\ No newline at end of file
diff --git a/samples/standalone/restdocs/http-client/build.gradle b/samples/standalone/restdocs/http-client/build.gradle
new file mode 100644
index 0000000000..4db1443b15
--- /dev/null
+++ b/samples/standalone/restdocs/http-client/build.gradle
@@ -0,0 +1,68 @@
+buildscript {
+ repositories {
+ mavenCentral()
+ mavenLocal()
+ maven { url "http://repo.spring.io/libs-snapshot-local" }
+ maven { url "http://repo.spring.io/libs-release-local" }
+ maven { url "http://repo.spring.io/libs-staging-local" }
+ maven { url 'http://repo.spring.io/plugins-snapshot' }
+ maven { url "http://repo.spring.io/plugins-release-local" }
+ maven { url "http://repo.spring.io/plugins-staging-local/" }
+ }
+ dependencies {
+ classpath "org.springframework.boot:spring-boot-gradle-plugin:1.4.0.BUILD-SNAPSHOT"
+ }
+}
+
+group = 'com.example'
+version = '0.0.1-SNAPSHOT'
+
+repositories {
+ mavenCentral()
+ mavenLocal()
+ maven { url "http://repo.spring.io/libs-release-local" }
+ maven { url "http://repo.spring.io/libs-snapshot-local/" }
+ maven { url "http://repo.spring.io/libs-milestone-local/" }
+}
+
+apply plugin: 'groovy'
+apply plugin: 'spring-boot'
+apply plugin: 'maven-publish'
+
+dependencyManagement {
+ imports {
+ mavenBom "org.springframework.cloud:spring-cloud-dependencies:$BOM_VERSION"
+ mavenBom "org.springframework.cloud:spring-cloud-contract-dependencies:${project.findProperty('verifierVersion') ?: verifierVersion}"
+ }
+}
+
+dependencies {
+ compile("org.springframework.boot:spring-boot-starter-web")
+ compile("org.springframework.boot:spring-boot-starter-actuator")
+
+ testCompile 'org.springframework.cloud:spring-cloud-contract-wiremock'
+ testCompile "org.springframework.cloud:spring-cloud-starter-contract-stub-runner"
+}
+
+test {
+ testLogging {
+ exceptionFormat = 'full'
+ }
+}
+
+task wrapper(type: Wrapper) {
+ gradleVersion = '2.14'
+}
+
+task resolveDependencies {
+ doLast {
+ project.rootProject.allprojects.each { subProject ->
+ subProject.buildscript.configurations.each { configuration ->
+ configuration.resolve()
+ }
+ subProject.configurations.each { configuration ->
+ configuration.resolve()
+ }
+ }
+ }
+}
diff --git a/samples/standalone/restdocs/http-client/gradle.properties b/samples/standalone/restdocs/http-client/gradle.properties
new file mode 100644
index 0000000000..004e3e550a
--- /dev/null
+++ b/samples/standalone/restdocs/http-client/gradle.properties
@@ -0,0 +1,2 @@
+verifierVersion=1.0.0.BUILD-SNAPSHOT
+BOM_VERSION=Brixton.SR3
\ No newline at end of file
diff --git a/samples/standalone/restdocs/http-client/gradle/wrapper/gradle-wrapper.jar b/samples/standalone/restdocs/http-client/gradle/wrapper/gradle-wrapper.jar
new file mode 100644
index 0000000000..d3b83982b9
Binary files /dev/null and b/samples/standalone/restdocs/http-client/gradle/wrapper/gradle-wrapper.jar differ
diff --git a/samples/standalone/restdocs/http-client/gradle/wrapper/gradle-wrapper.properties b/samples/standalone/restdocs/http-client/gradle/wrapper/gradle-wrapper.properties
new file mode 100644
index 0000000000..fe18faa66a
--- /dev/null
+++ b/samples/standalone/restdocs/http-client/gradle/wrapper/gradle-wrapper.properties
@@ -0,0 +1,6 @@
+#Thu Jul 21 10:16:50 CEST 2016
+distributionBase=GRADLE_USER_HOME
+distributionPath=wrapper/dists
+zipStoreBase=GRADLE_USER_HOME
+zipStorePath=wrapper/dists
+distributionUrl=https\://services.gradle.org/distributions/gradle-2.14.1-bin.zip
diff --git a/samples/standalone/restdocs/http-client/gradlew b/samples/standalone/restdocs/http-client/gradlew
new file mode 100755
index 0000000000..27309d9231
--- /dev/null
+++ b/samples/standalone/restdocs/http-client/gradlew
@@ -0,0 +1,164 @@
+#!/usr/bin/env bash
+
+##############################################################################
+##
+## Gradle start up script for UN*X
+##
+##############################################################################
+
+# Attempt to set APP_HOME
+# Resolve links: $0 may be a link
+PRG="$0"
+# Need this for relative symlinks.
+while [ -h "$PRG" ] ; do
+ ls=`ls -ld "$PRG"`
+ link=`expr "$ls" : '.*-> \(.*\)$'`
+ if expr "$link" : '/.*' > /dev/null; then
+ PRG="$link"
+ else
+ PRG=`dirname "$PRG"`"/$link"
+ fi
+done
+SAVED="`pwd`"
+cd "`dirname \"$PRG\"`/" >/dev/null
+APP_HOME="`pwd -P`"
+cd "$SAVED" >/dev/null
+
+APP_NAME="Gradle"
+APP_BASE_NAME=`basename "$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=""
+
+# Use the maximum available, or set MAX_FD != -1 to use that value.
+MAX_FD="maximum"
+
+warn ( ) {
+ echo "$*"
+}
+
+die ( ) {
+ echo
+ echo "$*"
+ echo
+ exit 1
+}
+
+# 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
+ ;;
+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" = "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
+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
+
+# For Cygwin, switch paths to Windows format before running java
+if $cygwin ; 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
+ # 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\""
+ fi
+ i=$((i+1))
+ 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
+
+# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules
+function splitJvmOpts() {
+ JVM_OPTS=("$@")
+}
+eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS
+JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME"
+
+exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@"
diff --git a/samples/standalone/restdocs/http-client/gradlew.bat b/samples/standalone/restdocs/http-client/gradlew.bat
new file mode 100644
index 0000000000..832fdb6079
--- /dev/null
+++ b/samples/standalone/restdocs/http-client/gradlew.bat
@@ -0,0 +1,90 @@
+@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 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=
+
+@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 init
+
+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 init
+
+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
+
+:init
+@rem Get command-line arguments, handling Windows variants
+
+if not "%OS%" == "Windows_NT" goto win9xME_args
+if "%@eval[2+2]" == "4" goto 4NT_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=%*
+goto execute
+
+:4NT_args
+@rem Get arguments from the 4NT Shell from JP Software
+set CMD_LINE_ARGS=%$
+
+: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 %CMD_LINE_ARGS%
+
+: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/samples/standalone/restdocs/http-client/mvnw b/samples/standalone/restdocs/http-client/mvnw
new file mode 100755
index 0000000000..fc7efd17d0
--- /dev/null
+++ b/samples/standalone/restdocs/http-client/mvnw
@@ -0,0 +1,234 @@
+#!/bin/sh
+# ----------------------------------------------------------------------------
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+# ----------------------------------------------------------------------------
+
+# ----------------------------------------------------------------------------
+# Maven2 Start Up Batch script
+#
+# Required ENV vars:
+# ------------------
+# JAVA_HOME - location of a JDK home dir
+#
+# Optional ENV vars
+# -----------------
+# M2_HOME - location of maven2's installed home dir
+# MAVEN_OPTS - parameters passed to the Java VM when running Maven
+# e.g. to debug Maven itself, use
+# set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000
+# MAVEN_SKIP_RC - flag to disable loading of mavenrc files
+# ----------------------------------------------------------------------------
+
+if [ -z "$MAVEN_SKIP_RC" ] ; then
+
+ if [ -f /etc/mavenrc ] ; then
+ . /etc/mavenrc
+ fi
+
+ if [ -f "$HOME/.mavenrc" ] ; then
+ . "$HOME/.mavenrc"
+ fi
+
+fi
+
+# OS specific support. $var _must_ be set to either true or false.
+cygwin=false;
+darwin=false;
+mingw=false
+case "`uname`" in
+ CYGWIN*) cygwin=true ;;
+ MINGW*) mingw=true;;
+ Darwin*) darwin=true
+ #
+ # Look for the Apple JDKs first to preserve the existing behaviour, and then look
+ # for the new JDKs provided by Oracle.
+ #
+ if [ -z "$JAVA_HOME" ] && [ -L /System/Library/Frameworks/JavaVM.framework/Versions/CurrentJDK ] ; then
+ #
+ # Apple JDKs
+ #
+ export JAVA_HOME=/System/Library/Frameworks/JavaVM.framework/Versions/CurrentJDK/Home
+ fi
+
+ if [ -z "$JAVA_HOME" ] && [ -L /System/Library/Java/JavaVirtualMachines/CurrentJDK ] ; then
+ #
+ # Apple JDKs
+ #
+ export JAVA_HOME=/System/Library/Java/JavaVirtualMachines/CurrentJDK/Contents/Home
+ fi
+
+ if [ -z "$JAVA_HOME" ] && [ -L "/Library/Java/JavaVirtualMachines/CurrentJDK" ] ; then
+ #
+ # Oracle JDKs
+ #
+ export JAVA_HOME=/Library/Java/JavaVirtualMachines/CurrentJDK/Contents/Home
+ fi
+
+ if [ -z "$JAVA_HOME" ] && [ -x "/usr/libexec/java_home" ]; then
+ #
+ # Apple JDKs
+ #
+ export JAVA_HOME=`/usr/libexec/java_home`
+ fi
+ ;;
+esac
+
+if [ -z "$JAVA_HOME" ] ; then
+ if [ -r /etc/gentoo-release ] ; then
+ JAVA_HOME=`java-config --jre-home`
+ fi
+fi
+
+if [ -z "$M2_HOME" ] ; then
+ ## resolve links - $0 may be a link to maven's home
+ PRG="$0"
+
+ # need this for relative symlinks
+ while [ -h "$PRG" ] ; do
+ ls=`ls -ld "$PRG"`
+ link=`expr "$ls" : '.*-> \(.*\)$'`
+ if expr "$link" : '/.*' > /dev/null; then
+ PRG="$link"
+ else
+ PRG="`dirname "$PRG"`/$link"
+ fi
+ done
+
+ saveddir=`pwd`
+
+ M2_HOME=`dirname "$PRG"`/..
+
+ # make it fully qualified
+ M2_HOME=`cd "$M2_HOME" && pwd`
+
+ cd "$saveddir"
+ # echo Using m2 at $M2_HOME
+fi
+
+# For Cygwin, ensure paths are in UNIX format before anything is touched
+if $cygwin ; then
+ [ -n "$M2_HOME" ] &&
+ M2_HOME=`cygpath --unix "$M2_HOME"`
+ [ -n "$JAVA_HOME" ] &&
+ JAVA_HOME=`cygpath --unix "$JAVA_HOME"`
+ [ -n "$CLASSPATH" ] &&
+ CLASSPATH=`cygpath --path --unix "$CLASSPATH"`
+fi
+
+# For Migwn, ensure paths are in UNIX format before anything is touched
+if $mingw ; then
+ [ -n "$M2_HOME" ] &&
+ M2_HOME="`(cd "$M2_HOME"; pwd)`"
+ [ -n "$JAVA_HOME" ] &&
+ JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`"
+ # TODO classpath?
+fi
+
+if [ -z "$JAVA_HOME" ]; then
+ javaExecutable="`which javac`"
+ if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then
+ # readlink(1) is not available as standard on Solaris 10.
+ readLink=`which readlink`
+ if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then
+ if $darwin ; then
+ javaHome="`dirname \"$javaExecutable\"`"
+ javaExecutable="`cd \"$javaHome\" && pwd -P`/javac"
+ else
+ javaExecutable="`readlink -f \"$javaExecutable\"`"
+ fi
+ javaHome="`dirname \"$javaExecutable\"`"
+ javaHome=`expr "$javaHome" : '\(.*\)/bin'`
+ JAVA_HOME="$javaHome"
+ export JAVA_HOME
+ fi
+ fi
+fi
+
+if [ -z "$JAVACMD" ] ; then
+ 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
+ else
+ JAVACMD="`which java`"
+ fi
+fi
+
+if [ ! -x "$JAVACMD" ] ; then
+ echo "Error: JAVA_HOME is not defined correctly." >&2
+ echo " We cannot execute $JAVACMD" >&2
+ exit 1
+fi
+
+if [ -z "$JAVA_HOME" ] ; then
+ echo "Warning: JAVA_HOME environment variable is not set."
+fi
+
+CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher
+
+# For Cygwin, switch paths to Windows format before running java
+if $cygwin; then
+ [ -n "$M2_HOME" ] &&
+ M2_HOME=`cygpath --path --windows "$M2_HOME"`
+ [ -n "$JAVA_HOME" ] &&
+ JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"`
+ [ -n "$CLASSPATH" ] &&
+ CLASSPATH=`cygpath --path --windows "$CLASSPATH"`
+fi
+
+# traverses directory structure from process work directory to filesystem root
+# first directory with .mvn subdirectory is considered project base directory
+find_maven_basedir() {
+ local basedir=$(pwd)
+ local wdir=$(pwd)
+ while [ "$wdir" != '/' ] ; do
+ if [ -d "$wdir"/.mvn ] ; then
+ basedir=$wdir
+ break
+ fi
+ wdir=$(cd "$wdir/.."; pwd)
+ done
+ echo "${basedir}"
+}
+
+# concatenates all lines of a file
+concat_lines() {
+ if [ -f "$1" ]; then
+ echo "$(tr -s '\n' ' ' < "$1")"
+ fi
+}
+
+export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-$(find_maven_basedir)}
+MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS"
+
+# Provide a "standardized" way to retrieve the CLI args that will
+# work with both Windows and non-Windows executions.
+MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $@"
+export MAVEN_CMD_LINE_ARGS
+
+WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain
+
+exec "$JAVACMD" \
+ $MAVEN_OPTS \
+ -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \
+ "-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \
+ ${WRAPPER_LAUNCHER} $MAVEN_CMD_LINE_ARGS
+
diff --git a/samples/standalone/restdocs/http-client/mvnw.cmd b/samples/standalone/restdocs/http-client/mvnw.cmd
new file mode 100644
index 0000000000..001048081d
--- /dev/null
+++ b/samples/standalone/restdocs/http-client/mvnw.cmd
@@ -0,0 +1,145 @@
+@REM ----------------------------------------------------------------------------
+@REM Licensed to the Apache Software Foundation (ASF) under one
+@REM or more contributor license agreements. See the NOTICE file
+@REM distributed with this work for additional information
+@REM regarding copyright ownership. The ASF licenses this file
+@REM to you under the Apache License, Version 2.0 (the
+@REM "License"); you may not use this file except in compliance
+@REM with the License. You may obtain a copy of the License at
+@REM
+@REM http://www.apache.org/licenses/LICENSE-2.0
+@REM
+@REM Unless required by applicable law or agreed to in writing,
+@REM software distributed under the License is distributed on an
+@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+@REM KIND, either express or implied. See the License for the
+@REM specific language governing permissions and limitations
+@REM under the License.
+@REM ----------------------------------------------------------------------------
+
+@REM ----------------------------------------------------------------------------
+@REM Maven2 Start Up Batch script
+@REM
+@REM Required ENV vars:
+@REM JAVA_HOME - location of a JDK home dir
+@REM
+@REM Optional ENV vars
+@REM M2_HOME - location of maven2's installed home dir
+@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands
+@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a key stroke before ending
+@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven
+@REM e.g. to debug Maven itself, use
+@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000
+@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files
+@REM ----------------------------------------------------------------------------
+
+@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on'
+@echo off
+@REM enable echoing my setting MAVEN_BATCH_ECHO to 'on'
+@if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO%
+
+@REM set %HOME% to equivalent of $HOME
+if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%")
+
+@REM Execute a user defined script before this one
+if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre
+@REM check for pre script, once with legacy .bat ending and once with .cmd ending
+if exist "%HOME%\mavenrc_pre.bat" call "%HOME%\mavenrc_pre.bat"
+if exist "%HOME%\mavenrc_pre.cmd" call "%HOME%\mavenrc_pre.cmd"
+:skipRcPre
+
+@setlocal
+
+set ERROR_CODE=0
+
+@REM To isolate internal variables from possible post scripts, we use another setlocal
+@setlocal
+
+@REM ==== START VALIDATION ====
+if not "%JAVA_HOME%" == "" goto OkJHome
+
+echo.
+echo Error: JAVA_HOME not found in your environment. >&2
+echo Please set the JAVA_HOME variable in your environment to match the >&2
+echo location of your Java installation. >&2
+echo.
+goto error
+
+:OkJHome
+if exist "%JAVA_HOME%\bin\java.exe" goto init
+
+echo.
+echo Error: JAVA_HOME is set to an invalid directory. >&2
+echo JAVA_HOME = "%JAVA_HOME%" >&2
+echo Please set the JAVA_HOME variable in your environment to match the >&2
+echo location of your Java installation. >&2
+echo.
+goto error
+
+@REM ==== END VALIDATION ====
+
+:init
+
+set MAVEN_CMD_LINE_ARGS=%MAVEN_CONFIG% %*
+
+@REM Find the project base dir, i.e. the directory that contains the folder ".mvn".
+@REM Fallback to current working directory if not found.
+
+set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR%
+IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir
+
+set EXEC_DIR=%CD%
+set WDIR=%EXEC_DIR%
+:findBaseDir
+IF EXIST "%WDIR%"\.mvn goto baseDirFound
+cd ..
+IF "%WDIR%"=="%CD%" goto baseDirNotFound
+set WDIR=%CD%
+goto findBaseDir
+
+:baseDirFound
+set MAVEN_PROJECTBASEDIR=%WDIR%
+cd "%EXEC_DIR%"
+goto endDetectBaseDir
+
+:baseDirNotFound
+set MAVEN_PROJECTBASEDIR=%EXEC_DIR%
+cd "%EXEC_DIR%"
+
+:endDetectBaseDir
+
+IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig
+
+@setlocal EnableExtensions EnableDelayedExpansion
+for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a
+@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS%
+
+:endReadAdditionalConfig
+
+SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe"
+
+set WRAPPER_JAR=""%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar""
+set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain
+
+%MAVEN_JAVA_EXE% %JVM_CONFIG_MAVEN_PROPS% %MAVEN_OPTS% %MAVEN_DEBUG_OPTS% -classpath %WRAPPER_JAR% "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" %WRAPPER_LAUNCHER% %MAVEN_CMD_LINE_ARGS%
+if ERRORLEVEL 1 goto error
+goto end
+
+:error
+set ERROR_CODE=1
+
+:end
+@endlocal & set ERROR_CODE=%ERROR_CODE%
+
+if not "%MAVEN_SKIP_RC%" == "" goto skipRcPost
+@REM check for post script, once with legacy .bat ending and once with .cmd ending
+if exist "%HOME%\mavenrc_post.bat" call "%HOME%\mavenrc_post.bat"
+if exist "%HOME%\mavenrc_post.cmd" call "%HOME%\mavenrc_post.cmd"
+:skipRcPost
+
+@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on'
+if "%MAVEN_BATCH_PAUSE%" == "on" pause
+
+if "%MAVEN_TERMINATE_CMD%" == "on" exit %ERROR_CODE%
+
+exit /B %ERROR_CODE%
diff --git a/samples/standalone/restdocs/http-client/pom.xml b/samples/standalone/restdocs/http-client/pom.xml
new file mode 100644
index 0000000000..87df44efca
--- /dev/null
+++ b/samples/standalone/restdocs/http-client/pom.xml
@@ -0,0 +1,155 @@
+
+
+ 4.0.0
+
+ com.example
+ http-client-restdocs
+ 0.0.1-SNAPSHOT
+
+ Spring Cloud Contract Verifier Http Client Sample
+ Spring Cloud Contract Verifier Http Client Sample
+
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ 1.4.0.BUILD-SNAPSHOT
+
+
+
+
+ UTF-8
+ 1.8
+ 1.0.0.BUILD-SNAPSHOT
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+ org.springframework.boot
+ spring-boot-starter-actuator
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+ org.springframework.cloud
+ spring-cloud-contract-wiremock
+ test
+
+
+ com.example
+ http-server-restdocs
+ stubs
+ 0.0.1-SNAPSHOT
+ test
+
+
+
+
+
+
+
+
+ org.springframework.cloud
+ spring-cloud-contract-dependencies
+ ${spring-cloud-contract.version}
+ pom
+ import
+
+
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+
+ maven-deploy-plugin
+
+ true
+
+
+
+
+
+
+
+ spring
+
+ true
+
+
+
+ spring-snapshots
+ Spring Snapshots
+ http://repo.spring.io/libs-snapshot-local
+
+ true
+
+
+
+ spring-milestones
+ Spring Milestones
+ http://repo.spring.io/libs-milestone-local
+
+ false
+
+
+
+ spring-releases
+ Spring Releases
+ http://repo.spring.io/release
+
+ false
+
+
+
+
+
+ spring-snapshots
+ Spring Snapshots
+ http://repo.spring.io/libs-snapshot-local
+
+ true
+
+
+
+ spring-milestones
+ Spring Milestones
+ http://repo.spring.io/libs-milestone-local
+
+ false
+
+
+
+ spring-plugin-snapshots
+ Spring Snapshots
+ http://repo.spring.io/plugins-snapshot-local
+
+ true
+
+
+
+ spring-plugin-milestones
+ Spring Milestones
+ http://repo.spring.io/plugins-milestone-local
+
+ false
+
+
+
+
+
+
+
diff --git a/samples/standalone/restdocs/http-client/settings.gradle b/samples/standalone/restdocs/http-client/settings.gradle
new file mode 100644
index 0000000000..8dc58d5ad1
--- /dev/null
+++ b/samples/standalone/restdocs/http-client/settings.gradle
@@ -0,0 +1 @@
+rootProject.name = 'http-client'
diff --git a/samples/standalone/restdocs/http-client/src/main/java/com/example/loan/Application.java b/samples/standalone/restdocs/http-client/src/main/java/com/example/loan/Application.java
new file mode 100644
index 0000000000..6f36301172
--- /dev/null
+++ b/samples/standalone/restdocs/http-client/src/main/java/com/example/loan/Application.java
@@ -0,0 +1,13 @@
+package com.example.loan;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class Application {
+
+ public static void main(String[] args) {
+ SpringApplication.run(Application.class, args);
+ }
+
+}
diff --git a/samples/standalone/restdocs/http-client/src/main/java/com/example/loan/LoanApplicationService.java b/samples/standalone/restdocs/http-client/src/main/java/com/example/loan/LoanApplicationService.java
new file mode 100644
index 0000000000..33cd026aac
--- /dev/null
+++ b/samples/standalone/restdocs/http-client/src/main/java/com/example/loan/LoanApplicationService.java
@@ -0,0 +1,71 @@
+package com.example.loan;
+
+import org.springframework.http.HttpEntity;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.HttpMethod;
+import org.springframework.http.ResponseEntity;
+import org.springframework.stereotype.Service;
+import org.springframework.web.client.RestTemplate;
+
+import com.example.loan.model.FraudCheckStatus;
+import com.example.loan.model.FraudServiceRequest;
+import com.example.loan.model.FraudServiceResponse;
+import com.example.loan.model.LoanApplication;
+import com.example.loan.model.LoanApplicationResult;
+import com.example.loan.model.LoanApplicationStatus;
+
+@Service
+public class LoanApplicationService {
+
+ private static final String FRAUD_SERVICE_JSON_VERSION_1 =
+ "application/vnd.fraud.v1+json";
+
+ private final RestTemplate restTemplate;
+
+ private int port = 8080;
+
+ public LoanApplicationService() {
+ this.restTemplate = new RestTemplate();
+ }
+
+ public LoanApplicationResult loanApplication(LoanApplication loanApplication) {
+ FraudServiceRequest request =
+ new FraudServiceRequest(loanApplication);
+
+ FraudServiceResponse response =
+ sendRequestToFraudDetectionService(request);
+
+ return buildResponseFromFraudResult(response);
+ }
+
+ private FraudServiceResponse sendRequestToFraudDetectionService(
+ FraudServiceRequest request) {
+ HttpHeaders httpHeaders = new HttpHeaders();
+ httpHeaders.add(HttpHeaders.CONTENT_TYPE, FRAUD_SERVICE_JSON_VERSION_1);
+
+ // tag::client_call_server[]
+ ResponseEntity response =
+ restTemplate.exchange("http://localhost:" + port + "/fraudcheck", HttpMethod.PUT,
+ new HttpEntity<>(request, httpHeaders),
+ FraudServiceResponse.class);
+ // end::client_call_server[]
+
+ return response.getBody();
+ }
+
+ private LoanApplicationResult buildResponseFromFraudResult(FraudServiceResponse response) {
+ LoanApplicationStatus applicationStatus = null;
+ if (FraudCheckStatus.OK == response.getFraudCheckStatus()) {
+ applicationStatus = LoanApplicationStatus.LOAN_APPLIED;
+ } else if (FraudCheckStatus.FRAUD == response.getFraudCheckStatus()) {
+ applicationStatus = LoanApplicationStatus.LOAN_APPLICATION_REJECTED;
+ }
+
+ return new LoanApplicationResult(applicationStatus, response.getRejectionReason());
+ }
+
+ public void setPort(int port) {
+ this.port = port;
+ }
+
+}
diff --git a/samples/standalone/restdocs/http-client/src/main/java/com/example/loan/model/Client.java b/samples/standalone/restdocs/http-client/src/main/java/com/example/loan/model/Client.java
new file mode 100644
index 0000000000..abf66106b5
--- /dev/null
+++ b/samples/standalone/restdocs/http-client/src/main/java/com/example/loan/model/Client.java
@@ -0,0 +1,21 @@
+package com.example.loan.model;
+
+public class Client {
+
+ private String pesel;
+
+ public Client() {
+ }
+
+ public Client(String pesel) {
+ this.pesel = pesel;
+ }
+
+ public String getPesel() {
+ return pesel;
+ }
+
+ public void setPesel(String pesel) {
+ this.pesel = pesel;
+ }
+}
diff --git a/samples/standalone/restdocs/http-client/src/main/java/com/example/loan/model/FraudCheckStatus.java b/samples/standalone/restdocs/http-client/src/main/java/com/example/loan/model/FraudCheckStatus.java
new file mode 100644
index 0000000000..c5217ef471
--- /dev/null
+++ b/samples/standalone/restdocs/http-client/src/main/java/com/example/loan/model/FraudCheckStatus.java
@@ -0,0 +1,5 @@
+package com.example.loan.model;
+
+public enum FraudCheckStatus {
+ OK, FRAUD
+}
diff --git a/samples/standalone/restdocs/http-client/src/main/java/com/example/loan/model/FraudServiceRequest.java b/samples/standalone/restdocs/http-client/src/main/java/com/example/loan/model/FraudServiceRequest.java
new file mode 100644
index 0000000000..0230540131
--- /dev/null
+++ b/samples/standalone/restdocs/http-client/src/main/java/com/example/loan/model/FraudServiceRequest.java
@@ -0,0 +1,34 @@
+package com.example.loan.model;
+
+import java.math.BigDecimal;
+
+public class FraudServiceRequest {
+
+ private String clientId;
+
+ private BigDecimal loanAmount;
+
+ public FraudServiceRequest() {
+ }
+
+ public FraudServiceRequest(LoanApplication loanApplication) {
+ this.clientId = loanApplication.getClient().getPesel();
+ this.loanAmount = loanApplication.getAmount();
+ }
+
+ public String getClientId() {
+ return clientId;
+ }
+
+ public void setClientId(String clientId) {
+ this.clientId = clientId;
+ }
+
+ public BigDecimal getLoanAmount() {
+ return loanAmount;
+ }
+
+ public void setLoanAmount(BigDecimal loanAmount) {
+ this.loanAmount = loanAmount;
+ }
+}
diff --git a/samples/standalone/restdocs/http-client/src/main/java/com/example/loan/model/FraudServiceResponse.java b/samples/standalone/restdocs/http-client/src/main/java/com/example/loan/model/FraudServiceResponse.java
new file mode 100644
index 0000000000..50e64478b9
--- /dev/null
+++ b/samples/standalone/restdocs/http-client/src/main/java/com/example/loan/model/FraudServiceResponse.java
@@ -0,0 +1,27 @@
+package com.example.loan.model;
+
+public class FraudServiceResponse {
+
+ private FraudCheckStatus fraudCheckStatus;
+
+ private String rejectionReason;
+
+ public FraudServiceResponse() {
+ }
+
+ public FraudCheckStatus getFraudCheckStatus() {
+ return fraudCheckStatus;
+ }
+
+ public void setFraudCheckStatus(FraudCheckStatus fraudCheckStatus) {
+ this.fraudCheckStatus = fraudCheckStatus;
+ }
+
+ public String getRejectionReason() {
+ return rejectionReason;
+ }
+
+ public void setRejectionReason(String rejectionReason) {
+ this.rejectionReason = rejectionReason;
+ }
+}
diff --git a/samples/standalone/restdocs/http-client/src/main/java/com/example/loan/model/LoanApplication.java b/samples/standalone/restdocs/http-client/src/main/java/com/example/loan/model/LoanApplication.java
new file mode 100644
index 0000000000..27d66f884c
--- /dev/null
+++ b/samples/standalone/restdocs/http-client/src/main/java/com/example/loan/model/LoanApplication.java
@@ -0,0 +1,44 @@
+package com.example.loan.model;
+
+import java.math.BigDecimal;
+
+public class LoanApplication {
+
+ private Client client;
+
+ private BigDecimal amount;
+
+ private String loanApplicationId;
+
+ public LoanApplication() {
+ }
+
+ public LoanApplication(Client client, double amount) {
+ this.client = client;
+ this.amount = BigDecimal.valueOf(amount);
+ }
+
+ public Client getClient() {
+ return client;
+ }
+
+ public void setClient(Client client) {
+ this.client = client;
+ }
+
+ public BigDecimal getAmount() {
+ return amount;
+ }
+
+ public void setAmount(BigDecimal amount) {
+ this.amount = amount;
+ }
+
+ public String getLoanApplicationId() {
+ return loanApplicationId;
+ }
+
+ public void setLoanApplicationId(String loanApplicationId) {
+ this.loanApplicationId = loanApplicationId;
+ }
+}
diff --git a/samples/standalone/restdocs/http-client/src/main/java/com/example/loan/model/LoanApplicationResult.java b/samples/standalone/restdocs/http-client/src/main/java/com/example/loan/model/LoanApplicationResult.java
new file mode 100644
index 0000000000..ffd44e1a26
--- /dev/null
+++ b/samples/standalone/restdocs/http-client/src/main/java/com/example/loan/model/LoanApplicationResult.java
@@ -0,0 +1,32 @@
+package com.example.loan.model;
+
+public class LoanApplicationResult {
+
+ private LoanApplicationStatus loanApplicationStatus;
+
+ private String rejectionReason;
+
+ public LoanApplicationResult() {
+ }
+
+ public LoanApplicationResult(LoanApplicationStatus loanApplicationStatus, String rejectionReason) {
+ this.loanApplicationStatus = loanApplicationStatus;
+ this.rejectionReason = rejectionReason;
+ }
+
+ public LoanApplicationStatus getLoanApplicationStatus() {
+ return loanApplicationStatus;
+ }
+
+ public void setLoanApplicationStatus(LoanApplicationStatus loanApplicationStatus) {
+ this.loanApplicationStatus = loanApplicationStatus;
+ }
+
+ public String getRejectionReason() {
+ return rejectionReason;
+ }
+
+ public void setRejectionReason(String rejectionReason) {
+ this.rejectionReason = rejectionReason;
+ }
+}
diff --git a/samples/standalone/restdocs/http-client/src/main/java/com/example/loan/model/LoanApplicationStatus.java b/samples/standalone/restdocs/http-client/src/main/java/com/example/loan/model/LoanApplicationStatus.java
new file mode 100644
index 0000000000..34cf91a89f
--- /dev/null
+++ b/samples/standalone/restdocs/http-client/src/main/java/com/example/loan/model/LoanApplicationStatus.java
@@ -0,0 +1,5 @@
+package com.example.loan.model;
+
+public enum LoanApplicationStatus {
+ LOAN_APPLIED, LOAN_APPLICATION_REJECTED
+}
diff --git a/samples/standalone/restdocs/http-client/src/main/resources/application.yml b/samples/standalone/restdocs/http-client/src/main/resources/application.yml
new file mode 100644
index 0000000000..0cde20a49d
--- /dev/null
+++ b/samples/standalone/restdocs/http-client/src/main/resources/application.yml
@@ -0,0 +1,5 @@
+server.port: 8090
+logging:
+ level:
+ org.springframework.web.client: debug
+ com.github.tomakehurst.wiremock: trace
\ No newline at end of file
diff --git a/samples/standalone/restdocs/http-client/src/test/java/com/example/loan/LoanApplicationServiceTests.java b/samples/standalone/restdocs/http-client/src/test/java/com/example/loan/LoanApplicationServiceTests.java
new file mode 100644
index 0000000000..f7f02a2ab6
--- /dev/null
+++ b/samples/standalone/restdocs/http-client/src/test/java/com/example/loan/LoanApplicationServiceTests.java
@@ -0,0 +1,67 @@
+package com.example.loan;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.boot.test.context.TestConfiguration;
+import org.springframework.cloud.contract.wiremock.AutoConfigureWireMock;
+import org.springframework.cloud.contract.wiremock.WireMockSpring;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Import;
+import org.springframework.test.context.junit4.SpringRunner;
+
+import com.example.loan.model.Client;
+import com.example.loan.model.LoanApplication;
+import com.example.loan.model.LoanApplicationResult;
+import com.example.loan.model.LoanApplicationStatus;
+import com.github.tomakehurst.wiremock.core.Options;
+
+@RunWith(SpringRunner.class)
+@SpringBootTest(classes=TestConfiguration.class)
+@AutoConfigureWireMock
+public class LoanApplicationServiceTests {
+
+ @Autowired
+ private LoanApplicationService sut;
+
+ @Test
+ public void shouldSuccessfullyApplyForLoan() {
+ // given:
+ LoanApplication application = new LoanApplication(new Client("1234567890"),
+ 123.123);
+ // when:
+ LoanApplicationResult loanApplication = sut.loanApplication(application);
+ // then:
+ assertThat(loanApplication.getLoanApplicationStatus())
+ .isEqualTo(LoanApplicationStatus.LOAN_APPLIED);
+ assertThat(loanApplication.getRejectionReason()).isNull();
+ }
+
+ @Test
+ public void shouldBeRejectedDueToAbnormalLoanAmount() {
+ // given:
+ LoanApplication application = new LoanApplication(new Client("1234567890"),
+ 99999);
+ // when:
+ LoanApplicationResult loanApplication = sut.loanApplication(application);
+ // then:
+ assertThat(loanApplication.getLoanApplicationStatus())
+ .isEqualTo(LoanApplicationStatus.LOAN_APPLICATION_REJECTED);
+ assertThat(loanApplication.getRejectionReason()).isEqualTo("Amount too high");
+ }
+
+ @Configuration
+ @Import(Application.class)
+ protected static class TestConfiguration {
+
+ @Bean
+ public Options wiremockOptions() {
+ return WireMockSpring.options().usingFilesUnderClasspath("META-INF/wiremock");
+ }
+
+ }
+}
diff --git a/samples/standalone/restdocs/http-client/src/test/resources/application-test-repo.yaml b/samples/standalone/restdocs/http-client/src/test/resources/application-test-repo.yaml
new file mode 100644
index 0000000000..2ac488ce08
--- /dev/null
+++ b/samples/standalone/restdocs/http-client/src/test/resources/application-test-repo.yaml
@@ -0,0 +1,3 @@
+stubrunner.stubs:
+ ids: 'com.example:http-server:+:stubs:8080'
+ repositoryRoot: http://repo.spring.io/libs-snapshot
diff --git a/samples/standalone/restdocs/http-client/src/test/resources/application.yaml b/samples/standalone/restdocs/http-client/src/test/resources/application.yaml
new file mode 100644
index 0000000000..b260e2bac4
--- /dev/null
+++ b/samples/standalone/restdocs/http-client/src/test/resources/application.yaml
@@ -0,0 +1,3 @@
+stubrunner:
+ work-offline: true
+ stubs.ids: 'com.example:http-server:+:stubs:8080'
\ No newline at end of file
diff --git a/samples/standalone/restdocs/http-server/.gitignore b/samples/standalone/restdocs/http-server/.gitignore
new file mode 100644
index 0000000000..b05ba7bd6d
--- /dev/null
+++ b/samples/standalone/restdocs/http-server/.gitignore
@@ -0,0 +1,6 @@
+
+target/
+
+.gradle
+build/
+
diff --git a/samples/standalone/restdocs/http-server/.mvn/jvm.config b/samples/standalone/restdocs/http-server/.mvn/jvm.config
new file mode 100644
index 0000000000..894bef17a5
--- /dev/null
+++ b/samples/standalone/restdocs/http-server/.mvn/jvm.config
@@ -0,0 +1 @@
+-Xmx1024m -XX:MaxPermSize=256m -Djava.awt.headless=true
\ No newline at end of file
diff --git a/samples/standalone/restdocs/http-server/.mvn/maven.config b/samples/standalone/restdocs/http-server/.mvn/maven.config
new file mode 100644
index 0000000000..7681bc67b9
--- /dev/null
+++ b/samples/standalone/restdocs/http-server/.mvn/maven.config
@@ -0,0 +1 @@
+-T2
diff --git a/samples/standalone/restdocs/http-server/.mvn/wrapper/maven-wrapper.jar b/samples/standalone/restdocs/http-server/.mvn/wrapper/maven-wrapper.jar
new file mode 100644
index 0000000000..c6feb8bb6f
Binary files /dev/null and b/samples/standalone/restdocs/http-server/.mvn/wrapper/maven-wrapper.jar differ
diff --git a/samples/standalone/restdocs/http-server/.mvn/wrapper/maven-wrapper.properties b/samples/standalone/restdocs/http-server/.mvn/wrapper/maven-wrapper.properties
new file mode 100644
index 0000000000..6637cedb28
--- /dev/null
+++ b/samples/standalone/restdocs/http-server/.mvn/wrapper/maven-wrapper.properties
@@ -0,0 +1 @@
+distributionUrl=https://repo1.maven.org/maven2/org/apache/maven/apache-maven/3.3.9/apache-maven-3.3.9-bin.zip
\ No newline at end of file
diff --git a/samples/standalone/restdocs/http-server/README.adoc b/samples/standalone/restdocs/http-server/README.adoc
new file mode 100644
index 0000000000..2fd3fbc40d
--- /dev/null
+++ b/samples/standalone/restdocs/http-server/README.adoc
@@ -0,0 +1,20 @@
+= Http Server
+
+Run
+
+[source=groovy]
+--------
+./gradlew clean build publishToMavenLocal
+--------
+
+or
+
+--------
+./mvnw clean install
+--------
+
+To
+
+- build the app
+- generate and run Spring Cloud Contract Verifier tests
+- publish the fatJar and the stubs to Maven Local
\ No newline at end of file
diff --git a/samples/standalone/restdocs/http-server/build.gradle b/samples/standalone/restdocs/http-server/build.gradle
new file mode 100644
index 0000000000..6279c4264c
--- /dev/null
+++ b/samples/standalone/restdocs/http-server/build.gradle
@@ -0,0 +1,74 @@
+buildscript {
+ repositories {
+ mavenCentral()
+ mavenLocal()
+ maven { url "http://repo.spring.io/libs-snapshot-local" }
+ maven { url "http://repo.spring.io/libs-release-local" }
+ maven { url "http://repo.spring.io/libs-staging-local/" }
+ maven { url 'http://repo.spring.io/plugins-snapshot' }
+ maven { url "http://repo.spring.io/plugins-release-local" }
+ maven { url "http://repo.spring.io/plugins-staging-local/" }
+ }
+ dependencies {
+ classpath "org.springframework.boot:spring-boot-gradle-plugin:1.4.0.BUILD-SNAPSHOT"
+ classpath "org.springframework.cloud:spring-cloud-contract-gradle-plugin:${findProperty('verifierVersion') ?: verifierVersion}"
+ }
+}
+
+group = 'com.example'
+version = '0.0.1-SNAPSHOT'
+
+repositories {
+ mavenCentral()
+ mavenLocal()
+ maven { url "http://repo.spring.io/snapshot" }
+ maven { url "http://repo.spring.io/milestone" }
+ maven { url "http://repo.spring.io/libs-release-local" }
+ maven { url "http://repo.spring.io/libs-staging-local/" }
+}
+
+apply plugin: 'groovy'
+apply plugin: 'spring-boot'
+apply plugin: 'spring-cloud-contract'
+apply plugin: 'maven-publish'
+
+dependencyManagement {
+ imports {
+ mavenBom "org.springframework.cloud:spring-cloud-dependencies:$BOM_VERSION"
+ mavenBom "org.springframework.cloud:spring-cloud-contract-dependencies:${project.findProperty('verifierVersion') ?: verifierVersion}"
+ }
+}
+
+contracts {
+ baseClassForTests = 'com.example.fraud.MvcTest'
+}
+
+dependencies {
+ compile("org.springframework.boot:spring-boot-starter-web")
+ compile("org.springframework.boot:spring-boot-starter-actuator")
+
+ testCompile 'org.springframework.cloud:spring-cloud-starter-contract-verifier'
+}
+
+test {
+ testLogging {
+ exceptionFormat = 'full'
+ }
+}
+
+task wrapper(type: Wrapper) {
+ gradleVersion = '2.14'
+}
+
+task resolveDependencies {
+ doLast {
+ project.rootProject.allprojects.each { subProject ->
+ subProject.buildscript.configurations.each { configuration ->
+ configuration.resolve()
+ }
+ subProject.configurations.each { configuration ->
+ configuration.resolve()
+ }
+ }
+ }
+}
diff --git a/samples/standalone/restdocs/http-server/gradle.properties b/samples/standalone/restdocs/http-server/gradle.properties
new file mode 100644
index 0000000000..004e3e550a
--- /dev/null
+++ b/samples/standalone/restdocs/http-server/gradle.properties
@@ -0,0 +1,2 @@
+verifierVersion=1.0.0.BUILD-SNAPSHOT
+BOM_VERSION=Brixton.SR3
\ No newline at end of file
diff --git a/samples/standalone/restdocs/http-server/gradle/wrapper/gradle-wrapper.jar b/samples/standalone/restdocs/http-server/gradle/wrapper/gradle-wrapper.jar
new file mode 100644
index 0000000000..d3b83982b9
Binary files /dev/null and b/samples/standalone/restdocs/http-server/gradle/wrapper/gradle-wrapper.jar differ
diff --git a/samples/standalone/restdocs/http-server/gradle/wrapper/gradle-wrapper.properties b/samples/standalone/restdocs/http-server/gradle/wrapper/gradle-wrapper.properties
new file mode 100644
index 0000000000..fe18faa66a
--- /dev/null
+++ b/samples/standalone/restdocs/http-server/gradle/wrapper/gradle-wrapper.properties
@@ -0,0 +1,6 @@
+#Thu Jul 21 10:16:50 CEST 2016
+distributionBase=GRADLE_USER_HOME
+distributionPath=wrapper/dists
+zipStoreBase=GRADLE_USER_HOME
+zipStorePath=wrapper/dists
+distributionUrl=https\://services.gradle.org/distributions/gradle-2.14.1-bin.zip
diff --git a/samples/standalone/restdocs/http-server/gradlew b/samples/standalone/restdocs/http-server/gradlew
new file mode 100755
index 0000000000..27309d9231
--- /dev/null
+++ b/samples/standalone/restdocs/http-server/gradlew
@@ -0,0 +1,164 @@
+#!/usr/bin/env bash
+
+##############################################################################
+##
+## Gradle start up script for UN*X
+##
+##############################################################################
+
+# Attempt to set APP_HOME
+# Resolve links: $0 may be a link
+PRG="$0"
+# Need this for relative symlinks.
+while [ -h "$PRG" ] ; do
+ ls=`ls -ld "$PRG"`
+ link=`expr "$ls" : '.*-> \(.*\)$'`
+ if expr "$link" : '/.*' > /dev/null; then
+ PRG="$link"
+ else
+ PRG=`dirname "$PRG"`"/$link"
+ fi
+done
+SAVED="`pwd`"
+cd "`dirname \"$PRG\"`/" >/dev/null
+APP_HOME="`pwd -P`"
+cd "$SAVED" >/dev/null
+
+APP_NAME="Gradle"
+APP_BASE_NAME=`basename "$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=""
+
+# Use the maximum available, or set MAX_FD != -1 to use that value.
+MAX_FD="maximum"
+
+warn ( ) {
+ echo "$*"
+}
+
+die ( ) {
+ echo
+ echo "$*"
+ echo
+ exit 1
+}
+
+# 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
+ ;;
+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" = "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
+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
+
+# For Cygwin, switch paths to Windows format before running java
+if $cygwin ; 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
+ # 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\""
+ fi
+ i=$((i+1))
+ 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
+
+# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules
+function splitJvmOpts() {
+ JVM_OPTS=("$@")
+}
+eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS
+JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME"
+
+exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@"
diff --git a/samples/standalone/restdocs/http-server/gradlew.bat b/samples/standalone/restdocs/http-server/gradlew.bat
new file mode 100644
index 0000000000..832fdb6079
--- /dev/null
+++ b/samples/standalone/restdocs/http-server/gradlew.bat
@@ -0,0 +1,90 @@
+@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 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=
+
+@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 init
+
+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 init
+
+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
+
+:init
+@rem Get command-line arguments, handling Windows variants
+
+if not "%OS%" == "Windows_NT" goto win9xME_args
+if "%@eval[2+2]" == "4" goto 4NT_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=%*
+goto execute
+
+:4NT_args
+@rem Get arguments from the 4NT Shell from JP Software
+set CMD_LINE_ARGS=%$
+
+: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 %CMD_LINE_ARGS%
+
+: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/samples/standalone/restdocs/http-server/mvnw b/samples/standalone/restdocs/http-server/mvnw
new file mode 100755
index 0000000000..fc7efd17d0
--- /dev/null
+++ b/samples/standalone/restdocs/http-server/mvnw
@@ -0,0 +1,234 @@
+#!/bin/sh
+# ----------------------------------------------------------------------------
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+# ----------------------------------------------------------------------------
+
+# ----------------------------------------------------------------------------
+# Maven2 Start Up Batch script
+#
+# Required ENV vars:
+# ------------------
+# JAVA_HOME - location of a JDK home dir
+#
+# Optional ENV vars
+# -----------------
+# M2_HOME - location of maven2's installed home dir
+# MAVEN_OPTS - parameters passed to the Java VM when running Maven
+# e.g. to debug Maven itself, use
+# set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000
+# MAVEN_SKIP_RC - flag to disable loading of mavenrc files
+# ----------------------------------------------------------------------------
+
+if [ -z "$MAVEN_SKIP_RC" ] ; then
+
+ if [ -f /etc/mavenrc ] ; then
+ . /etc/mavenrc
+ fi
+
+ if [ -f "$HOME/.mavenrc" ] ; then
+ . "$HOME/.mavenrc"
+ fi
+
+fi
+
+# OS specific support. $var _must_ be set to either true or false.
+cygwin=false;
+darwin=false;
+mingw=false
+case "`uname`" in
+ CYGWIN*) cygwin=true ;;
+ MINGW*) mingw=true;;
+ Darwin*) darwin=true
+ #
+ # Look for the Apple JDKs first to preserve the existing behaviour, and then look
+ # for the new JDKs provided by Oracle.
+ #
+ if [ -z "$JAVA_HOME" ] && [ -L /System/Library/Frameworks/JavaVM.framework/Versions/CurrentJDK ] ; then
+ #
+ # Apple JDKs
+ #
+ export JAVA_HOME=/System/Library/Frameworks/JavaVM.framework/Versions/CurrentJDK/Home
+ fi
+
+ if [ -z "$JAVA_HOME" ] && [ -L /System/Library/Java/JavaVirtualMachines/CurrentJDK ] ; then
+ #
+ # Apple JDKs
+ #
+ export JAVA_HOME=/System/Library/Java/JavaVirtualMachines/CurrentJDK/Contents/Home
+ fi
+
+ if [ -z "$JAVA_HOME" ] && [ -L "/Library/Java/JavaVirtualMachines/CurrentJDK" ] ; then
+ #
+ # Oracle JDKs
+ #
+ export JAVA_HOME=/Library/Java/JavaVirtualMachines/CurrentJDK/Contents/Home
+ fi
+
+ if [ -z "$JAVA_HOME" ] && [ -x "/usr/libexec/java_home" ]; then
+ #
+ # Apple JDKs
+ #
+ export JAVA_HOME=`/usr/libexec/java_home`
+ fi
+ ;;
+esac
+
+if [ -z "$JAVA_HOME" ] ; then
+ if [ -r /etc/gentoo-release ] ; then
+ JAVA_HOME=`java-config --jre-home`
+ fi
+fi
+
+if [ -z "$M2_HOME" ] ; then
+ ## resolve links - $0 may be a link to maven's home
+ PRG="$0"
+
+ # need this for relative symlinks
+ while [ -h "$PRG" ] ; do
+ ls=`ls -ld "$PRG"`
+ link=`expr "$ls" : '.*-> \(.*\)$'`
+ if expr "$link" : '/.*' > /dev/null; then
+ PRG="$link"
+ else
+ PRG="`dirname "$PRG"`/$link"
+ fi
+ done
+
+ saveddir=`pwd`
+
+ M2_HOME=`dirname "$PRG"`/..
+
+ # make it fully qualified
+ M2_HOME=`cd "$M2_HOME" && pwd`
+
+ cd "$saveddir"
+ # echo Using m2 at $M2_HOME
+fi
+
+# For Cygwin, ensure paths are in UNIX format before anything is touched
+if $cygwin ; then
+ [ -n "$M2_HOME" ] &&
+ M2_HOME=`cygpath --unix "$M2_HOME"`
+ [ -n "$JAVA_HOME" ] &&
+ JAVA_HOME=`cygpath --unix "$JAVA_HOME"`
+ [ -n "$CLASSPATH" ] &&
+ CLASSPATH=`cygpath --path --unix "$CLASSPATH"`
+fi
+
+# For Migwn, ensure paths are in UNIX format before anything is touched
+if $mingw ; then
+ [ -n "$M2_HOME" ] &&
+ M2_HOME="`(cd "$M2_HOME"; pwd)`"
+ [ -n "$JAVA_HOME" ] &&
+ JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`"
+ # TODO classpath?
+fi
+
+if [ -z "$JAVA_HOME" ]; then
+ javaExecutable="`which javac`"
+ if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then
+ # readlink(1) is not available as standard on Solaris 10.
+ readLink=`which readlink`
+ if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then
+ if $darwin ; then
+ javaHome="`dirname \"$javaExecutable\"`"
+ javaExecutable="`cd \"$javaHome\" && pwd -P`/javac"
+ else
+ javaExecutable="`readlink -f \"$javaExecutable\"`"
+ fi
+ javaHome="`dirname \"$javaExecutable\"`"
+ javaHome=`expr "$javaHome" : '\(.*\)/bin'`
+ JAVA_HOME="$javaHome"
+ export JAVA_HOME
+ fi
+ fi
+fi
+
+if [ -z "$JAVACMD" ] ; then
+ 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
+ else
+ JAVACMD="`which java`"
+ fi
+fi
+
+if [ ! -x "$JAVACMD" ] ; then
+ echo "Error: JAVA_HOME is not defined correctly." >&2
+ echo " We cannot execute $JAVACMD" >&2
+ exit 1
+fi
+
+if [ -z "$JAVA_HOME" ] ; then
+ echo "Warning: JAVA_HOME environment variable is not set."
+fi
+
+CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher
+
+# For Cygwin, switch paths to Windows format before running java
+if $cygwin; then
+ [ -n "$M2_HOME" ] &&
+ M2_HOME=`cygpath --path --windows "$M2_HOME"`
+ [ -n "$JAVA_HOME" ] &&
+ JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"`
+ [ -n "$CLASSPATH" ] &&
+ CLASSPATH=`cygpath --path --windows "$CLASSPATH"`
+fi
+
+# traverses directory structure from process work directory to filesystem root
+# first directory with .mvn subdirectory is considered project base directory
+find_maven_basedir() {
+ local basedir=$(pwd)
+ local wdir=$(pwd)
+ while [ "$wdir" != '/' ] ; do
+ if [ -d "$wdir"/.mvn ] ; then
+ basedir=$wdir
+ break
+ fi
+ wdir=$(cd "$wdir/.."; pwd)
+ done
+ echo "${basedir}"
+}
+
+# concatenates all lines of a file
+concat_lines() {
+ if [ -f "$1" ]; then
+ echo "$(tr -s '\n' ' ' < "$1")"
+ fi
+}
+
+export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-$(find_maven_basedir)}
+MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS"
+
+# Provide a "standardized" way to retrieve the CLI args that will
+# work with both Windows and non-Windows executions.
+MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $@"
+export MAVEN_CMD_LINE_ARGS
+
+WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain
+
+exec "$JAVACMD" \
+ $MAVEN_OPTS \
+ -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \
+ "-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \
+ ${WRAPPER_LAUNCHER} $MAVEN_CMD_LINE_ARGS
+
diff --git a/samples/standalone/restdocs/http-server/mvnw.cmd b/samples/standalone/restdocs/http-server/mvnw.cmd
new file mode 100644
index 0000000000..001048081d
--- /dev/null
+++ b/samples/standalone/restdocs/http-server/mvnw.cmd
@@ -0,0 +1,145 @@
+@REM ----------------------------------------------------------------------------
+@REM Licensed to the Apache Software Foundation (ASF) under one
+@REM or more contributor license agreements. See the NOTICE file
+@REM distributed with this work for additional information
+@REM regarding copyright ownership. The ASF licenses this file
+@REM to you under the Apache License, Version 2.0 (the
+@REM "License"); you may not use this file except in compliance
+@REM with the License. You may obtain a copy of the License at
+@REM
+@REM http://www.apache.org/licenses/LICENSE-2.0
+@REM
+@REM Unless required by applicable law or agreed to in writing,
+@REM software distributed under the License is distributed on an
+@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+@REM KIND, either express or implied. See the License for the
+@REM specific language governing permissions and limitations
+@REM under the License.
+@REM ----------------------------------------------------------------------------
+
+@REM ----------------------------------------------------------------------------
+@REM Maven2 Start Up Batch script
+@REM
+@REM Required ENV vars:
+@REM JAVA_HOME - location of a JDK home dir
+@REM
+@REM Optional ENV vars
+@REM M2_HOME - location of maven2's installed home dir
+@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands
+@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a key stroke before ending
+@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven
+@REM e.g. to debug Maven itself, use
+@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000
+@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files
+@REM ----------------------------------------------------------------------------
+
+@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on'
+@echo off
+@REM enable echoing my setting MAVEN_BATCH_ECHO to 'on'
+@if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO%
+
+@REM set %HOME% to equivalent of $HOME
+if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%")
+
+@REM Execute a user defined script before this one
+if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre
+@REM check for pre script, once with legacy .bat ending and once with .cmd ending
+if exist "%HOME%\mavenrc_pre.bat" call "%HOME%\mavenrc_pre.bat"
+if exist "%HOME%\mavenrc_pre.cmd" call "%HOME%\mavenrc_pre.cmd"
+:skipRcPre
+
+@setlocal
+
+set ERROR_CODE=0
+
+@REM To isolate internal variables from possible post scripts, we use another setlocal
+@setlocal
+
+@REM ==== START VALIDATION ====
+if not "%JAVA_HOME%" == "" goto OkJHome
+
+echo.
+echo Error: JAVA_HOME not found in your environment. >&2
+echo Please set the JAVA_HOME variable in your environment to match the >&2
+echo location of your Java installation. >&2
+echo.
+goto error
+
+:OkJHome
+if exist "%JAVA_HOME%\bin\java.exe" goto init
+
+echo.
+echo Error: JAVA_HOME is set to an invalid directory. >&2
+echo JAVA_HOME = "%JAVA_HOME%" >&2
+echo Please set the JAVA_HOME variable in your environment to match the >&2
+echo location of your Java installation. >&2
+echo.
+goto error
+
+@REM ==== END VALIDATION ====
+
+:init
+
+set MAVEN_CMD_LINE_ARGS=%MAVEN_CONFIG% %*
+
+@REM Find the project base dir, i.e. the directory that contains the folder ".mvn".
+@REM Fallback to current working directory if not found.
+
+set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR%
+IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir
+
+set EXEC_DIR=%CD%
+set WDIR=%EXEC_DIR%
+:findBaseDir
+IF EXIST "%WDIR%"\.mvn goto baseDirFound
+cd ..
+IF "%WDIR%"=="%CD%" goto baseDirNotFound
+set WDIR=%CD%
+goto findBaseDir
+
+:baseDirFound
+set MAVEN_PROJECTBASEDIR=%WDIR%
+cd "%EXEC_DIR%"
+goto endDetectBaseDir
+
+:baseDirNotFound
+set MAVEN_PROJECTBASEDIR=%EXEC_DIR%
+cd "%EXEC_DIR%"
+
+:endDetectBaseDir
+
+IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig
+
+@setlocal EnableExtensions EnableDelayedExpansion
+for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a
+@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS%
+
+:endReadAdditionalConfig
+
+SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe"
+
+set WRAPPER_JAR=""%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar""
+set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain
+
+%MAVEN_JAVA_EXE% %JVM_CONFIG_MAVEN_PROPS% %MAVEN_OPTS% %MAVEN_DEBUG_OPTS% -classpath %WRAPPER_JAR% "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" %WRAPPER_LAUNCHER% %MAVEN_CMD_LINE_ARGS%
+if ERRORLEVEL 1 goto error
+goto end
+
+:error
+set ERROR_CODE=1
+
+:end
+@endlocal & set ERROR_CODE=%ERROR_CODE%
+
+if not "%MAVEN_SKIP_RC%" == "" goto skipRcPost
+@REM check for post script, once with legacy .bat ending and once with .cmd ending
+if exist "%HOME%\mavenrc_post.bat" call "%HOME%\mavenrc_post.bat"
+if exist "%HOME%\mavenrc_post.cmd" call "%HOME%\mavenrc_post.cmd"
+:skipRcPost
+
+@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on'
+if "%MAVEN_BATCH_PAUSE%" == "on" pause
+
+if "%MAVEN_TERMINATE_CMD%" == "on" exit %ERROR_CODE%
+
+exit /B %ERROR_CODE%
diff --git a/samples/standalone/restdocs/http-server/pom.xml b/samples/standalone/restdocs/http-server/pom.xml
new file mode 100644
index 0000000000..82310d4839
--- /dev/null
+++ b/samples/standalone/restdocs/http-server/pom.xml
@@ -0,0 +1,167 @@
+
+
+ 4.0.0
+
+ com.example
+ http-server-restdocs
+ 0.0.1-SNAPSHOT
+
+ Spring Cloud Contract Verifier Http Server Sample
+ Spring Cloud Contract Verifier Http Server Sample
+
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ 1.4.0.BUILD-SNAPSHOT
+
+
+
+
+ UTF-8
+ 1.8
+ 1.0.0.BUILD-SNAPSHOT
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+ org.springframework.boot
+ spring-boot-starter-actuator
+
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+
+ org.springframework.restdocs
+ spring-restdocs-mockmvc
+ true
+
+
+ org.springframework.cloud
+ spring-cloud-contract-wiremock
+ test
+
+
+
+
+
+
+ org.springframework.cloud
+ spring-cloud-contract-dependencies
+ ${spring-cloud-contract.version}
+ pom
+ import
+
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+
+ maven-deploy-plugin
+
+ true
+
+
+
+ org.apache.maven.plugins
+ maven-assembly-plugin
+
+
+ stub
+ prepare-package
+
+ single
+
+ false
+
+ true
+ ${basedir}/src/assembly/stub.xml
+
+
+
+
+
+
+
+
+
+ spring
+
+ true
+
+
+
+ spring-snapshots
+ Spring Snapshots
+ http://repo.spring.io/libs-snapshot-local
+
+ true
+
+
+
+ spring-milestones
+ Spring Milestones
+ http://repo.spring.io/libs-milestone-local
+
+ false
+
+
+
+ spring-releases
+ Spring Releases
+ http://repo.spring.io/release
+
+ false
+
+
+
+
+
+ spring-snapshots
+ Spring Snapshots
+ http://repo.spring.io/libs-snapshot-local
+
+ true
+
+
+
+ spring-milestones
+ Spring Milestones
+ http://repo.spring.io/libs-milestone-local
+
+ false
+
+
+
+ spring-plugin-snapshots
+ Spring Snapshots
+ http://repo.spring.io/plugins-snapshot-local
+
+ true
+
+
+
+ spring-plugin-milestones
+ Spring Milestones
+ http://repo.spring.io/plugins-milestone-local
+
+ false
+
+
+
+
+
+
diff --git a/samples/standalone/restdocs/http-server/settings.gradle b/samples/standalone/restdocs/http-server/settings.gradle
new file mode 100644
index 0000000000..b4f382e60c
--- /dev/null
+++ b/samples/standalone/restdocs/http-server/settings.gradle
@@ -0,0 +1 @@
+rootProject.name = 'http-server'
diff --git a/samples/standalone/restdocs/http-server/src/assembly/stub.xml b/samples/standalone/restdocs/http-server/src/assembly/stub.xml
new file mode 100644
index 0000000000..235d026263
--- /dev/null
+++ b/samples/standalone/restdocs/http-server/src/assembly/stub.xml
@@ -0,0 +1,33 @@
+
+ stubs
+
+ jar
+
+ false
+
+
+ src/main/java
+ /
+
+ **/model/Fraud*.*
+
+
+
+ ${project.build.directory}/classes
+ /
+
+ **/model/Fraud*.*
+
+
+
+ ${project.build.directory}/snippets/stubs
+ META-INF/wiremock/mappings/${project.artifactId}
+
+ **/*
+
+
+
+
\ No newline at end of file
diff --git a/samples/standalone/restdocs/http-server/src/main/java/com/example/fraud/Application.java b/samples/standalone/restdocs/http-server/src/main/java/com/example/fraud/Application.java
new file mode 100644
index 0000000000..9117009b09
--- /dev/null
+++ b/samples/standalone/restdocs/http-server/src/main/java/com/example/fraud/Application.java
@@ -0,0 +1,17 @@
+package com.example.fraud;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.context.annotation.Configuration;
+
+@Configuration
+@EnableAutoConfiguration
+@ComponentScan
+public class Application {
+
+ public static void main(String[] args) {
+ SpringApplication.run(Application.class, args);
+ }
+
+}
diff --git a/samples/standalone/restdocs/http-server/src/main/java/com/example/fraud/FraudDetectionController.java b/samples/standalone/restdocs/http-server/src/main/java/com/example/fraud/FraudDetectionController.java
new file mode 100644
index 0000000000..82ae6bee85
--- /dev/null
+++ b/samples/standalone/restdocs/http-server/src/main/java/com/example/fraud/FraudDetectionController.java
@@ -0,0 +1,45 @@
+package com.example.fraud;
+
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import com.example.fraud.model.FraudCheck;
+import com.example.fraud.model.FraudCheckResult;
+import com.example.fraud.model.FraudCheckStatus;
+
+import java.math.BigDecimal;
+
+import static org.springframework.web.bind.annotation.RequestMethod.PUT;
+
+@RestController
+public class FraudDetectionController {
+
+ private static final String FRAUD_SERVICE_JSON_VERSION_1 = "application/vnd.fraud.v1+json";
+ private static final String NO_REASON = null;
+ private static final String AMOUNT_TOO_HIGH = "Amount too high";
+ private static final BigDecimal MAX_AMOUNT = new BigDecimal("5000");
+
+ // tag::server_api[]
+ @RequestMapping(
+ value = "/fraudcheck",
+ method = PUT,
+ consumes = FRAUD_SERVICE_JSON_VERSION_1,
+ produces = FRAUD_SERVICE_JSON_VERSION_1)
+ public FraudCheckResult fraudCheck(@RequestBody FraudCheck fraudCheck) {
+ // end::server_api[]
+ // tag::new_impl[]
+ if (amountGreaterThanThreshold(fraudCheck)) {
+ return new FraudCheckResult(FraudCheckStatus.FRAUD, AMOUNT_TOO_HIGH);
+ }
+ // end::new_impl[]
+ // tag::initial_impl[]
+ return new FraudCheckResult(FraudCheckStatus.OK, NO_REASON);
+ // end::initial_impl[]
+ }
+
+ private boolean amountGreaterThanThreshold(FraudCheck fraudCheck) {
+ return MAX_AMOUNT.compareTo(fraudCheck.getLoanAmount()) < 0;
+ }
+
+}
diff --git a/samples/standalone/restdocs/http-server/src/main/java/com/example/fraud/model/FraudCheck.java b/samples/standalone/restdocs/http-server/src/main/java/com/example/fraud/model/FraudCheck.java
new file mode 100644
index 0000000000..b0210573e2
--- /dev/null
+++ b/samples/standalone/restdocs/http-server/src/main/java/com/example/fraud/model/FraudCheck.java
@@ -0,0 +1,29 @@
+package com.example.fraud.model;
+
+import java.math.BigDecimal;
+
+public class FraudCheck {
+
+ private String clientId;
+
+ private BigDecimal loanAmount;
+
+ public FraudCheck() {
+ }
+
+ public String getClientId() {
+ return clientId;
+ }
+
+ public void setClientId(String clientId) {
+ this.clientId = clientId;
+ }
+
+ public BigDecimal getLoanAmount() {
+ return loanAmount;
+ }
+
+ public void setLoanAmount(BigDecimal loanAmount) {
+ this.loanAmount = loanAmount;
+ }
+}
diff --git a/samples/standalone/restdocs/http-server/src/main/java/com/example/fraud/model/FraudCheckResult.java b/samples/standalone/restdocs/http-server/src/main/java/com/example/fraud/model/FraudCheckResult.java
new file mode 100644
index 0000000000..60b340276a
--- /dev/null
+++ b/samples/standalone/restdocs/http-server/src/main/java/com/example/fraud/model/FraudCheckResult.java
@@ -0,0 +1,32 @@
+package com.example.fraud.model;
+
+public class FraudCheckResult {
+
+ private FraudCheckStatus fraudCheckStatus;
+
+ private String rejectionReason;
+
+ public FraudCheckResult() {
+ }
+
+ public FraudCheckResult(FraudCheckStatus fraudCheckStatus, String rejectionReason) {
+ this.fraudCheckStatus = fraudCheckStatus;
+ this.rejectionReason = rejectionReason;
+ }
+
+ public FraudCheckStatus getFraudCheckStatus() {
+ return fraudCheckStatus;
+ }
+
+ public void setFraudCheckStatus(FraudCheckStatus fraudCheckStatus) {
+ this.fraudCheckStatus = fraudCheckStatus;
+ }
+
+ public String getRejectionReason() {
+ return rejectionReason;
+ }
+
+ public void setRejectionReason(String rejectionReason) {
+ this.rejectionReason = rejectionReason;
+ }
+}
diff --git a/samples/standalone/restdocs/http-server/src/main/java/com/example/fraud/model/FraudCheckStatus.java b/samples/standalone/restdocs/http-server/src/main/java/com/example/fraud/model/FraudCheckStatus.java
new file mode 100644
index 0000000000..5a6adcf274
--- /dev/null
+++ b/samples/standalone/restdocs/http-server/src/main/java/com/example/fraud/model/FraudCheckStatus.java
@@ -0,0 +1,5 @@
+package com.example.fraud.model;
+
+public enum FraudCheckStatus {
+ OK, FRAUD
+}
diff --git a/samples/standalone/restdocs/http-server/src/main/resources/application.yml b/samples/standalone/restdocs/http-server/src/main/resources/application.yml
new file mode 100644
index 0000000000..a30a91f034
--- /dev/null
+++ b/samples/standalone/restdocs/http-server/src/main/resources/application.yml
@@ -0,0 +1 @@
+server.port=8085
\ No newline at end of file
diff --git a/samples/standalone/restdocs/http-server/src/test/java/com/example/fraud/StubGeneratorTests.java b/samples/standalone/restdocs/http-server/src/test/java/com/example/fraud/StubGeneratorTests.java
new file mode 100644
index 0000000000..b295520f94
--- /dev/null
+++ b/samples/standalone/restdocs/http-server/src/test/java/com/example/fraud/StubGeneratorTests.java
@@ -0,0 +1,75 @@
+package com.example.fraud;
+
+import static org.springframework.restdocs.mockmvc.MockMvcRestDocumentation.document;
+
+import java.math.BigDecimal;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.autoconfigure.json.AutoConfigureJsonTesters;
+import org.springframework.boot.test.autoconfigure.restdocs.AutoConfigureRestDocs;
+import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.boot.test.json.JacksonTester;
+import org.springframework.cloud.contract.wiremock.WireMockSnippet;
+import org.springframework.http.MediaType;
+import org.springframework.test.annotation.DirtiesContext;
+import org.springframework.test.context.junit4.SpringRunner;
+import org.springframework.test.web.servlet.MockMvc;
+import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
+import org.springframework.test.web.servlet.result.MockMvcResultMatchers;
+
+import com.example.fraud.model.FraudCheck;
+
+@RunWith(SpringRunner.class)
+@SpringBootTest(classes = Application.class)
+@AutoConfigureRestDocs(outputDir = "target/snippets")
+@AutoConfigureMockMvc
+@AutoConfigureJsonTesters
+@DirtiesContext
+public class StubGeneratorTests {
+
+ @Autowired
+ private MockMvc mockMvc;
+
+ @Autowired
+ private WireMockSnippet snippet;
+
+ private JacksonTester json;
+
+ @Test
+ public void shouldMarkClientAsFraud() throws Exception {
+ FraudCheck fraudCheck = new FraudCheck();
+ fraudCheck.setClientId("1234567890");
+ fraudCheck.setLoanAmount(BigDecimal.valueOf(99999.0));
+ mockMvc.perform(MockMvcRequestBuilders.put("/fraudcheck")
+ .contentType(MediaType.valueOf("application/vnd.fraud.v1+json"))
+ .content(json.write(fraudCheck).getJson()))
+ .andExpect(MockMvcResultMatchers.jsonPath("$.fraudCheckStatus")
+ .value("FRAUD"))
+ .andExpect(MockMvcResultMatchers.jsonPath("$.rejectionReason")
+ .value("Amount too high"))
+ .andDo(snippet.content().jsonPath("$.clientId").jsonPath("$[?(@.loanAmount > 1000)]")
+ .contentType(MediaType.valueOf("application/vnd.fraud.v1+json")))
+ .andDo(document("markClientAsFraud"));
+ }
+
+ @Test
+ public void shouldMarkClientAsNotFraud() throws Exception {
+ FraudCheck fraudCheck = new FraudCheck();
+ fraudCheck.setClientId("1234567890");
+ fraudCheck.setLoanAmount(BigDecimal.valueOf(1));
+ mockMvc.perform(MockMvcRequestBuilders.put("/fraudcheck")
+ .contentType(MediaType.valueOf("application/vnd.fraud.v1+json"))
+ .content(json.write(fraudCheck).getJson()))
+ .andExpect(MockMvcResultMatchers.jsonPath("$.fraudCheckStatus")
+ .value("OK"))
+ .andExpect(MockMvcResultMatchers.jsonPath("$.rejectionReason")
+ .doesNotExist())
+ .andDo(snippet.content().jsonPath("$.clientId").jsonPath("$[?(@.loanAmount <= 1000)]")
+ .contentType(MediaType.valueOf("application/vnd.fraud.v1+json")))
+ .andDo(document("markClientAsNotFraud"));
+ }
+
+}
\ No newline at end of file
diff --git a/samples/standalone/restdocs/http-server/src/test/resources/contracts/shouldMarkClientAsFraud.groovy b/samples/standalone/restdocs/http-server/src/test/resources/contracts/shouldMarkClientAsFraud.groovy
new file mode 100644
index 0000000000..c42d691b82
--- /dev/null
+++ b/samples/standalone/restdocs/http-server/src/test/resources/contracts/shouldMarkClientAsFraud.groovy
@@ -0,0 +1,31 @@
+package contracts
+
+org.springframework.cloud.contract.spec.Contract.make {
+ request {
+ method 'PUT'
+ url '/fraudcheck'
+ body("""
+ {
+ "clientId":"${value(consumer(regex('[0-9]{10}')))}",
+ "loanAmount":99999}
+ """
+ )
+ headers {
+ header('Content-Type', 'application/vnd.fraud.v1+json')
+ }
+ }
+ response {
+ status 200
+ body( """{
+ "fraudCheckStatus": "FRAUD",
+ "rejectionReason": "Amount too high"
+ }""")
+ headers {
+ header('Content-Type': value(
+ producer(regex('application/vnd.fraud.v1.json.*')),
+ consumer('application/vnd.fraud.v1+json'))
+ )
+ }
+ }
+
+}
diff --git a/samples/standalone/restdocs/http-server/src/test/resources/contracts/shouldMarkClientAsNotFraud.groovy b/samples/standalone/restdocs/http-server/src/test/resources/contracts/shouldMarkClientAsNotFraud.groovy
new file mode 100644
index 0000000000..2b3bea7222
--- /dev/null
+++ b/samples/standalone/restdocs/http-server/src/test/resources/contracts/shouldMarkClientAsNotFraud.groovy
@@ -0,0 +1,33 @@
+package contracts
+
+org.springframework.cloud.contract.spec.Contract.make {
+ request {
+ method 'PUT'
+ url '/fraudcheck'
+ body("""
+ {
+ "clientId":"${value(consumer(regex('[0-9]{10}')), producer('1234567890'))}",
+ "loanAmount":123.123
+ }
+ """
+ )
+ headers {
+ header('Content-Type', 'application/vnd.fraud.v1+json')
+ }
+
+ }
+ response {
+ status 200
+ body(
+ fraudCheckStatus: "OK",
+ rejectionReason: $(consumer(null), producer(execute('assertThatRejectionReasonIsNull($it)')))
+ )
+ headers {
+ header('Content-Type': value(
+ producer(regex('application/vnd.fraud.v1.json.*')),
+ consumer('application/vnd.fraud.v1+json'))
+ )
+ }
+ }
+
+}
diff --git a/samples/standalone/restdocs/pom.xml b/samples/standalone/restdocs/pom.xml
new file mode 100644
index 0000000000..ba2ef14b3b
--- /dev/null
+++ b/samples/standalone/restdocs/pom.xml
@@ -0,0 +1,51 @@
+
+
+ 4.0.0
+
+
+ org.springframework.cloud
+ spring-cloud-contract-samples-standalone
+ 1.0.0.BUILD-SNAPSHOT
+ ..
+
+
+ spring-cloud-contract-samples-restdocs
+ pom
+
+ Spring Cloud Contract Standalone Test Samples
+ Spring Cloud Contract Standalone Test Samples used for end to end tests
+
+
+ http-server
+ http-client
+
+
+
+
+
+ maven-deploy-plugin
+
+ true
+
+
+
+
+
+
+ org.codehaus.gmavenplus
+ gmavenplus-plugin
+ 1.5
+
+
+
+ testCompile
+
+
+
+
+
+
+
+
+
diff --git a/spring-cloud-contract-wiremock/pom.xml b/spring-cloud-contract-wiremock/pom.xml
index 49415ce94f..a1f9205a69 100644
--- a/spring-cloud-contract-wiremock/pom.xml
+++ b/spring-cloud-contract-wiremock/pom.xml
@@ -44,10 +44,20 @@
org.springframework
spring-web
+
+ org.springframework.restdocs
+ spring-restdocs-mockmvc
+ true
+
org.springframework.boot
spring-boot-starter-test
true
+
+ org.assertj
+ assertj-core
+ compile
+
diff --git a/spring-cloud-contract-wiremock/src/main/java/org/springframework/cloud/contract/wiremock/ContractRequestHandler.java b/spring-cloud-contract-wiremock/src/main/java/org/springframework/cloud/contract/wiremock/ContractRequestHandler.java
new file mode 100644
index 0000000000..b3562adcbb
--- /dev/null
+++ b/spring-cloud-contract-wiremock/src/main/java/org/springframework/cloud/contract/wiremock/ContractRequestHandler.java
@@ -0,0 +1,140 @@
+/*
+ * Copyright 2012-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 org.springframework.cloud.contract.wiremock;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+import java.nio.charset.Charset;
+import java.util.LinkedHashMap;
+import java.util.Map;
+
+import org.springframework.http.MediaType;
+import org.springframework.mock.web.MockHttpServletRequest;
+import org.springframework.test.web.servlet.MvcResult;
+import org.springframework.test.web.servlet.ResultHandler;
+import org.springframework.util.ObjectUtils;
+import org.springframework.util.StreamUtils;
+import org.springframework.util.StringUtils;
+
+import com.jayway.jsonpath.JsonPath;
+
+public class ContractRequestHandler implements ResultHandler {
+
+ private Map jsonPaths = new LinkedHashMap<>();
+ private MediaType contentType;
+ private WireMockSnippet snippet;
+
+ public ContractRequestHandler(WireMockSnippet snippet) {
+ this.snippet = snippet;
+ }
+
+ @Override
+ public void handle(MvcResult result) throws Exception {
+ MockHttpServletRequest request = result.getRequest();
+ String actual = StreamUtils.copyToString(request.getInputStream(),
+ Charset.forName("UTF-8"));
+ for (JsonPath jsonPath : jsonPaths.values()) {
+ new JsonPathValue(jsonPath, actual).assertHasValue(Object.class, "an object");
+ }
+ snippet.setJsonPaths(jsonPaths.keySet());
+ if (contentType != null) {
+ snippet.setContentType(contentType);
+ String resultType = request.getContentType();
+ assertThat(resultType).isNotNull().as("no content type");
+ assertThat(contentType.includes(MediaType.valueOf(resultType))).isTrue()
+ .as("content type did not match");
+ }
+ }
+
+ public ContractRequestHandler jsonPath(String expression, Object... args) {
+ compile(expression, args);
+ return this;
+ }
+
+ public ContractRequestHandler contentType(MediaType contentType) {
+ this.contentType = contentType;
+ return this;
+ }
+
+ private void compile(String expression, Object... args) {
+ org.springframework.util.Assert.hasText(
+ (expression == null ? null : expression.toString()),
+ "expression must not be null or empty");
+ expression = String.format(expression.toString(), args);
+ jsonPaths.put(expression, JsonPath.compile(expression));
+ }
+
+}
+
+class JsonPathValue {
+
+ private final JsonPath jsonPath;
+ private final String expression;
+ private final CharSequence actual;
+
+ JsonPathValue(JsonPath jsonPath, CharSequence actual) {
+ this.jsonPath = jsonPath;
+ this.actual = actual;
+ this.expression = jsonPath.getPath();
+ }
+
+ public void assertHasValue(Class> type, String expectedDescription) {
+ Object value = getValue(true);
+ if (value == null || isIndefiniteAndEmpty()) {
+ throw new AssertionError(getNoValueMessage());
+ }
+ if (type != null && !type.isInstance(value)) {
+ throw new AssertionError(getExpectedValueMessage(expectedDescription));
+ }
+ }
+
+ private boolean isIndefiniteAndEmpty() {
+ return !isDefinite() && isEmpty();
+ }
+
+ private boolean isDefinite() {
+ return this.jsonPath.isDefinite();
+ }
+
+ private boolean isEmpty() {
+ return ObjectUtils.isEmpty(getValue(false));
+ }
+
+ public Object getValue(boolean required) {
+ try {
+ CharSequence json = this.actual;
+ return this.jsonPath.read(json == null ? null : json.toString());
+ }
+ catch (Exception ex) {
+ if (!required) {
+ return null;
+ }
+ throw new AssertionError(getNoValueMessage() + ". " + ex.getMessage());
+ }
+ }
+
+ private String getNoValueMessage() {
+ return "No value at JSON path \"" + this.expression + "\"";
+ }
+
+ private String getExpectedValueMessage(String expectedDescription) {
+ return String.format("Expected %s at JSON path \"%s\" but found: %s",
+ expectedDescription, this.expression,
+ ObjectUtils.nullSafeToString(StringUtils.quoteIfString(getValue(false))));
+ }
+
+}
diff --git a/spring-cloud-contract-wiremock/src/main/java/org/springframework/cloud/contract/wiremock/WireMockRestDocsConfiguration.java b/spring-cloud-contract-wiremock/src/main/java/org/springframework/cloud/contract/wiremock/WireMockRestDocsConfiguration.java
new file mode 100644
index 0000000000..6fe2838c30
--- /dev/null
+++ b/spring-cloud-contract-wiremock/src/main/java/org/springframework/cloud/contract/wiremock/WireMockRestDocsConfiguration.java
@@ -0,0 +1,42 @@
+/*
+ * Copyright 2012-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 org.springframework.cloud.contract.wiremock;
+
+import org.springframework.boot.test.autoconfigure.restdocs.RestDocsMockMvcConfigurationCustomizer;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.restdocs.mockmvc.MockMvcRestDocumentationConfigurer;
+
+/**
+ * @author Dave Syer
+ *
+ */
+@Configuration
+public class WireMockRestDocsConfiguration
+ implements RestDocsMockMvcConfigurationCustomizer {
+
+ @Override
+ public void customize(MockMvcRestDocumentationConfigurer configurer) {
+ configurer.snippets().withAdditionalDefaults(wireMockSnippet());
+ }
+
+ @Bean
+ public WireMockSnippet wireMockSnippet() {
+ return new WireMockSnippet();
+ }
+
+}
diff --git a/spring-cloud-contract-wiremock/src/main/java/org/springframework/cloud/contract/wiremock/WireMockSnippet.java b/spring-cloud-contract-wiremock/src/main/java/org/springframework/cloud/contract/wiremock/WireMockSnippet.java
new file mode 100644
index 0000000000..d3131624a4
--- /dev/null
+++ b/spring-cloud-contract-wiremock/src/main/java/org/springframework/cloud/contract/wiremock/WireMockSnippet.java
@@ -0,0 +1,164 @@
+/*
+ * Copyright 2012-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 org.springframework.cloud.contract.wiremock;
+
+import static com.github.tomakehurst.wiremock.client.WireMock.aResponse;
+import static com.github.tomakehurst.wiremock.client.WireMock.delete;
+import static com.github.tomakehurst.wiremock.client.WireMock.equalTo;
+import static com.github.tomakehurst.wiremock.client.WireMock.get;
+import static com.github.tomakehurst.wiremock.client.WireMock.matching;
+import static com.github.tomakehurst.wiremock.client.WireMock.matchingJsonPath;
+import static com.github.tomakehurst.wiremock.client.WireMock.post;
+import static com.github.tomakehurst.wiremock.client.WireMock.put;
+import static com.github.tomakehurst.wiremock.client.WireMock.urlEqualTo;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.OutputStreamWriter;
+import java.io.Writer;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.LinkedHashSet;
+import java.util.Set;
+import java.util.regex.Pattern;
+
+import org.springframework.http.MediaType;
+import org.springframework.restdocs.RestDocumentationContext;
+import org.springframework.restdocs.operation.Operation;
+import org.springframework.restdocs.snippet.Snippet;
+
+import com.github.tomakehurst.wiremock.client.RemoteMappingBuilder;
+import com.github.tomakehurst.wiremock.client.ResponseDefinitionBuilder;
+import com.github.tomakehurst.wiremock.common.Json;
+import com.github.tomakehurst.wiremock.http.HttpHeader;
+import com.github.tomakehurst.wiremock.http.HttpHeaders;
+import com.github.tomakehurst.wiremock.matching.UrlPattern;
+
+public class WireMockSnippet implements Snippet {
+
+ private String snippetName = "stubs";
+
+ private Set headerBlackList = new HashSet<>(
+ Arrays.asList("host", "content-length"));
+
+ private Set jsonPaths = new LinkedHashSet<>();
+
+ private MediaType contentType;
+
+ @Override
+ public void document(Operation operation) throws IOException {
+ String json = Json
+ .write(request(operation).willReturn(response(operation)).build());
+ RestDocumentationContext context = (RestDocumentationContext) operation
+ .getAttributes().get(RestDocumentationContext.class.getName());
+ File output = new File(context.getOutputDirectory(),
+ this.snippetName + "/" + operation.getName() + ".json");
+ output.getParentFile().mkdirs();
+ try (Writer writer = new OutputStreamWriter(new FileOutputStream(output))) {
+ writer.append(json);
+ }
+ }
+
+ private ResponseDefinitionBuilder response(Operation operation) {
+ return aResponse().withHeaders(responseHeaders(operation))
+ .withBody(operation.getResponse().getContentAsString());
+ }
+
+ private RemoteMappingBuilder, ?> request(Operation operation) {
+ return requestHeaders(requestBuilder(operation), operation);
+ }
+
+ private RemoteMappingBuilder, ?> requestHeaders(RemoteMappingBuilder, ?> request,
+ Operation operation) {
+ org.springframework.http.HttpHeaders headers = operation.getRequest()
+ .getHeaders();
+ // TODO: whitelist headers
+ for (String name : headers.keySet()) {
+ if (!headerBlackList.contains(name.toLowerCase())) {
+ if ("content-type".equalsIgnoreCase(name) && this.contentType != null) {
+ continue;
+ }
+ request = request.withHeader(name, equalTo(headers.getFirst(name)));
+ }
+ }
+ if (this.contentType != null) {
+ request = request.withHeader("Content-Type",
+ matching(Pattern.quote(this.contentType.toString()) + ".*"));
+ }
+ return request;
+ }
+
+ private RemoteMappingBuilder, ?> requestBuilder(Operation operation) {
+ switch (operation.getRequest().getMethod()) {
+ case DELETE:
+ return delete(requestPattern(operation));
+ case POST:
+ return bodyPattern(post(requestPattern(operation)),
+ operation.getRequest().getContentAsString());
+ case PUT:
+ return bodyPattern(put(requestPattern(operation)),
+ operation.getRequest().getContentAsString());
+ default:
+ return get(requestPattern(operation));
+ }
+ }
+
+ private RemoteMappingBuilder, ?> bodyPattern(RemoteMappingBuilder, ?> builder,
+ String content) {
+ if (jsonPaths != null) {
+ for (String jsonPath : jsonPaths) {
+ builder.withRequestBody(matchingJsonPath(jsonPath));
+ }
+ }
+ else {
+ builder.withRequestBody(equalTo(content));
+ }
+ return builder;
+ }
+
+ private UrlPattern requestPattern(Operation operation) {
+ return urlEqualTo(operation.getRequest().getUri().getPath());
+ }
+
+ private HttpHeaders responseHeaders(Operation operation) {
+ org.springframework.http.HttpHeaders headers = operation.getResponse()
+ .getHeaders();
+ HttpHeaders result = new HttpHeaders();
+ for (String name : headers.keySet()) {
+ // TODO: whitelist the headers
+ if (!headerBlackList.contains(name.toLowerCase())) {
+ result = result.plus(new HttpHeader(name, headers.get(name)));
+ }
+ }
+ return result;
+ }
+
+ public ContractRequestHandler content() {
+ return new ContractRequestHandler(this);
+ }
+
+ public void setJsonPaths(Collection jsonPaths) {
+ this.jsonPaths = new LinkedHashSet<>(jsonPaths);
+ }
+
+ public void setContentType(MediaType contentType) {
+ this.contentType = contentType;
+ }
+
+}
\ No newline at end of file
diff --git a/spring-cloud-contract-wiremock/src/main/resources/META-INF/spring.factories b/spring-cloud-contract-wiremock/src/main/resources/META-INF/spring.factories
index fcabcba368..331ad00862 100644
--- a/spring-cloud-contract-wiremock/src/main/resources/META-INF/spring.factories
+++ b/spring-cloud-contract-wiremock/src/main/resources/META-INF/spring.factories
@@ -1,3 +1,7 @@
# Application Listeners
org.springframework.context.ApplicationListener=\
-org.springframework.cloud.contract.wiremock.WireMockApplicationListener
\ No newline at end of file
+org.springframework.cloud.contract.wiremock.WireMockApplicationListener
+
+# RestDocs Auto Configuration
+org.springframework.boot.test.autoconfigure.restdocs.AutoConfigureRestDocs=\
+org.springframework.cloud.contract.wiremock.WireMockRestDocsConfiguration
\ No newline at end of file
diff --git a/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/WiremockServerRestDocsApplicationTests.java b/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/WiremockServerRestDocsApplicationTests.java
new file mode 100644
index 0000000000..e8f4059d27
--- /dev/null
+++ b/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/WiremockServerRestDocsApplicationTests.java
@@ -0,0 +1,51 @@
+package org.springframework.cloud.contract.wiremock;
+
+import static org.springframework.restdocs.mockmvc.MockMvcRestDocumentation.document;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.autoconfigure.restdocs.AutoConfigureRestDocs;
+import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.cloud.contract.wiremock.WiremockServerRestDocsApplicationTests.TestConfiguration;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.test.annotation.DirtiesContext;
+import org.springframework.test.context.junit4.SpringRunner;
+import org.springframework.test.web.servlet.MockMvc;
+import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
+import org.springframework.test.web.servlet.result.MockMvcResultMatchers;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.bind.annotation.RestController;
+
+@RunWith(SpringRunner.class)
+@SpringBootTest(classes = TestConfiguration.class)
+@AutoConfigureRestDocs(outputDir = "target/snippets")
+@AutoConfigureMockMvc
+@DirtiesContext
+public class WiremockServerRestDocsApplicationTests {
+
+ @Autowired
+ private MockMvc mockMvc;
+
+ @Test
+ public void contextLoads() throws Exception {
+ mockMvc.perform(MockMvcRequestBuilders.get("/resource"))
+ .andExpect(MockMvcResultMatchers.content().string("Hello World"))
+ .andDo(document("resource"));
+ }
+
+ @Configuration
+ @RestController
+ protected static class TestConfiguration {
+
+ @ResponseBody
+ @RequestMapping("/resource")
+ public String resource() {
+ return "Hello World";
+ }
+
+ }
+
+}
diff --git a/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/WiremockTestsApplication.java b/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/WiremockTestsApplication.java
index a5d0a82167..3ae74cdd87 100644
--- a/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/WiremockTestsApplication.java
+++ b/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/WiremockTestsApplication.java
@@ -39,6 +39,7 @@ class Controller {
public String home() {
return this.service.go();
}
+
}
@Component