package alien4cloud.utils; import java.io.IOException; import java.nio.file.FileVisitResult; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.SimpleFileVisitor; import java.nio.file.attribute.BasicFileAttributes; import java.util.ArrayList; import java.util.TreeSet; import com.fasterxml.jackson.databind.ObjectMapper; public final class DirectoryJSonWalker { private DirectoryJSonWalker() { } /** * Walk a directory to build a json that describe the structure. * * @param directory The directory to walk. * @param target The path in which to save the json file. * @throws IOException In case of an IO issue while walking the directory. */ public static void directoryJson(Path directory, Path target) throws IOException { final TreeNode root = getDirectoryTree(directory); ObjectMapper mapper = new ObjectMapper(); mapper.writeValue(target.toFile(), root); } /** * Generate a TreeNode that represents the content of the directory given as a parameter. * * @param directory The path to the directory for which to get a tree node. */ public static TreeNode getDirectoryTree(Path directory) throws IOException { final TreeNode root = new TreeNode(); root.setLeaf(false); root.setFullPath(""); root.setChildren(new TreeSet<>()); // create the directory layout file Files.walkFileTree(directory, new SimpleFileVisitor<Path>() { TreeNode current = root; @Override public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException { TreeNode treeNode = new TreeNode(); treeNode.setLeaf(false); treeNode.setName(dir.getFileName().toString()); treeNode.setFullPath(current.getFullPath() + "/" + dir.getFileName().toString()); treeNode.setChildren(new TreeSet<>()); treeNode.setParent(current); current.getChildren().add(treeNode); current = treeNode; return super.preVisitDirectory(dir, attrs); } @Override public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException { current = current.getParent(); return super.postVisitDirectory(dir, exc); } @Override public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException { TreeNode treeNode = new TreeNode(); treeNode.setLeaf(true); treeNode.setName(file.getFileName().toString()); treeNode.setFullPath(current.getFullPath() + "/" + file.getFileName().toString()); treeNode.setChildren(null); treeNode.setParent(current); current.getChildren().add(treeNode); return super.visitFile(file, attrs); } }); return root; } }