package org.jetbrains.ether; import java.io.File; import java.io.FileFilter; import java.io.FilenameFilter; import java.util.*; /** * Created by IntelliJ IDEA. * User: db * Date: 27.06.11 * Time: 21:03 * To change this template use File | Settings | File Templates. */ public class MockFS { final Map<java.io.File, File> myFiles = new HashMap<java.io.File, File>(); final File myRoot; private File getFile(java.io.File f) { if (f.getAbsolutePath().startsWith(myRoot.getAbsolutePath())) { File g = myFiles.get(f); if (g != null) { return g; } g = new File(f, false); myFiles.put(f, g); return g; } return null; } public class File extends java.io.File { final Set<File> mySubFiles = new HashSet<File>(); final File myParent; private File(final java.io.File file, final boolean root) { super(file.getPath()); if (root) { myParent = null; return; } final java.io.File parent = file.getParentFile(); myParent = parent == null ? null : getFile(parent); if (myParent != null) { myParent.mySubFiles.add(this); } } @Override public String[] list() { return list(new FilenameFilter() { public boolean accept(java.io.File dir, String name) { return true; } }); } @Override public String[] list(final FilenameFilter filter) { final List<String> result = new LinkedList<String>(); for (final File f : mySubFiles) { if (filter.accept(this, f.getName())) { result.add(f.getName()); } } return result.toArray(new String[result.size()]); } @Override public java.io.File[] listFiles() { return mySubFiles.toArray(new File[mySubFiles.size()]); } @Override public java.io.File[] listFiles(final FilenameFilter filter) { final List<File> result = new LinkedList<File>(); for (File f : mySubFiles) { if (filter.accept(this, f.getName())) { result.add(f); } } return result.toArray(new File[result.size()]); } @Override public java.io.File[] listFiles(final FileFilter filter) { final List<File> result = new LinkedList<File>(); for (File f : mySubFiles) { if (filter.accept(f)) { result.add(f); } } return result.toArray(new File[result.size()]); } } private MockFS(final String root) { final java.io.File rootFile = new java.io.File(root); myRoot = new File(rootFile, true); myFiles.put(rootFile, myRoot); } public static File fromFiles(final String root, final Collection<String> files) { final MockFS fs = new MockFS(root); for (String f : files) { fs.getFile(new java.io.File (f)); } return fs.myRoot; } }