/**
* 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 org.apache.camel.component.zookeepermaster;
import java.io.File;
import java.net.InetSocketAddress;
import org.apache.zookeeper.server.NIOServerCnxnFactory;
import org.apache.zookeeper.server.ZooKeeperServer;
import org.apache.zookeeper.server.persistence.FileTxnSnapLog;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.FactoryBean;
import org.springframework.beans.factory.InitializingBean;
/**
* A simple ZK server for testing ZK related code in unit tests
*/
public class ZKServerFactoryBean implements FactoryBean<ZooKeeperServer>, InitializingBean, DisposableBean {
private ZooKeeperServer zooKeeperServer = new ZooKeeperServer();
private NIOServerCnxnFactory connectionFactory;
private File dataLogDir;
private File dataDir;
private boolean purge;
private int tickTime = ZooKeeperServer.DEFAULT_TICK_TIME;
/**
* defaults to -1 if not set explicitly
*/
private int minSessionTimeout = -1;
/**
* defaults to -1 if not set explicitly
*/
private int maxSessionTimeout = -1;
private InetSocketAddress clientPortAddress;
private int maxClientConnections;
private int port = 2181;
public ZooKeeperServer getObject() throws Exception {
return zooKeeperServer;
}
public Class<ZooKeeperServer> getObjectType() {
return ZooKeeperServer.class;
}
public boolean isSingleton() {
return true;
}
public void afterPropertiesSet() throws Exception {
if (purge) {
deleteFilesInDir(getDataLogDir());
deleteFilesInDir(getDataDir());
}
FileTxnSnapLog ftxn = new FileTxnSnapLog(getDataLogDir(), getDataDir());
zooKeeperServer.setTxnLogFactory(ftxn);
zooKeeperServer.setTickTime(getTickTime());
zooKeeperServer.setMinSessionTimeout(getMinSessionTimeout());
zooKeeperServer.setMaxSessionTimeout(getMaxSessionTimeout());
connectionFactory = new NIOServerCnxnFactory();
connectionFactory.configure(getClientPortAddress(), getMaxClientConnections());
connectionFactory.startup(zooKeeperServer);
}
private void deleteFilesInDir(File dir) {
File[] files = dir.listFiles();
if (files != null) {
for (File file : files) {
if (file.isDirectory()) {
deleteFilesInDir(file);
} else {
file.delete();
}
}
}
}
public void destroy() throws Exception {
shutdown();
}
protected void shutdown() {
if (connectionFactory != null) {
connectionFactory.shutdown();
try {
connectionFactory.join();
} catch (InterruptedException e) {
// Ignore
}
connectionFactory = null;
}
if (zooKeeperServer != null) {
zooKeeperServer.shutdown();
zooKeeperServer = null;
}
}
// Properties
//-------------------------------------------------------------------------
public ZooKeeperServer getZooKeeperServer() {
return zooKeeperServer;
}
public NIOServerCnxnFactory getConnectionFactory() {
return connectionFactory;
}
public File getDataLogDir() {
if (dataLogDir == null) {
dataLogDir = new File(getZKOutputDir(), "log");
dataLogDir.mkdirs();
}
return dataLogDir;
}
public File getDataDir() {
if (dataDir == null) {
dataDir = new File(getZKOutputDir(), "data");
dataDir.mkdirs();
}
return dataDir;
}
public int getTickTime() {
return tickTime;
}
public int getMinSessionTimeout() {
return minSessionTimeout;
}
public int getMaxSessionTimeout() {
return maxSessionTimeout;
}
public int getPort() {
return port;
}
public InetSocketAddress getClientPortAddress() {
if (clientPortAddress == null) {
clientPortAddress = new InetSocketAddress(port);
}
return clientPortAddress;
}
public int getMaxClientConnections() {
return maxClientConnections;
}
public void setPort(int port) {
this.port = port;
}
public void setClientPortAddress(InetSocketAddress clientPortAddress) {
this.clientPortAddress = clientPortAddress;
}
public void setConnectionFactory(NIOServerCnxnFactory connectionFactory) {
this.connectionFactory = connectionFactory;
}
public void setDataDir(File dataDir) {
this.dataDir = dataDir;
}
public void setDataLogDir(File dataLogDir) {
this.dataLogDir = dataLogDir;
}
public void setMaxClientConnections(int maxClientConnections) {
this.maxClientConnections = maxClientConnections;
}
public void setMaxSessionTimeout(int maxSessionTimeout) {
this.maxSessionTimeout = maxSessionTimeout;
}
public void setMinSessionTimeout(int minSessionTimeout) {
this.minSessionTimeout = minSessionTimeout;
}
public void setTickTime(int tickTime) {
this.tickTime = tickTime;
}
public void setZooKeeperServer(ZooKeeperServer zooKeeperServer) {
this.zooKeeperServer = zooKeeperServer;
}
public boolean isPurge() {
return purge;
}
public void setPurge(boolean purge) {
this.purge = purge;
}
// Implementation methods
//-------------------------------------------------------------------------
protected File getZKOutputDir() {
String baseDir = System.getProperty("basedir", ".");
File dir = new File(baseDir + "/target/zk");
dir.mkdirs();
return dir;
}
}