/*
* Sun Public License Notice
*
* The contents of this file are subject to the Sun Public License
* Version 1.0 (the "License"). You may not use this file except in
* compliance with the License. A copy of the License is available at
* http://www.sun.com/
*
* The Original Code is NetBeans. The Initial Developer of the Original
* Code is Sun Microsystems, Inc. Portions Copyright 1997-2000 Sun
* Microsystems, Inc. All Rights Reserved.
*/
package org.openide.nodes;
import org.openide.ErrorManager;
/** Simple implementation of <code>Node.Handle</code>.
* When created by {@link #createHandle} it
* looks for the parent of the node and stores the node's name.
* When {@link #getNode} is then called, it tries to restore the
* parent and then to walk down to the child.
* <p>Note that if most nodes use <code>DefaultHandle</code>, this
* may walk up to the root recursively. Otherwise, some other sort
* of handle may provide the termination case.
*
* @author Jaroslav Tulach, Jesse Glick
*/
public final class DefaultHandle extends Object implements Node.Handle {
/** parent handle */
private Node.Handle parent;
/** path to the node (just one hop, really) */
private String path;
private static final long serialVersionUID = -8739127064355983273L;
/* Create a new handle.
* @param parent handle for the parent node
* @param path desired name of child
*/
DefaultHandle (Node.Handle parent, String path) {
this.parent = parent;
this.path = path;
}
/** Find the node.
* @return the found node
* @exception IOException if the parent cannot be recreated
* @exception NodeNotFoundException if the path is not valid (exception may be examined for details)
*/
public Node getNode () throws java.io.IOException {
Node parentNode = parent.getNode ();
Node child = parentNode.getChildren ().findChild (path);
if (child != null)
return child;
else
throw new NodeNotFoundException (parentNode, path, 0);
}
/** Create a handle for a given node.
* A handle cannot be created under these circumstances:
* <ol>
* <li>The node has no name.
* <li>The node has no parent.
* <li>The parent has no handle.
* <li>The parent is incapable of finding its child by the supplied name.
* </ol>
* @param node the node to create a handler for
* @return the handler, or <code>null</code> if a handle cannot be created
*/
public static DefaultHandle createHandle (final Node node) {
try {
Children.PR.enterReadAccess ();
String childPath = node.getName ();
if (childPath == null) return null;
Node parentNode = node.getParentNode ();
if (parentNode == null) return null;
if (parentNode.getChildren ().findChild (childPath) != node) {
if (ErrorManager.getDefault().isLoggable(ErrorManager.WARNING)) {
ErrorManager.getDefault().log(ErrorManager.WARNING, "WARNING: parent could not find own child in DefaultHandle.createHandle\n\tnode=" + node + "\n\tparentNode=" + parentNode + "\n\tchildPath=" + childPath + "\n\tfound child=" + parentNode.getChildren().findChild(childPath));
}
return null;
}
Node.Handle parentHandle = parentNode.getHandle ();
if (parentHandle == null) return null;
return new DefaultHandle (parentHandle, childPath);
} finally {
Children.PR.exitReadAccess ();
}
}
public String toString () {
return "DefaultHandle[" + parent + "|" + path + "]"; // NOI18N
}
}