I'd expect to specialize the generic thus:
public class RamTree extends Tree<String, RamFileObject> { public final Node root = new Node(""); }
The rest is encapsulated in the Node class.
An aside: where would a class like Tree belong? It is awfully general to be in VFS. Should I be mentioning this to the collections folk?
Cheers, --binkley
public class Tree <Path, Leaf> {
/**
* Creates a new root node for a tree with the given <var>path</var>. For example, if the type of <var>Path</var> is [EMAIL PROTECTED] String}, a common choice for root path would be the empty string.
*
* @param path the root node name
*
* @return the new root node
*/
public Node createRootNode(final Path path) {
return new Node(path);
}
public class Node { private final Path path; private final Node parent; private final Map<Path, Node> children = new HashMap<Path, Node>();
private Leaf content;
/**
* Constructs a new root [EMAIL PROTECTED] Node} with the given <var>path</var>.
* The root is itself its own parent node.
*
* @param path the root node name
*
* @see #Node(Path, Node)
*/
protected Node(final Path path) {
if (null == path) throw new NullPointerException();
this.parent = this; this.path = path; }
/** * Constructs a new non-root [EMAIL PROTECTED] Node} with the given * <var>path</var> and <var>parent</var> node. The parent node * <strong>must</strong> be distinct from this node. * * @param path the child node name * @param parent the parent node * * @see #Node(Path) */ protected Node(final Path path, final Node parent) { if (null == parent) throw new NullPointerException(); if (this == parent) throw new IllegalArgumentException(); if (null == path) throw new NullPointerException();
this.parent = parent; this.path = path; }
public boolean isRoot() { return this == parent; }
public Node getParent() { return parent; }
public Path getPath() { return path; }
public boolean hasContent() { return null != content; }
public Leaf getContent() { if (null == content) throw new NullPointerException();
return content; }
public void setContent(final Leaf content) { if (null == content) throw new NullPointerException();
this.content = content; }
public void removeContent() { if (null != content) throw new IllegalStateException();
this.content = null; }
public boolean hasChild(final Path path) { if (null == path) throw new NullPointerException();
return children.containsKey(path); }
public Node getChild(final Path path) { if (null == path) throw new NullPointerException();
return children.get(path); }
public Node addChild(final Path path) { if (null == path) throw new NullPointerException(); if (hasChild(path)) throw new IllegalArgumentException();
final Node child = new Node(path, this);
children.put(path, child);
return child; }
public void removeChild(final Path path) { if (null == path) throw new NullPointerException(); if (!hasChild(path)) throw new IllegalArgumentException();
children.remove(path);
// Do not return the removed node; it has no valid parent }
public Collection<Node> getChildren() { return Collections.unmodifiableCollection(children.values()); } } }
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]