package edu.uw.zookeeper.data; import java.util.Iterator; import javax.annotation.Nonnull; /** * NameTrie in which every edge is a ZNodeLabel. * * Not threadsafe. */ public class SimpleLabelTrie<E extends NameTrie.Node<E>> extends AbstractNameTrie<E> { public static <E extends Node<E>> SimpleLabelTrie<E> forRoot(E root) { return new SimpleLabelTrie<E>(root); } protected SimpleLabelTrie(E root) { super(root); } @Override public @Nonnull E longestPrefix(ZNodePath path) { Iterator<ZNodeLabel> remaining = path.iterator(); E node = root(); while (remaining.hasNext()) { E next = node.get(remaining.next()); if (next == null) { break; } else { node = next; } } return node; } @Override public E get(Object k) { ZNodePath path = toPath(k); Iterator<? extends AbstractZNodeLabel> remaining = path.iterator(); E node = root(); while ((node != null) && remaining.hasNext()) { node = node.get(remaining.next()); } return node; } @Override public E put(ZNodePath k, E v) { E parent = get(((AbsoluteZNodePath) k).parent()); if (parent == null) { throw new IllegalStateException(k.toString()); } else { return parent.put(v.parent().name(), v); } } @Override public E remove(Object k) { ZNodePath path = toPath(k); if (path.isRoot()) { throw new IllegalArgumentException(String.valueOf(k)); } E parent = get(((AbsoluteZNodePath) path).parent()); if (parent == null) { return null; } return parent.remove(((AbsoluteZNodePath) path).label()); } }