private static void removeIdFromParentList( final int parentId, final int id, @NotNull VirtualFile parent, VirtualFile file) { int[] childList = FSRecords.list(parentId); int index = ArrayUtil.indexOf(childList, id); if (index == -1) { throw new RuntimeException( "Cannot find child (" + id + ")" + file + "\n\tin (" + parentId + ")" + parent + "\n\tactual children:" + Arrays.toString(childList)); } childList = ArrayUtil.remove(childList, index); FSRecords.updateList(parentId, childList); }
private void assertEvent(Class<? extends VFileEvent> type, String... paths) { List<VFileEvent> events = getEvents(type.getSimpleName(), null); assertEquals(events.toString(), paths.length, events.size()); Set<String> pathSet = ContainerUtil.map2Set( paths, new Function<String, String>() { @Override public String fun(final String path) { return FileUtil.toSystemIndependentName(path); } }); for (VFileEvent event : events) { assertTrue(event.toString(), type.isInstance(event)); VirtualFile eventFile = event.getFile(); assertNotNull(event.toString(), eventFile); assertTrue( eventFile + " not in " + Arrays.toString(paths), pathSet.remove(eventFile.getPath())); } }
public void scan() { final NewVirtualFile root = (NewVirtualFile) myRefreshRoot; NewVirtualFileSystem delegate = root.getFileSystem(); if (root.isDirty() && !delegate.exists(root)) { scheduleDeletion(root); root.markClean(); } else { if (delegate.getProtocol().equals(LocalFileSystem.PROTOCOL) && root.isDirectory() && Registry.is("filesystem.useNative")) { if (SystemInfo.isWindows && Win32LocalFileSystem.isAvailable()) { delegate = Win32LocalFileSystem.getWin32Instance(); } } final PersistentFS persistence = (PersistentFS) ManagingFS.getInstance(); while (!myRefreshQueue.isEmpty()) { final VirtualFileSystemEntry file = (VirtualFileSystemEntry) myRefreshQueue.pullFirst(); if (!file.isDirty()) continue; if (file.isDirectory()) { VirtualDirectoryImpl dir = (VirtualDirectoryImpl) file; final boolean fullSync = dir.allChildrenLoaded(); if (fullSync) { Set<String> currentNames = new HashSet<String>(Arrays.asList(persistence.list(file))); Set<String> uptodateNames = new HashSet<String>(Arrays.asList(VfsUtil.filterNames(delegate.list(file)))); Set<String> newNames = new HashSet<String>(uptodateNames); newNames.removeAll(currentNames); Set<String> deletedNames = new HashSet<String>(currentNames); deletedNames.removeAll(uptodateNames); for (String name : deletedNames) { scheduleDeletion(file.findChild(name)); } for (String name : newNames) { boolean isDirectory = delegate.isDirectory(new FakeVirtualFile(file, name)); scheduleCreation(file, name, isDirectory); } for (VirtualFile child : file.getChildren()) { if (!deletedNames.contains(child.getName())) { scheduleChildRefresh(file, child, delegate); } } } else { for (VirtualFile child : file.getCachedChildren()) { if (delegate.exists(child)) { scheduleChildRefresh(file, child, delegate); } else { scheduleDeletion(child); } } final List<String> names = dir.getSuspiciousNames(); for (String name : names) { if (name.length() == 0) continue; final VirtualFile fake = new FakeVirtualFile(file, name); if (delegate.exists(fake)) { scheduleCreation(file, name, delegate.isDirectory(fake)); } } } } else { long currentTimestamp = persistence.getTimeStamp(file); long updtodateTimestamp = delegate.getTimeStamp(file); if (currentTimestamp != updtodateTimestamp) { scheduleUpdateContent(file); } } boolean currentWritable = persistence.isWritable(file); boolean uptodateWritable = delegate.isWritable(file); if (currentWritable != uptodateWritable) { scheduleWritableAttributeChange(file, currentWritable, uptodateWritable); } file.markClean(); } } }