/*
* Copyright (c) 2010-2012 Grid Dynamics Consulting Services, Inc, All Rights Reserved
* http://www.griddynamics.com
*
* This library is free software; you can redistribute it and/or modify it under the terms of
* the Apache License; either
* version 2.0 of the License, or any later version.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package com.griddynamics.jagger.coordinator.zookeeper;
import org.apache.zookeeper.*;
import org.apache.zookeeper.data.ACL;
import org.apache.zookeeper.data.Stat;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.IOException;
import java.util.List;
/**
* Adapts {@link org.apache.zookeeper.ZooKeeper} to {@link IZookeeper}.
*/
public class DefaultZookeeper implements IZookeeper {
private static final Logger log = LoggerFactory.getLogger(DefaultZookeeper.class);
private String connectString;
private int sessionTimeout;
private Watcher watcher;
private long sessionId;
private byte[] sessionPassword;
private int reconnectPeriod;
private ZooKeeper delegate;
public DefaultZookeeper(String connectString, int sessionTimeout, Watcher watcher, int reconnectPeriod) throws IOException {
this(connectString, sessionTimeout, watcher, 0, null, reconnectPeriod);
}
public DefaultZookeeper(String connectString, int sessionTimeout, Watcher watcher, long sessionId, byte[] sessionPassword, int reconnectPeriod) throws IOException {
this.connectString = connectString;
this.sessionTimeout = sessionTimeout;
this.watcher = watcher;
this.sessionId = sessionId;
this.sessionPassword = sessionPassword;
this.reconnectPeriod = reconnectPeriod;
getDelegate();
}
private ZooKeeper getDelegate() {
while(!isDelegateAlive()) {
try {
if(sessionPassword == null && sessionId == 0) {
delegate = new ZooKeeper(connectString, sessionTimeout, watcher);
}else {
delegate = new ZooKeeper(connectString, sessionTimeout, watcher, sessionId, sessionPassword);
}
} catch (Exception e) {
log.error("Failed to connect to ZooKeeper");
try {
Thread.sleep(reconnectPeriod);
} catch (InterruptedException ie) {}
}
}
return delegate;
}
private boolean isDelegateAlive() {
if(delegate == null) {
return false;
} else {
try {
ZooKeeper.States state = delegate.getState();
return state.isAlive();
} catch (Exception e) {
return false;
}
}
}
@Override
public long getSessionId() {
return getDelegate().getSessionId();
}
@Override
public byte[] getSessionPasswd() {
return getDelegate().getSessionPasswd();
}
@Override
public int getSessionTimeout() {
return getDelegate().getSessionTimeout();
}
@Override
public void addAuthInfo(String scheme, byte[] auth) {
getDelegate().addAuthInfo(scheme, auth);
}
@Override
public void register(Watcher watcher) {
getDelegate().register(watcher);
}
@Override
public void close() throws InterruptedException {
getDelegate().close();
}
@Override
public String create(String path, byte[] data, List<ACL> acl, CreateMode createMode) throws KeeperException, InterruptedException {
return getDelegate().create(path, data, acl, createMode);
}
@Override
public void create(String path, byte[] data, List<ACL> acl, CreateMode createMode, AsyncCallback.StringCallback cb, Object ctx) {
getDelegate().create(path, data, acl, createMode, cb, ctx);
}
@Override
public void delete(String path, int version) throws InterruptedException, KeeperException {
getDelegate().delete(path, version);
}
@Override
public void delete(String path, int version, AsyncCallback.VoidCallback cb, Object ctx) {
getDelegate().delete(path, version, cb, ctx);
}
@Override
public Stat exists(String path, Watcher watcher) throws KeeperException, InterruptedException {
return getDelegate().exists(path, watcher);
}
@Override
public Stat exists(String path, boolean watch) throws KeeperException, InterruptedException {
return getDelegate().exists(path, watch);
}
@Override
public void exists(String path, Watcher watcher, AsyncCallback.StatCallback cb, Object ctx) {
getDelegate().exists(path, watcher, cb, ctx);
}
@Override
public void exists(String path, boolean watch, AsyncCallback.StatCallback cb, Object ctx) {
getDelegate().exists(path, watch, cb, ctx);
}
@Override
public byte[] getData(String path, Watcher watcher, Stat stat) throws KeeperException, InterruptedException {
return getDelegate().getData(path, watcher, stat);
}
@Override
public byte[] getData(String path, boolean watch, Stat stat) throws KeeperException, InterruptedException {
return getDelegate().getData(path, watch, stat);
}
@Override
public void getData(String path, Watcher watcher, AsyncCallback.DataCallback cb, Object ctx) {
getDelegate().getData(path, watcher, cb, ctx);
}
@Override
public void getData(String path, boolean watch, AsyncCallback.DataCallback cb, Object ctx) {
getDelegate().getData(path, watch, cb, ctx);
}
@Override
public Stat setData(String path, byte[] data, int version) throws KeeperException, InterruptedException {
return getDelegate().setData(path, data, version);
}
@Override
public void setData(String path, byte[] data, int version, AsyncCallback.StatCallback cb, Object ctx) {
getDelegate().setData(path, data, version, cb, ctx);
}
@Override
public List<ACL> getACL(String path, Stat stat) throws KeeperException, InterruptedException {
return getDelegate().getACL(path, stat);
}
@Override
public void getACL(String path, Stat stat, AsyncCallback.ACLCallback cb, Object ctx) {
getDelegate().getACL(path, stat, cb, ctx);
}
@Override
public Stat setACL(String path, List<ACL> acl, int version) throws KeeperException, InterruptedException {
return getDelegate().setACL(path, acl, version);
}
@Override
public void setACL(String path, List<ACL> acl, int version, AsyncCallback.StatCallback cb, Object ctx) {
getDelegate().setACL(path, acl, version, cb, ctx);
}
@Override
public List<String> getChildren(String path, Watcher watcher) throws KeeperException, InterruptedException {
return getDelegate().getChildren(path, watcher);
}
@Override
public List<String> getChildren(String path, boolean watch) throws KeeperException, InterruptedException {
return getDelegate().getChildren(path, watch);
}
@Override
public void getChildren(String path, Watcher watcher, AsyncCallback.ChildrenCallback cb, Object ctx) {
getDelegate().getChildren(path, watcher, cb, ctx);
}
@Override
public void getChildren(String path, boolean watch, AsyncCallback.ChildrenCallback cb, Object ctx) {
getDelegate().getChildren(path, watch, cb, ctx);
}
@Override
public List<String> getChildren(String path, Watcher watcher, Stat stat) throws KeeperException, InterruptedException {
return getDelegate().getChildren(path, watcher, stat);
}
@Override
public List<String> getChildren(String path, boolean watch, Stat stat) throws KeeperException, InterruptedException {
return getDelegate().getChildren(path, watch, stat);
}
@Override
public void getChildren(String path, Watcher watcher, AsyncCallback.Children2Callback cb, Object ctx) {
getDelegate().getChildren(path, watcher, cb, ctx);
}
@Override
public void getChildren(String path, boolean watch, AsyncCallback.Children2Callback cb, Object ctx) {
getDelegate().getChildren(path, watch, cb, ctx);
}
@Override
public void sync(String path, AsyncCallback.VoidCallback cb, Object ctx) {
getDelegate().sync(path, cb, ctx);
}
@Override
public ZooKeeper.States getState() {
return getDelegate().getState();
}
@Override
public String toString() {
return "Wrapper for " + getDelegate().toString();
}
}