package de.saumya.mojo.jruby9; import java.io.File; import java.io.IOException; import java.nio.file.FileVisitResult; import java.nio.file.Path; import java.nio.file.SimpleFileVisitor; import java.nio.file.attribute.BasicFileAttributes; import java.util.HashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; import org.apache.commons.io.FileUtils; class JRubyDirectory extends SimpleFileVisitor<Path> { Map<Path, List<String>> dirs = new HashMap<Path,List<String>>(); private Path root; JRubyDirectory(Path root) { this.root = root; } @Override public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException { String name = dir.getParent().toFile().getName(); if ("jars".equals(name) || "META-INF".equals(name)) { return FileVisitResult.SKIP_SUBTREE; } add(dir); return FileVisitResult.CONTINUE; } @Override public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException { String name = file.toFile().getName(); if(name.endsWith(".class") || name.equals(".jrubydir") || (file.getParent().equals(root) && ("gems".equals(name) || "specifications".equals(name) || "jars".equals(name) || "jar-bootstrap.rb".equals(name)))) { return FileVisitResult.CONTINUE; } add(file); return FileVisitResult.CONTINUE; } private void add(Path file) { String name = file.toFile().getName(); List<String> dir = dirs.get(file.getParent()); if (dir == null) { dir = new LinkedList<String>(); dirs.put(file.getParent(), dir); } dir.add(name); } @Override public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException { File jrubyDir = dir.resolve(".jrubydir").toFile(); List<String> names = dirs.remove(dir); if (names != null) { StringBuilder content = new StringBuilder(".\n"); if (!dir.equals(root)) content.append("..\n"); for(String name: names) { content.append(name).append("\n"); } if (jrubyDir.exists()) { String old = FileUtils.readFileToString(jrubyDir); if (content.equals(old)) { return FileVisitResult.CONTINUE; } } FileUtils.write(jrubyDir, content); } return FileVisitResult.CONTINUE; } }