Make api with jaxb
Change-Id: Ic0ac5ce212fac17583699868709b67a701231755
This commit is contained in:
parent
5545b67ebd
commit
82434f46a3
38 changed files with 583 additions and 422 deletions
|
@ -25,5 +25,9 @@
|
|||
<groupId>org.apache.commons</groupId>
|
||||
<artifactId>commons-lang3</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>pl.touk.mockserver</groupId>
|
||||
<artifactId>mockserver-api</artifactId>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
</project>
|
||||
|
|
|
@ -1,32 +0,0 @@
|
|||
package pl.touk.mockserver.client
|
||||
|
||||
import groovy.transform.CompileStatic
|
||||
import groovy.transform.TypeChecked
|
||||
import org.apache.commons.lang3.StringEscapeUtils
|
||||
|
||||
@CompileStatic
|
||||
@TypeChecked
|
||||
class AddMockRequestData {
|
||||
String name
|
||||
String path
|
||||
Integer port
|
||||
String predicate
|
||||
String response
|
||||
Boolean soap
|
||||
Integer statusCode
|
||||
Method method
|
||||
String responseHeaders
|
||||
|
||||
void setPredicate(String predicate) {
|
||||
this.predicate = StringEscapeUtils.escapeXml11(predicate)
|
||||
}
|
||||
|
||||
void setResponse(String response) {
|
||||
this.response = StringEscapeUtils.escapeXml11(response)
|
||||
}
|
||||
|
||||
void setResponseHeaders(String responseHeaders) {
|
||||
this.responseHeaders = StringEscapeUtils.escapeXml11(responseHeaders)
|
||||
}
|
||||
}
|
||||
|
|
@ -1,12 +0,0 @@
|
|||
package pl.touk.mockserver.client
|
||||
|
||||
enum Method {
|
||||
POST,
|
||||
GET,
|
||||
DELETE,
|
||||
PUT,
|
||||
TRACE,
|
||||
HEAD,
|
||||
OPTIONS,
|
||||
PATCH
|
||||
}
|
|
@ -1,18 +0,0 @@
|
|||
package pl.touk.mockserver.client
|
||||
|
||||
import groovy.transform.CompileStatic
|
||||
import groovy.transform.EqualsAndHashCode
|
||||
import groovy.transform.TypeChecked
|
||||
|
||||
@EqualsAndHashCode
|
||||
@CompileStatic
|
||||
@TypeChecked
|
||||
class MockEvent {
|
||||
final MockRequest request
|
||||
final MockResponse response
|
||||
|
||||
MockEvent(MockRequest request, MockResponse response) {
|
||||
this.request = request
|
||||
this.response = response
|
||||
}
|
||||
}
|
|
@ -1,22 +0,0 @@
|
|||
package pl.touk.mockserver.client
|
||||
|
||||
import groovy.transform.CompileStatic
|
||||
import groovy.transform.EqualsAndHashCode
|
||||
import groovy.transform.TypeChecked
|
||||
|
||||
@CompileStatic
|
||||
@TypeChecked
|
||||
@EqualsAndHashCode
|
||||
class MockRequest {
|
||||
final String text
|
||||
final Map<String, String> headers
|
||||
final Map<String, String> query
|
||||
final List<String> path
|
||||
|
||||
MockRequest(String text, Map<String, String> headers, Map<String, String> query, List<String> path) {
|
||||
this.text = text
|
||||
this.headers = headers
|
||||
this.query = query
|
||||
this.path = path
|
||||
}
|
||||
}
|
|
@ -1,20 +0,0 @@
|
|||
package pl.touk.mockserver.client
|
||||
|
||||
import groovy.transform.CompileStatic
|
||||
import groovy.transform.EqualsAndHashCode
|
||||
import groovy.transform.TypeChecked
|
||||
|
||||
@CompileStatic
|
||||
@TypeChecked
|
||||
@EqualsAndHashCode
|
||||
class MockResponse {
|
||||
final int statusCode
|
||||
final String text
|
||||
final Map<String, String> headers
|
||||
|
||||
MockResponse(int statusCode, String text, Map<String, String> headers) {
|
||||
this.statusCode = statusCode
|
||||
this.text = text
|
||||
this.headers = headers
|
||||
}
|
||||
}
|
|
@ -1,10 +0,0 @@
|
|||
package pl.touk.mockserver.client
|
||||
|
||||
import groovy.transform.CompileStatic
|
||||
import groovy.transform.TypeChecked
|
||||
|
||||
@CompileStatic
|
||||
@TypeChecked
|
||||
class PeekMockRequestData {
|
||||
String name
|
||||
}
|
|
@ -1,28 +0,0 @@
|
|||
package pl.touk.mockserver.client
|
||||
|
||||
import groovy.transform.CompileStatic
|
||||
import groovy.transform.EqualsAndHashCode
|
||||
import groovy.transform.ToString
|
||||
import groovy.transform.TypeChecked
|
||||
|
||||
@CompileStatic
|
||||
@TypeChecked
|
||||
@EqualsAndHashCode
|
||||
@ToString
|
||||
class RegisteredMock {
|
||||
final String name
|
||||
final String path
|
||||
final int port
|
||||
final String predicate
|
||||
final String response
|
||||
final String responseHeaders
|
||||
|
||||
RegisteredMock(String name, String path, int port, String predicate, String response, String responseHeaders) {
|
||||
this.name = name
|
||||
this.path = path
|
||||
this.port = port
|
||||
this.predicate = predicate
|
||||
this.response = response
|
||||
this.responseHeaders = responseHeaders
|
||||
}
|
||||
}
|
|
@ -1,6 +1,5 @@
|
|||
package pl.touk.mockserver.client
|
||||
|
||||
import groovy.util.slurpersupport.GPathResult
|
||||
import org.apache.http.client.methods.CloseableHttpResponse
|
||||
import org.apache.http.client.methods.HttpGet
|
||||
import org.apache.http.client.methods.HttpPost
|
||||
|
@ -8,112 +7,70 @@ import org.apache.http.entity.ContentType
|
|||
import org.apache.http.entity.StringEntity
|
||||
import org.apache.http.impl.client.CloseableHttpClient
|
||||
import org.apache.http.impl.client.HttpClients
|
||||
import pl.touk.mockserver.api.request.AddMock
|
||||
import pl.touk.mockserver.api.request.MockServerRequest
|
||||
import pl.touk.mockserver.api.request.PeekMock
|
||||
import pl.touk.mockserver.api.request.RemoveMock
|
||||
import pl.touk.mockserver.api.response.*
|
||||
|
||||
import javax.xml.bind.JAXBContext
|
||||
|
||||
class RemoteMockServer {
|
||||
private final String address
|
||||
private final CloseableHttpClient client = HttpClients.createDefault()
|
||||
private static final JAXBContext requestContext = JAXBContext.newInstance(AddMock.package.name, AddMock.classLoader)
|
||||
private static
|
||||
final JAXBContext responseContext = JAXBContext.newInstance(MockAdded.package.name, MockAdded.classLoader)
|
||||
|
||||
RemoteMockServer(String host, int port) {
|
||||
address = "http://$host:$port/serverControl"
|
||||
}
|
||||
|
||||
void addMock(AddMockRequestData addMockRequestData) {
|
||||
void addMock(AddMock addMockData) {
|
||||
HttpPost addMockPost = new HttpPost(address)
|
||||
addMockPost.entity = buildAddMockRequest(addMockRequestData)
|
||||
addMockPost.entity = buildAddMockRequest(addMockData)
|
||||
CloseableHttpResponse response = client.execute(addMockPost)
|
||||
GPathResult responseXml = Util.extractXmlResponse(response)
|
||||
if (responseXml.name() != 'mockAdded') {
|
||||
if (responseXml.text() == 'mock already registered') {
|
||||
throw new MockAlreadyExists()
|
||||
|
||||
}
|
||||
throw new InvalidMockDefinition(responseXml.text())
|
||||
}
|
||||
Util.extractResponse(response)
|
||||
}
|
||||
|
||||
List<MockEvent> removeMock(String name, boolean skipReport = false) {
|
||||
List<MockEventReport> removeMock(String name, boolean skipReport = false) {
|
||||
HttpPost removeMockPost = new HttpPost(address)
|
||||
removeMockPost.entity = buildRemoveMockRequest(new RemoveMockRequestData(name: name, skipReport: skipReport))
|
||||
removeMockPost.entity = buildRemoveMockRequest(new RemoveMock(name: name, skipReport: skipReport))
|
||||
CloseableHttpResponse response = client.execute(removeMockPost)
|
||||
GPathResult responseXml = Util.extractXmlResponse(response)
|
||||
if (responseXml.name() == 'mockRemoved') {
|
||||
return responseXml.'mockEvent'.collect {
|
||||
new MockEvent(mockRequestFromXml(it.request), mockResponseFromXml(it.response))
|
||||
}
|
||||
}
|
||||
throw new MockDoesNotExist()
|
||||
MockRemoved mockRemoved = Util.extractResponse(response) as MockRemoved
|
||||
return mockRemoved.mockEvents ?: []
|
||||
}
|
||||
|
||||
List<MockEvent> peekMock(String name) {
|
||||
List<MockEventReport> peekMock(String name) {
|
||||
HttpPost removeMockPost = new HttpPost(address)
|
||||
removeMockPost.entity = buildPeekMockRequest(new PeekMockRequestData(name: name))
|
||||
removeMockPost.entity = buildPeekMockRequest(new PeekMock(name: name))
|
||||
CloseableHttpResponse response = client.execute(removeMockPost)
|
||||
GPathResult responseXml = Util.extractXmlResponse(response)
|
||||
if (responseXml.name() == 'mockPeeked') {
|
||||
return responseXml.'mockEvent'.collect {
|
||||
new MockEvent(mockRequestFromXml(it.request), mockResponseFromXml(it.response))
|
||||
}
|
||||
}
|
||||
throw new MockDoesNotExist()
|
||||
MockPeeked mockPeeked = Util.extractResponse(response) as MockPeeked
|
||||
return mockPeeked.mockEvents ?: []
|
||||
}
|
||||
|
||||
private static MockResponse mockResponseFromXml(GPathResult xml) {
|
||||
return new MockResponse(xml.statusCode.text() as int, xml.text.text(), xml.headers.param.collectEntries {
|
||||
[(it.@name.text()): it.text()]
|
||||
})
|
||||
private static StringEntity buildRemoveMockRequest(RemoveMock data) {
|
||||
return new StringEntity(marshallRequest(data), ContentType.create("text/xml", "UTF-8"))
|
||||
}
|
||||
|
||||
private static MockRequest mockRequestFromXml(GPathResult xml) {
|
||||
return new MockRequest(
|
||||
xml.text.text(),
|
||||
xml.headers.param.collectEntries { [(it.@name.text()): it.text()] },
|
||||
xml.query.param.collectEntries { [(it.@name.text()): it.text()] },
|
||||
xml.path.elem*.text()
|
||||
)
|
||||
private static String marshallRequest(MockServerRequest data) {
|
||||
StringWriter sw = new StringWriter()
|
||||
requestContext.createMarshaller().marshal(data, sw)
|
||||
return sw.toString()
|
||||
}
|
||||
|
||||
private static StringEntity buildRemoveMockRequest(RemoveMockRequestData data) {
|
||||
return new StringEntity("""\
|
||||
<removeMock>
|
||||
<name>${data.name}</name>
|
||||
<skipReport>${data.skipReport}</skipReport>
|
||||
</removeMock>
|
||||
""", ContentType.create("text/xml", "UTF-8"))
|
||||
private static StringEntity buildPeekMockRequest(PeekMock peekMock) {
|
||||
return new StringEntity(marshallRequest(peekMock), ContentType.create("text/xml", "UTF-8"))
|
||||
}
|
||||
|
||||
private static StringEntity buildPeekMockRequest(PeekMockRequestData data) {
|
||||
return new StringEntity("""\
|
||||
<peekMock>
|
||||
<name>${data.name}</name>
|
||||
</peekMock>
|
||||
""", ContentType.create("text/xml", "UTF-8"))
|
||||
private static StringEntity buildAddMockRequest(AddMock data) {
|
||||
return new StringEntity(marshallRequest(data), ContentType.create("text/xml", "UTF-8"))
|
||||
}
|
||||
|
||||
private static StringEntity buildAddMockRequest(AddMockRequestData data) {
|
||||
return new StringEntity("""\
|
||||
<addMock>
|
||||
<name>${data.name}</name>
|
||||
<path>${data.path}</path>
|
||||
<port>${data.port}</port>
|
||||
${data.predicate ? "<predicate>${data.predicate}</predicate>" : ''}
|
||||
${data.response ? "<response>${data.response}</response>" : ''}
|
||||
${data.soap != null ? "<soap>${data.soap}</soap>" : ''}
|
||||
${data.statusCode ? "<statusCode>${data.statusCode}</statusCode>" : ''}
|
||||
${data.method ? "<method>${data.method}</method>" : ''}
|
||||
${data.responseHeaders ? "<responseHeaders>${data.responseHeaders}</responseHeaders>" : ''}
|
||||
</addMock>
|
||||
""", ContentType.create("text/xml", "UTF-8"))
|
||||
}
|
||||
|
||||
List<RegisteredMock> listMocks() {
|
||||
List<MockReport> listMocks() {
|
||||
HttpGet get = new HttpGet(address)
|
||||
CloseableHttpResponse response = client.execute(get)
|
||||
GPathResult xml = Util.extractXmlResponse(response)
|
||||
if (xml.name() == 'mocks') {
|
||||
return xml.mock.collect {
|
||||
new RegisteredMock(it.name.text(), it.path.text(), it.port.text() as int, it.predicate.text(), it.response.text(), it.responseHeaders.text())
|
||||
}
|
||||
}
|
||||
return []
|
||||
MockListing mockListing = Util.extractResponse(response) as MockListing
|
||||
return mockListing.mocks
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,11 +0,0 @@
|
|||
package pl.touk.mockserver.client
|
||||
|
||||
import groovy.transform.CompileStatic
|
||||
import groovy.transform.TypeChecked
|
||||
|
||||
@CompileStatic
|
||||
@TypeChecked
|
||||
class RemoveMockRequestData {
|
||||
String name
|
||||
boolean skipReport = false
|
||||
}
|
|
@ -7,15 +7,42 @@ import groovy.util.slurpersupport.GPathResult
|
|||
import org.apache.http.HttpEntity
|
||||
import org.apache.http.client.methods.CloseableHttpResponse
|
||||
import org.apache.http.util.EntityUtils
|
||||
import pl.touk.mockserver.api.response.ExceptionOccured
|
||||
import pl.touk.mockserver.api.response.MockAdded
|
||||
import pl.touk.mockserver.api.response.MockServerResponse
|
||||
|
||||
import javax.xml.bind.JAXBContext
|
||||
|
||||
@CompileStatic
|
||||
@TypeChecked
|
||||
class Util {
|
||||
private static
|
||||
final JAXBContext responseContext = JAXBContext.newInstance(MockAdded.package.name, MockAdded.classLoader)
|
||||
|
||||
static GPathResult extractXmlResponse(CloseableHttpResponse response) {
|
||||
return new XmlSlurper().parseText(extractStringResponse(response))
|
||||
}
|
||||
static String extractStringResponse(CloseableHttpResponse response) {
|
||||
HttpEntity entity = response.entity
|
||||
GPathResult xml = new XmlSlurper().parseText(EntityUtils.toString(entity, 'UTF-8'))
|
||||
String responseString = EntityUtils.toString(entity, 'UTF-8')
|
||||
EntityUtils.consumeQuietly(entity)
|
||||
return xml
|
||||
return responseString
|
||||
}
|
||||
|
||||
static MockServerResponse extractResponse(CloseableHttpResponse response) {
|
||||
String responseString = extractStringResponse(response)
|
||||
if (response.statusLine.statusCode == 200) {
|
||||
return responseContext.createUnmarshaller().unmarshal(new StringReader(responseString)) as MockServerResponse
|
||||
}
|
||||
ExceptionOccured exceptionOccured = responseContext.createUnmarshaller().unmarshal(new StringReader(responseString)) as ExceptionOccured
|
||||
String message = exceptionOccured.message
|
||||
if (message == 'mock already registered') {
|
||||
throw new MockAlreadyExists()
|
||||
}
|
||||
if (message == 'mock not registered') {
|
||||
throw new MockDoesNotExist()
|
||||
}
|
||||
throw new InvalidMockDefinition(message)
|
||||
}
|
||||
|
||||
static String soap(String request) {
|
||||
|
@ -26,13 +53,11 @@ class Util {
|
|||
}
|
||||
|
||||
static Object extractJsonResponse(CloseableHttpResponse response) {
|
||||
HttpEntity entity = response.entity
|
||||
Object json = new JsonSlurper().parseText(EntityUtils.toString(entity, 'UTF-8'))
|
||||
EntityUtils.consumeQuietly(entity)
|
||||
return json
|
||||
return new JsonSlurper().parseText(extractStringResponse(response))
|
||||
}
|
||||
|
||||
static void consumeResponse(CloseableHttpResponse response) {
|
||||
EntityUtils.consumeQuietly(response.entity)
|
||||
}
|
||||
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue