/** * Copyright (C) 2011-2012 Typesafe Inc. <http://typesafe.com> */ package org.deephacks.confit.internal.core.property.typesafe.impl; import java.util.Stack; import org.deephacks.confit.internal.core.property.typesafe.ConfigException; final class PathBuilder { // the keys are kept "backward" (top of stack is end of path) final private Stack<String> keys; private Path result; PathBuilder() { keys = new Stack<String>(); } private void checkCanAppend() { if (result != null) throw new ConfigException.BugOrBroken( "Adding to PathBuilder after getting result"); } void appendKey(String key) { checkCanAppend(); keys.push(key); } void appendPath(Path path) { checkCanAppend(); String first = path.first(); Path remainder = path.remainder(); while (true) { keys.push(first); if (remainder != null) { first = remainder.first(); remainder = remainder.remainder(); } else { break; } } } Path result() { // note: if keys is empty, we want to return null, which is a valid // empty path if (result == null) { Path remainder = null; while (!keys.isEmpty()) { String key = keys.pop(); remainder = new Path(key, remainder); } result = remainder; } return result; } }