package edu.uw.zookeeper.protocol.client;
import static com.google.common.base.Preconditions.checkState;
import java.util.concurrent.ScheduledExecutorService;
import edu.uw.zookeeper.ConfigurableTimeout;
import edu.uw.zookeeper.ZooKeeperApplication;
import edu.uw.zookeeper.common.Factory;
import edu.uw.zookeeper.common.ParameterizedFactory;
import edu.uw.zookeeper.common.RuntimeModule;
import edu.uw.zookeeper.common.TimeValue;
import edu.uw.zookeeper.net.ClientConnectionFactory;
import edu.uw.zookeeper.net.CodecConnection;
import edu.uw.zookeeper.net.NetClientModule;
import edu.uw.zookeeper.netty.client.NettyClientModule;
import edu.uw.zookeeper.protocol.Message;
import edu.uw.zookeeper.protocol.ProtocolCodec;
public class ClientConnectionFactoryBuilder implements ZooKeeperApplication.RuntimeBuilder<ClientConnectionFactory<? extends ClientProtocolConnection<Message.ClientSession, Message.ServerSession,?,?>>, ClientConnectionFactoryBuilder> {
public static ClientConnectionFactoryBuilder defaults() {
return new ClientConnectionFactoryBuilder(null, null, null, null, null);
}
protected final RuntimeModule runtime;
protected final NetClientModule clientModule;
protected final TimeValue timeOut;
protected final Factory<? extends ProtocolCodec<Message.ClientSession, Message.ServerSession, Message.ClientSession, Message.ServerSession>> codecFactory;
protected final ParameterizedFactory<CodecConnection<Message.ClientSession, Message.ServerSession, ProtocolCodec<Message.ClientSession,Message.ServerSession, Message.ClientSession, Message.ServerSession>,?>, ? extends ClientProtocolConnection<Message.ClientSession, Message.ServerSession,?,?>> connectionFactory;
public ClientConnectionFactoryBuilder(
RuntimeModule runtime,
NetClientModule clientModule,
TimeValue timeOut,
Factory<? extends ProtocolCodec<Message.ClientSession, Message.ServerSession, Message.ClientSession, Message.ServerSession>> codecFactory,
ParameterizedFactory<CodecConnection<Message.ClientSession, Message.ServerSession, ProtocolCodec<Message.ClientSession,Message.ServerSession, Message.ClientSession, Message.ServerSession>,?>, ? extends ClientProtocolConnection<Message.ClientSession, Message.ServerSession,?,?>> connectionFactory) {
super();
this.runtime = runtime;
this.clientModule = clientModule;
this.timeOut = timeOut;
this.codecFactory = codecFactory;
this.connectionFactory = connectionFactory;
}
@Override
public RuntimeModule getRuntimeModule() {
return runtime;
}
@Override
public ClientConnectionFactoryBuilder setRuntimeModule(RuntimeModule runtime) {
if (this.runtime == runtime) {
return this;
} else {
return newInstance(runtime, clientModule, timeOut, codecFactory, connectionFactory);
}
}
public NetClientModule getClientModule() {
return clientModule;
}
public ClientConnectionFactoryBuilder setClientModule(NetClientModule clientModule) {
if (this.clientModule == clientModule) {
return this;
} else {
return newInstance(runtime, clientModule, timeOut, codecFactory, connectionFactory);
}
}
public TimeValue getTimeOut() {
return timeOut;
}
public ClientConnectionFactoryBuilder setTimeOut(TimeValue timeOut) {
if (this.timeOut == timeOut) {
return this;
} else {
return newInstance(runtime, clientModule, timeOut, codecFactory, connectionFactory);
}
}
public Factory<? extends ProtocolCodec<Message.ClientSession, Message.ServerSession, Message.ClientSession, Message.ServerSession>> getCodecFactory() {
return codecFactory;
}
public ClientConnectionFactoryBuilder setCodecFactory(
Factory<? extends ProtocolCodec<Message.ClientSession, Message.ServerSession, Message.ClientSession, Message.ServerSession>> codecFactory) {
if (this.codecFactory == codecFactory) {
return this;
} else {
return newInstance(runtime, clientModule, timeOut, codecFactory, connectionFactory);
}
}
public ParameterizedFactory<CodecConnection<Message.ClientSession, Message.ServerSession, ProtocolCodec<Message.ClientSession,Message.ServerSession, Message.ClientSession, Message.ServerSession>,?>, ? extends ClientProtocolConnection<Message.ClientSession, Message.ServerSession,?,?>> getConnectionFactory() {
return connectionFactory;
}
public ClientConnectionFactoryBuilder setConnectionFactory(
ParameterizedFactory<CodecConnection<Message.ClientSession, Message.ServerSession, ProtocolCodec<Message.ClientSession,Message.ServerSession, Message.ClientSession, Message.ServerSession>,?>, ? extends ClientProtocolConnection<Message.ClientSession, Message.ServerSession,?,?>> connectionFactory) {
return newInstance(runtime, clientModule, timeOut, codecFactory, connectionFactory);
}
@Override
public ClientConnectionFactoryBuilder setDefaults() {
checkState(runtime != null);
if (clientModule == null) {
return setClientModule(getDefaultClientModule()).setDefaults();
}
if (timeOut == null) {
return setTimeOut(getDefaultTimeOut()).setDefaults();
}
if (codecFactory == null) {
return setCodecFactory(getDefaultCodecFactory()).setDefaults();
}
if (connectionFactory == null) {
return setConnectionFactory(getDefaultConnectionFactory()).setDefaults();
}
return this;
}
@Override
public ClientConnectionFactory<? extends ClientProtocolConnection<Message.ClientSession, Message.ServerSession, ?,?>> build() {
return setDefaults().getDefaultClientConnectionFactory();
}
protected ClientConnectionFactoryBuilder newInstance(
RuntimeModule runtime,
NetClientModule clientModule,
TimeValue timeOut,
Factory<? extends ProtocolCodec<Message.ClientSession, Message.ServerSession, Message.ClientSession, Message.ServerSession>> codecFactory,
ParameterizedFactory<CodecConnection<Message.ClientSession, Message.ServerSession, ProtocolCodec<Message.ClientSession,Message.ServerSession, Message.ClientSession, Message.ServerSession>,?>, ? extends ClientProtocolConnection<Message.ClientSession, Message.ServerSession,?,?>> connectionFactory) {
return new ClientConnectionFactoryBuilder(runtime, clientModule, timeOut, codecFactory, connectionFactory);
}
protected TimeValue getDefaultTimeOut() {
return ConfigurableTimeout.get(runtime.getConfiguration());
}
protected NetClientModule getDefaultClientModule() {
return NettyClientModule.newInstance(runtime);
}
protected Factory<? extends ProtocolCodec<Message.ClientSession, Message.ServerSession, Message.ClientSession, Message.ServerSession>> getDefaultCodecFactory() {
return new Factory<ClientProtocolCodec>(){
@Override
public ClientProtocolCodec get() {
return ClientProtocolCodec.defaults();
}
};
}
protected ParameterizedFactory<CodecConnection<Message.ClientSession, Message.ServerSession, ProtocolCodec<Message.ClientSession,Message.ServerSession, Message.ClientSession, Message.ServerSession>,?>, ? extends ClientProtocolConnection<Message.ClientSession, Message.ServerSession,?,?>> getDefaultConnectionFactory() {
return PingingClient.<Message.ClientSession, Message.ServerSession, ProtocolCodec<Message.ClientSession,Message.ServerSession, Message.ClientSession, Message.ServerSession>, CodecConnection<Message.ClientSession, Message.ServerSession, ProtocolCodec<Message.ClientSession,Message.ServerSession, Message.ClientSession, Message.ServerSession>,?>>factory(
getTimeOut(),
getRuntimeModule().getExecutors().get(ScheduledExecutorService.class));
}
protected ClientConnectionFactory<? extends ClientProtocolConnection<Message.ClientSession, Message.ServerSession,?,?>> getDefaultClientConnectionFactory() {
ClientConnectionFactory<? extends ClientProtocolConnection<Message.ClientSession, Message.ServerSession,?,?>> clientConnections =
getClientModule().getClientConnectionFactory(
getCodecFactory(),
getConnectionFactory()).get();
return clientConnections;
}
}