/*******************************************************************************
* Copyright (c)2010 REMAIN B.V. The Netherlands. (http://www.remainsoftware.com).
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Wim Jongman - initial API and implementation
* Ahmed Aadel - initial API and implementation
*******************************************************************************/
package org.eclipse.ecf.provider.zookeeper.node.internal;
import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.KeeperException;
import org.apache.zookeeper.ZooDefs.Ids;
import org.apache.zookeeper.data.Stat;
import org.eclipse.core.runtime.Assert;
import org.eclipse.ecf.provider.zookeeper.core.AdvertisedService;
import org.eclipse.ecf.provider.zookeeper.core.internal.Localizer;
import org.eclipse.ecf.provider.zookeeper.core.internal.Notification;
import org.eclipse.ecf.provider.zookeeper.util.Logger;
import org.eclipse.ecf.provider.zookeeper.util.PrettyPrinter;
import org.osgi.service.log.LogService;
public class NodeWriter {
private INode node;
private String ip;
private WriteRoot writeRoot;
public NodeWriter(INode node, WriteRoot writeRoot) {
Assert.isNotNull(node);
Assert.isNotNull(writeRoot);
this.writeRoot = writeRoot;
this.node = node;
}
public String getPath() {
return this.node.getPath();
}
public void setIp(String ip) {
this.ip = ip;
}
public String getIp() {
return this.ip;
}
public synchronized void publish() {
try {
String parentPath = this.getNode().getAbsolutePath();
Stat stat = this.writeRoot.getWriteKeeper().exists(parentPath,
false);
if (stat == null) {
this.writeRoot.getWriteKeeper()
.create(parentPath,
((AdvertisedService) this.getNode()
.getWrappedService())
.getPropertiesAsBytes(),
Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL);
}
Logger.log(LogService.LOG_INFO, PrettyPrinter.prompt(PrettyPrinter.PUBLISHED, this.getNode().getWrappedService()), null);
} catch (KeeperException e) {
if (e.code() == KeeperException.Code.CONNECTIONLOSS) {
Logger.log(LogService.LOG_ERROR, "Can't connect to server! "
+ e.getMessage(), e);
}
} catch (InterruptedException e) {
// ignore
}
}
public synchronized void remove() {
if (this.writeRoot.isConnected()) {
try {
String nodePath = this.getNode().getAbsolutePath();
Stat stat = this.writeRoot.getWriteKeeper().exists(nodePath,
false);
if (stat == null) {
// nothing to remove
return;
}
// delete node
this.writeRoot.getWriteKeeper().delete(nodePath, -1);
Localizer.getSingleton().localize(
new Notification(this.getNode().getWrappedService(),
Notification.UNAVAILABLE));
Logger.log(LogService.LOG_INFO, PrettyPrinter.prompt(PrettyPrinter.UNPUBLISHED, this.getNode().getWrappedService()), null);
} catch (KeeperException e) {
// ignore
} catch (InterruptedException e) {
// ignore
}
} else if (!this.writeRoot.isConnected()
&& writeRoot.getWatchManager().getConfig().isCentralized()) {
/*
* connection lost to the central ZooDiscovery where our services
* are published to.
*/
Logger.log(LogService.LOG_INFO, PrettyPrinter.prompt(PrettyPrinter.UNPUBLISHED, this.getNode().getWrappedService()), null);
}
}
public INode getNode() {
return this.node;
}
}