package edu.uw.zookeeper.data; import java.util.Iterator; import java.util.Map; public interface DefaultsNode<E extends DefaultsNode<E>> extends NameTrie.Node<E> { E putIfAbsent(ZNodeName label); public static abstract class AbstractDefaultsNode<E extends AbstractDefaultsNode<E>> extends AbstractNameTrie.SimpleNode<E> implements DefaultsNode<E> { public static <E extends DefaultsNode<E>> E putIfAbsent(NameTrie<E> trie, ZNodePath path) { return putIfAbsent(trie.root(), path.iterator()); } public static <E extends DefaultsNode<E>> E putIfAbsent(E node, Iterator<ZNodeLabel> remaining) { while (remaining.hasNext()) { node = node.putIfAbsent(remaining.next()); } return node; } protected AbstractDefaultsNode( NameTrie.Pointer<? extends E> parent) { super(parent); } protected AbstractDefaultsNode( NameTrie.Pointer<? extends E> parent, Map<ZNodeName, E> children) { super(parent, children); } protected AbstractDefaultsNode( ZNodePath path, NameTrie.Pointer<? extends E> parent, Map<ZNodeName, E> children) { super(path, parent, children); } @Override public E putIfAbsent(ZNodeName label) { E child; if (delegate().containsKey(label)) { child = delegate().get(label); } else { child = newChild(label); delegate().put(label, child); } return child; } protected abstract E newChild(ZNodeName label); } }