package com.google.sitebricks.client;
import com.google.common.base.Preconditions;
import com.google.inject.Inject;
import com.google.inject.Injector;
import com.google.inject.TypeLiteral;
import com.google.sitebricks.client.Web.ReadAsBuilder;
import com.google.sitebricks.client.transport.Text;
import net.jcip.annotations.NotThreadSafe;
import java.util.Map;
/**
* @author Dhanji R. Prasanna (dhanji@gmail.com)
*/
@NotThreadSafe
class WebClientBuilder implements Web.FormatBuilder {
private final Injector injector;
private String url;
private Map<String, String> headers;
private Web.Auth authType;
private String username;
private String password;
private boolean usePreemptiveAuth;
@Inject
public WebClientBuilder(Injector injector) {
this.injector = injector;
}
public Web.FormatBuilder clientOf(String url) {
this.url = url;
this.headers = null;
return this;
}
public Web.FormatBuilder clientOf(String url, Map<String, String> headers) {
this.url = url;
this.headers = headers;
return this;
}
public <T> Web.ReadAsBuilder<T> transports(Class<T> clazz) {
return new InternalReadAsBuilder<T>(new TypeLiteral<T>() {});
}
@Override
public <T> ReadAsBuilder<T> transports(TypeLiteral<T> clazz) {
return new InternalReadAsBuilder<T>(clazz);
}
@Override
@SuppressWarnings("unchecked")
public <T> WebClient<T> transportsText() {
return (WebClient<T>) transports(String.class).over(Text.class);
}
public Web.FormatBuilder auth(Web.Auth auth, String username, String password) {
return auth(auth, username, password, false);
}
public Web.FormatBuilder auth(Web.Auth auth, String username, String password, boolean usePreemptiveAuth) {
Preconditions.checkArgument(null != auth, "Invalid auth type, null.");
Preconditions.checkArgument(null != username, "Username cannot be null.");
Preconditions.checkArgument(null != password, "Password cannot be null.");
this.authType = auth;
this.username = username;
this.password = password;
this.usePreemptiveAuth = usePreemptiveAuth;
return this;
}
private class InternalReadAsBuilder<T> implements Web.ReadAsBuilder<T> {
private final TypeLiteral<T> transporting;
private InternalReadAsBuilder(TypeLiteral<T> transporting) {
this.transporting = transporting;
}
public WebClient<T> over(Class<? extends Transport> transport) {
return new AHCWebClient<T>(injector, injector.getInstance(transport), authType, username, password,
usePreemptiveAuth, url, headers, transporting);
}
}
}