/** * Messages getTreeNodeForPage(path, onlyIfVisible, shouldCreate, path.length) as long as path is * non-null and the length is {@literal >} 0. Otherwise returns null. */ private FHTreeStateNode getNodeForPath( TreePath path, boolean onlyIfVisible, boolean shouldCreate) { if (path != null) { FHTreeStateNode node; node = getMapping(path); if (node != null) { if (onlyIfVisible && !node.isVisible()) return null; return node; } if (onlyIfVisible) return null; // Check all the parent paths, until a match is found. Stack<TreePath> paths; if (tempStacks.size() == 0) { paths = new Stack<TreePath>(); } else { paths = tempStacks.pop(); } try { paths.push(path); path = path.getParentPath(); node = null; while (path != null) { node = getMapping(path); if (node != null) { // Found a match, create entries for all paths in // paths. while (node != null && paths.size() > 0) { path = paths.pop(); node = node.createChildFor(path.getLastPathComponent()); } return node; } paths.push(path); path = path.getParentPath(); } } finally { paths.removeAllElements(); tempStacks.push(paths); } // If we get here it means they share a different root! return null; } return null; }