blob: cad1096f5549315128b93a2a4a3ed5ee5a4fd68a [file] [log] [blame]
/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.twitter.distributedlog;
import com.google.common.base.Optional;
import com.google.common.base.Preconditions;
import org.apache.bookkeeper.stats.NullStatsLogger;
import org.apache.bookkeeper.stats.StatsLogger;
import org.jboss.netty.channel.socket.ClientSocketChannelFactory;
import org.jboss.netty.util.HashedWheelTimer;
import org.apache.bookkeeper.feature.FeatureProvider;
import org.apache.bookkeeper.feature.Feature;
/**
* Builder to build bookkeeper client.
*/
public class BookKeeperClientBuilder {
/**
* Create a bookkeeper client builder to build bookkeeper clients.
*
* @return bookkeeper client builder.
*/
public static BookKeeperClientBuilder newBuilder() {
return new BookKeeperClientBuilder();
}
// client name
private String name = null;
// dl config
private DistributedLogConfiguration dlConfig = null;
// bookkeeper settings
// zookeeper client
private ZooKeeperClient zkc = null;
// or zookeeper servers
private String zkServers = null;
// ledgers path
private String ledgersPath = null;
// statsLogger
private StatsLogger statsLogger = NullStatsLogger.INSTANCE;
// client channel factory
private ClientSocketChannelFactory channelFactory = null;
// request timer
private HashedWheelTimer requestTimer = null;
// feature provider
private Optional<FeatureProvider> featureProvider = Optional.absent();
// Cached BookKeeper Client
private BookKeeperClient cachedClient = null;
/**
* Private bookkeeper builder.
*/
private BookKeeperClientBuilder() {}
/**
* Set client name.
*
* @param name
* client name.
* @return builder
*/
public synchronized BookKeeperClientBuilder name(String name) {
this.name = name;
return this;
}
/**
* <i>dlConfig</i> used to configure bookkeeper client.
*
* @param dlConfig
* distributedlog config.
* @return builder.
*/
public synchronized BookKeeperClientBuilder dlConfig(DistributedLogConfiguration dlConfig) {
this.dlConfig = dlConfig;
return this;
}
/**
* Set the zkc used to build bookkeeper client. If a zookeeper client is provided in this
* method, bookkeeper client will use it rather than creating a brand new one.
*
* @param zkc
* zookeeper client.
* @return builder
* @see #zkServers(String)
*/
public synchronized BookKeeperClientBuilder zkc(ZooKeeperClient zkc) {
this.zkc = zkc;
return this;
}
/**
* Set the zookeeper servers that bookkeeper client would connect to. If no zookeeper client
* is provided by {@link #zkc(ZooKeeperClient)}, bookkeeper client will use the given string
* to create a brand new zookeeper client.
*
* @param zkServers
* zookeeper servers that bookkeeper client would connect to.
* @return builder
* @see #zkc(ZooKeeperClient)
*/
public synchronized BookKeeperClientBuilder zkServers(String zkServers) {
this.zkServers = zkServers;
return this;
}
/**
* Set the ledgers path that bookkeeper client is going to access.
*
* @param ledgersPath
* ledgers path
* @return builder
* @see org.apache.bookkeeper.conf.ClientConfiguration#getZkLedgersRootPath()
*/
public synchronized BookKeeperClientBuilder ledgersPath(String ledgersPath) {
this.ledgersPath = ledgersPath;
return this;
}
/**
* Build BookKeeper client using existing <i>bkc</i> client.
*
* @param bkc
* bookkeeper client.
* @return builder
*/
public synchronized BookKeeperClientBuilder bkc(BookKeeperClient bkc) {
this.cachedClient = bkc;
return this;
}
/**
* Build BookKeeper client using existing <i>channelFactory</i>.
*
* @param channelFactory
* Channel Factory used to build bookkeeper client.
* @return bookkeeper client builder.
*/
public synchronized BookKeeperClientBuilder channelFactory(ClientSocketChannelFactory channelFactory) {
this.channelFactory = channelFactory;
return this;
}
/**
* Build BookKeeper client using existing <i>request timer</i>.
*
* @param requestTimer
* HashedWheelTimer used to build bookkeeper client.
* @return bookkeeper client builder.
*/
public synchronized BookKeeperClientBuilder requestTimer(HashedWheelTimer requestTimer) {
this.requestTimer = requestTimer;
return this;
}
/**
* Build BookKeeper Client using given stats logger <i>statsLogger</i>.
*
* @param statsLogger
* stats logger to report stats
* @return builder.
*/
public synchronized BookKeeperClientBuilder statsLogger(StatsLogger statsLogger) {
this.statsLogger = statsLogger;
return this;
}
public synchronized BookKeeperClientBuilder featureProvider(Optional<FeatureProvider> featureProvider) {
this.featureProvider = featureProvider;
return this;
}
private void validateParameters() {
Preconditions.checkNotNull(name, "Missing client name.");
Preconditions.checkNotNull(dlConfig, "Missing DistributedLog Configuration.");
Preconditions.checkArgument(null == zkc || null == zkServers, "Missing zookeeper setting.");
Preconditions.checkNotNull(ledgersPath, "Missing Ledgers Root Path.");
}
public synchronized BookKeeperClient build() {
if (null == cachedClient) {
cachedClient = buildClient();
}
return cachedClient;
}
private BookKeeperClient buildClient() {
validateParameters();
return new BookKeeperClient(dlConfig, name, zkServers, zkc, ledgersPath, channelFactory, requestTimer, statsLogger, featureProvider);
}
}