public Node[] childNodesFor(DirNode dirNode, Map<String, String> rawChangesetContent) { if (rawChangesetContent == null) { rawChangesetContent = contentCache.readFor(dirNode.changesetNumber()); } List<Node> children = new ArrayList<Node>(); String dirPath = dirNode.isRootNode() ? "" : dirNode.path() + "/"; List<String> paths = new ArrayList<String>(rawChangesetContent.keySet()); Collections.sort(paths); String lastAddedChildPath = ""; for (String path : paths) { if (path.indexOf(lastAddedChildPath + "/") != 0) { if (path.indexOf(dirPath) == 0 && path.length() > dirPath.length() && !path.equals("/")) { if (path.endsWith("/")) { lastAddedChildPath = path.substring(0, path.length() - 1); children.add( new DirNode( this, path.substring(0, path.length() - 1), dirNode.changesetNumber(), dirNode.changesetIdentifier(), rawChangesetContent.get(path))); } else { lastAddedChildPath = path; children.add( new FileNode( this, path, dirNode.changesetNumber(), dirNode.changesetIdentifier(), rawChangesetContent.get(path))); } } } } return children.toArray(new Node[0]); }