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 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 class ControlServerClient { private final String address private final CloseableHttpClient client = HttpClients.createDefault() ControlServerClient(String host, int port) { address = "http://$host:$port/serverControl" } void addMock(AddMockRequestData addMockRequestData) { HttpPost addMockPost = new HttpPost(address) addMockPost.entity = buildAddMockRequest(addMockRequestData) 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()) } } List removeMock(String name) { HttpPost removeMockPost = new HttpPost(address) removeMockPost.entity = buildRemoveMockRequest(new RemoveMockRequestData(name: name)) 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() } 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 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 StringEntity buildRemoveMockRequest(RemoveMockRequestData data) { return new StringEntity("""\ ${data.name} """, ContentType.create("text/xml", "UTF-8")) } private static StringEntity buildAddMockRequest(AddMockRequestData data) { return new StringEntity("""\ ${data.name} ${data.path} ${data.port} ${data.predicate ? "${data.predicate}" : ''} ${data.response ? "${data.response}" : ''} ${data.soap != null ? "${data.soap}" : ''} ${data.statusCode ? "${data.statusCode}" : ''} ${data.method ? "${data.method}" : ''} ${data.responseHeaders ? "${data.responseHeaders}" : ''} """, ContentType.create("text/xml", "UTF-8")) } List 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) } } return [] } }