package org.mockserver.maven;
import com.google.common.annotations.VisibleForTesting;
import org.mockserver.client.proxy.ProxyClient;
import org.mockserver.client.server.MockServerClient;
import org.mockserver.initialize.ExpectationInitializer;
import org.mockserver.mockserver.MockServer;
import org.mockserver.mockserver.MockServerBuilder;
import org.mockserver.model.ObjectWithReflectiveEqualsHashCodeToString;
import org.mockserver.proxy.Proxy;
import org.mockserver.proxy.ProxyBuilder;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
/**
* @author jamesdbloom
*/
public class InstanceHolder extends ObjectWithReflectiveEqualsHashCodeToString {
@VisibleForTesting
static Map<Integer, MockServerClient> mockServerClients = new ConcurrentHashMap<Integer, MockServerClient>();
@VisibleForTesting
static Map<Integer, ProxyClient> proxyClients = new ConcurrentHashMap<Integer, ProxyClient>();
private ProxyBuilder proxyBuilder = new ProxyBuilder();
private MockServerBuilder mockServerBuilder = new MockServerBuilder();
private Proxy proxy;
private MockServer mockServer;
public static void runInitializationClass(int mockServerPort, ExpectationInitializer expectationInitializer) {
if (mockServerPort != -1 && expectationInitializer != null) {
expectationInitializer.initializeExpectations(getMockServerClient(mockServerPort));
}
}
private static ProxyClient getProxyClient(int proxyPort) {
if (!proxyClients.containsKey(proxyPort)) {
proxyClients.put(proxyPort, new ProxyClient("127.0.0.1", proxyPort));
}
return proxyClients.get(proxyPort);
}
private static MockServerClient getMockServerClient(int mockServerPort) {
if (!mockServerClients.containsKey(mockServerPort)) {
mockServerClients.put(mockServerPort, new MockServerClient("127.0.0.1", mockServerPort));
}
return mockServerClients.get(mockServerPort);
}
public void start(final int mockServerPort, final int proxyPort, ExpectationInitializer expectationInitializer) {
if (mockServer == null || !mockServer.isRunning()) {
if (mockServerPort != -1) {
mockServer = mockServerBuilder.withHTTPPort(mockServerPort).build();
}
runInitializationClass(mockServerPort, expectationInitializer);
} else {
throw new IllegalStateException("MockServer is already running!");
}
if (proxy == null || !proxy.isRunning()) {
if (proxyPort != -1) {
proxy = proxyBuilder.withLocalPort(proxyPort).build();
}
} else {
throw new IllegalStateException("Proxy is already running!");
}
}
public void stop(final int mockServerPort, final int proxyPort, boolean ignoreFailure) {
if (mockServerPort != -1) {
getMockServerClient(mockServerPort).stop(ignoreFailure);
}
if (proxyPort != -1) {
getProxyClient(proxyPort).stop(ignoreFailure);
}
}
public void stop() {
if (mockServer != null && mockServer.isRunning()) {
mockServer.stop();
}
if (proxy != null && proxy.isRunning()) {
proxy.stop();
}
}
}