@Override public FilePathMem getPath(String path) { FilePathMem p = new FilePathMem(); p.name = getCanonicalPath(path); return p; }
@Override public boolean createFile() { synchronized (MEMORY_FILES) { if (exists()) { return false; } getMemoryFile(); } return true; }
@Override public FilePathMem getParent() { int idx = name.lastIndexOf('/'); return idx < 0 ? null : getPath(name.substring(0, idx)); }
@Override public long size() { return getMemoryFile().length(); }
@Override public void delete() { if (isRoot()) { return; } synchronized (MEMORY_FILES) { MEMORY_FILES.remove(name); } }
private boolean isRoot() { return name.equals(getScheme() + ":"); }
@Override public void createDirectory() { if (exists()) { throw DbException.get(ErrorCode.FILE_CREATION_FAILED_1, name + " (a file with this name already exists)"); } synchronized (MEMORY_FILES) { MEMORY_FILES.put(name, DIRECTORY); } }
private FileMemData getMemoryFile() { synchronized (MEMORY_FILES) { FileMemData m = MEMORY_FILES.get(name); if (m == DIRECTORY) { throw DbException.get(ErrorCode.FILE_CREATION_FAILED_1, name + " (a directory with this name already exists)"); } if (m == null) { m = new FileMemData(name, compressed()); MEMORY_FILES.put(name, m); } return m; } }
@Override public FileChannel open(String mode) { FileMemData obj = getMemoryFile(); return new FileMem(obj, "r".equals(mode)); }
@Override public boolean isDirectory() { if (isRoot()) { return true; } synchronized (MEMORY_FILES) { FileMemData d = MEMORY_FILES.get(name); return d == DIRECTORY; } }
@Override public boolean setReadOnly() { return getMemoryFile().setReadOnly(); }
@Override public boolean exists() { if (isRoot()) { return true; } synchronized (MEMORY_FILES) { return MEMORY_FILES.get(name) != null; } }
@Override public List<FilePath> newDirectoryStream() { ArrayList<FilePath> list = new ArrayList<>(); synchronized (MEMORY_FILES) { for (String n : MEMORY_FILES.tailMap(name).keySet()) { if (n.startsWith(name)) { if (!n.equals(name) && n.indexOf('/', name.length() + 1) < 0) { list.add(getPath(n)); } } else { break; } } return list; } }
@Override public long lastModified() { return getMemoryFile().getLastModified(); }
@Override public boolean canWrite() { return getMemoryFile().canWrite(); }
@Override public void moveTo(FilePath newName, boolean atomicReplace) { synchronized (MEMORY_FILES) { if (!atomicReplace && !newName.name.equals(name) && MEMORY_FILES.containsKey(newName.name)) { throw DbException.get(ErrorCode.FILE_RENAME_FAILED_2, new String[] { name, newName + " (exists)" }); } FileMemData f = getMemoryFile(); f.setName(newName.name); MEMORY_FILES.remove(name); MEMORY_FILES.put(newName.name, f); } }
@Override public InputStream newInputStream() { FileMemData obj = getMemoryFile(); FileMem m = new FileMem(obj, true); return new FileChannelInputStream(m, true); }
@Override public OutputStream newOutputStream(boolean append) throws IOException { FileMemData obj = getMemoryFile(); FileMem m = new FileMem(obj, false); return new FileChannelOutputStream(m, append); }