Make api with jaxb

Change-Id: Ic0ac5ce212fac17583699868709b67a701231755
This commit is contained in:
Dominik Adam Przybysz 2015-08-29 14:53:54 +02:00
parent 5545b67ebd
commit 82434f46a3
38 changed files with 583 additions and 422 deletions

View file

@ -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)
}
}

View file

@ -1,12 +0,0 @@
package pl.touk.mockserver.client
enum Method {
POST,
GET,
DELETE,
PUT,
TRACE,
HEAD,
OPTIONS,
PATCH
}

View file

@ -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
}
}

View file

@ -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
}
}

View file

@ -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
}
}

View file

@ -1,10 +0,0 @@
package pl.touk.mockserver.client
import groovy.transform.CompileStatic
import groovy.transform.TypeChecked
@CompileStatic
@TypeChecked
class PeekMockRequestData {
String name
}

View file

@ -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
}
}

View file

@ -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
}
}

View file

@ -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
}

View file

@ -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)
}
}