package com.googlecode.objectify.impl;
/**
* This is a wrapper for a Path that makes it backwards; instead of going from tail to head,
* it has links from head to tail. This is sometimes useful for forward traversal of a path.
*
* @author Jeff Schnitzer <jeff@infohazard.org>
*/
public class ForwardPath
{
/** This path segment. */
private final Path path;
/** The next step in the path, null for the end. */
private ForwardPath next;
/** */
public ForwardPath(Path path) {
this.path = path;
}
/**
* Recursive method which reverses the path into a ForwardPath.
* @param path cannot be the root path.
*/
public static ForwardPath of(Path path) {
ForwardPath next = new ForwardPath(path);
if (path.getPrevious() == Path.root())
return next;
ForwardPath previous = of(path.getPrevious());
previous.next = next;
return previous;
}
/** @return the real full path to this place */
public Path getPath() {
return this.path;
}
/** @return the next path in the forward traversal */
public ForwardPath getNext() {
return this.next;
}
/** Get the complete path in this chain, typically for error messages or debugging */
public Path getFinalPath() {
ForwardPath here = this;
while (here.next != null)
here = here.next;
return here.getPath();
}
@Override
public String toString() {
return path.toPathString();
}
}