package edu.uw.zookeeper.data;
import static com.google.common.base.Preconditions.checkNotNull;
import java.util.Map;
import com.google.common.base.MoreObjects;
import com.google.common.base.Optional;
import com.google.common.base.Supplier;
import edu.uw.zookeeper.data.NameTrie.Pointer;
public class OptionalNode<V> extends DefaultsNode.AbstractDefaultsNode<OptionalNode<V>> implements Supplier<V> {
public static <V> OptionalNode<V> root() {
return root(Optional.<V>absent());
}
public static <V> OptionalNode<V> root(Optional<V> value) {
return new OptionalNode<V>(checkNotNull(value), SimpleLabelTrie.<OptionalNode<V>>rootPointer());
}
public static <V> OptionalNode<V> child(ZNodeName name, OptionalNode<V> parent) {
return child(Optional.<V>absent(), name, parent);
}
public static <V> OptionalNode<V> child(Optional<V> value, ZNodeName name, OptionalNode<V> parent) {
return new OptionalNode<V>(checkNotNull(value), SimpleLabelTrie.weakPointer(name, parent));
}
private Optional<V> value;
protected OptionalNode(
Optional<V> value,
Pointer<? extends OptionalNode<V>> parent) {
super(parent);
this.value = value;
}
protected OptionalNode(
Optional<V> value,
Pointer<? extends OptionalNode<V>> parent,
Map<ZNodeName, OptionalNode<V>> children) {
super(parent, children);
this.value = value;
}
protected OptionalNode(
Optional<V> value,
ZNodePath path,
Pointer<? extends OptionalNode<V>> parent,
Map<ZNodeName, OptionalNode<V>> children) {
super(path, parent, children);
this.value = value;
}
public boolean isPresent() {
return value.isPresent();
}
@Override
public V get() {
return value.get();
}
public void set(V value) {
this.value = Optional.of(value);
}
public void unset() {
this.value = Optional.absent();
}
@Override
public String toString() {
return MoreObjects.toStringHelper("")
.add("path", path())
.add("children", keySet())
.add("value", get())
.toString();
}
@Override
protected OptionalNode<V> newChild(ZNodeName label) {
return child(label, this);
}
}