org.eclipse.ecf.provider.zookeeper.node.internal.NodeWriter.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.ecf.provider.zookeeper.node.internal.NodeWriter.java

Source

/*******************************************************************************
 *  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;
    }

}