package com.github.dreamhead.moco.parser.model;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.github.dreamhead.moco.Moco;
import com.github.dreamhead.moco.ResponseHandler;
import com.github.dreamhead.moco.handler.failover.Failover;
import com.github.dreamhead.moco.handler.proxy.ProxyConfig;
import com.github.dreamhead.moco.parser.deserializer.ProxyContainerDeserializer;
import com.google.common.base.MoreObjects;
import static com.github.dreamhead.moco.Moco.failover;
import static com.github.dreamhead.moco.Moco.playback;
import static com.github.dreamhead.moco.Moco.from;
@JsonDeserialize(using = ProxyContainerDeserializer.class)
public class ProxyContainer {
private String url;
private String from;
private String to;
private String failover;
private String playback;
public boolean hasUrl() {
return url != null;
}
@Override
public String toString() {
return MoreObjects.toStringHelper(ProxyContainer.class)
.omitNullValues()
.add("url", this.url)
.add("from", this.from)
.add("to", this.to)
.add("failover", this.failover)
.add("playback", this.playback)
.toString();
}
public static Builder builder() {
return new Builder();
}
public Failover getFailover() {
if (failover != null) {
return failover(failover);
}
if (playback != null) {
return playback(playback);
}
return Failover.DEFAULT_FAILOVER;
}
public ProxyConfig getProxyConfig() {
return from(from).to(to);
}
private boolean hasProxyConfig() {
return from != null && to != null;
}
public ResponseHandler asResponseHandler() {
Failover failover = getFailover();
if (hasProxyConfig()) {
return Moco.proxy(getProxyConfig(), failover);
}
return Moco.proxy(url, failover);
}
public static class Builder {
private String url;
private String failover;
private String playback;
private String from;
private String to;
public Builder withUrl(final String url) {
this.url = url;
return this;
}
public Builder withFrom(final String from) {
this.from = from;
return this;
}
public Builder withTo(final String to) {
this.to = to;
return this;
}
public Builder withFailover(final String failover) {
this.failover = failover;
return this;
}
public Builder withPlayback(final String playback) {
this.playback = playback;
return this;
}
public ProxyContainer build() {
if (this.url != null && (this.from != null || this.to != null)) {
throw new IllegalArgumentException("Proxy cannot be set in multiple mode");
}
if (this.url == null && (this.from == null || this.to == null)) {
throw new IllegalArgumentException("Batch proxy needs both 'from' and 'to'");
}
ProxyContainer container = new ProxyContainer();
container.url = url;
container.from = from;
container.to = to;
container.failover = failover;
container.playback = playback;
return container;
}
}
}