package edu.uw.zookeeper.data; import edu.uw.zookeeper.common.Reference; public final class AbsoluteZNodePath extends ZNodePath { public static AbsoluteZNodePath zookeeper() { return AbsoluteZNodePath.Reserved.ZOOKEEPER.get(); } @Serializes(from=String.class, to=AbsoluteZNodePath.class) public static AbsoluteZNodePath fromString(String path) { assert (path.charAt(0) == SLASH); assert (path.length() > 1); return new AbsoluteZNodePath(path); } private AbsoluteZNodePath(String label) { super(label); } @Override public boolean isRoot() { return false; } public ZNodePath parent() { // TODO: memoize? int lastSlash = toString().lastIndexOf(SLASH); if (lastSlash == 0) { return RootZNodePath.getInstance(); } else { String parent = toString().substring(0, lastSlash); return ZNodePath.fromString(parent); } } @Override public ZNodeLabel label() { // TODO: memoize? int lastSlash = toString().lastIndexOf(SLASH); String tail = toString().substring(lastSlash + 1); return ZNodeLabel.fromString(tail); } @Override public AbsoluteZNodePath join(ZNodeName other) { String suffix = other.toString(); if (suffix.isEmpty()) { return this; } else if (suffix.charAt(0) == SLASH) { throw new IllegalArgumentException(suffix); } return AbsoluteZNodePath.fromString(new StringBuilder(length() + suffix.length() + 1).append(toString()).append(SLASH).append(suffix).toString()); } public static enum Reserved implements Reference<AbsoluteZNodePath> { ZOOKEEPER((AbsoluteZNodePath) root().join(ZNodeLabel.zookeeper())), QUOTA((AbsoluteZNodePath) ZOOKEEPER.get().join(ZNodeLabel.fromString("quota"))), CONFIG((AbsoluteZNodePath)ZOOKEEPER.get().join(ZNodeLabel.fromString("config"))); private final AbsoluteZNodePath value; private Reserved(AbsoluteZNodePath value) { this.value = value; } @Override public AbsoluteZNodePath get() { return value; } } }