public void testManyPointersUpdatePerformance() throws IOException { LoggingListener listener = new LoggingListener(); final List<VFileEvent> events = new ArrayList<VFileEvent>(); final File ioTempDir = createTempDirectory(); final VirtualFile temp = LocalFileSystem.getInstance().refreshAndFindFileByIoFile(ioTempDir); for (int i=0; i<100000; i++) { myVirtualFilePointerManager.create(VfsUtilCore.pathToUrl("/a/b/c/d/" + i), disposable, listener); events.add(new VFileCreateEvent(this, temp, "xxx" + i, false, true)); } PlatformTestUtil.startPerformanceTest("vfp update", 10000, new ThrowableRunnable() { @Override public void run() throws Throwable { for (int i=0; i<100; i++) { // simulate VFS refresh events since launching the actual refresh is too slow myVirtualFilePointerManager.before(events); myVirtualFilePointerManager.after(events); } } }).assertTiming(); }
public void testManyPointersUpdatePerformance() throws IOException { FilePointerPartNode.pushDebug(false, disposable); LoggingListener listener = new LoggingListener(); final List<VFileEvent> events = new ArrayList<VFileEvent>(); final File ioTempDir = createTempDirectory(); final VirtualFile temp = LocalFileSystem.getInstance().refreshAndFindFileByIoFile(ioTempDir); for (int i=0; i<100000; i++) { myVirtualFilePointerManager.create(VfsUtilCore.pathToUrl("/a/b/c/d/" + i), disposable, listener); events.add(new VFileCreateEvent(this, temp, "xxx" + i, false, true)); } PlatformTestUtil.startPerformanceTest("vfp update", 10000, new ThrowableRunnable() { @Override public void run() throws Throwable { for (int i=0; i<100; i++) { // simulate VFS refresh events since launching the actual refresh is too slow myVirtualFilePointerManager.before(events); myVirtualFilePointerManager.after(events); } } }).assertTiming(); }
@Override public void onFileCreate(VFileCreateEvent event, Facet facet) { String newFile = event.getPath(); Module module = facet.getModule(); ModifiableRootModel rootModel = ModuleRootManager.getInstance(module).getModifiableModel(); VirtualFile virtualFile = LocalFileSystem.getInstance().refreshAndFindFileByPath(newFile); ContentEntry contentEntry = getContentRootFor(virtualFile, rootModel); if (contentEntry != null) { contentEntry.addSourceFolder(virtualFile.getUrl(), false); rootModel.commit(); } else { ErrorDialog.showErrorDialog( module.getProject(), "Can't find Content Root", "Can't find Content Root for %s", virtualFile); } }
@Override public void onFileCreate(VFileCreateEvent event, Facet facet) { Project project = facet.getModule().getProject(); FileEditorManager fileEditorManager = FileEditorManager.getInstance(project); VirtualFile[] selectedFiles = fileEditorManager.getSelectedFiles(); if (selectedFiles.length != 1) { log( "Oh, dear. We have a new file in a Project View resource directory, but we have %d selected files", selectedFiles.length); ErrorDialog.showErrorDialog( project, "Error moving new file", "We have a new file in a Project View resource directory, but we have %d selected files and so don't know which BUCK file to examine", selectedFiles.length); return; // we are expecting a SINGLE file, here } VirtualFile selection = selectedFiles[0]; Editor editor = fileEditorManager.getSelectedTextEditor(); moveResourceFile(event.getPath(), project, selection, editor); }
private void _after( final List<? extends VFileEvent> events ) { if( _project.isDisposed() ) { return; } for( VFileEvent event : events ) { final VirtualFile file = event.getFile(); if( file != null ) { if( event instanceof VFileCreateEvent ) { fireCreatedEvent( file ); } else if( event instanceof VFileDeleteEvent ) { fireDeletedEvent( file ); } else if( event instanceof VFileCopyEvent ) { processFileCopyEvent( (VFileCopyEvent)event ); } else if( isMoveOrRename( event ) ) { processRenameAfter( event ); } else // modified { ApplicationManager.getApplication().runReadAction( () -> fireModifiedEvent( file ) ); } } } }
@Nullable private VirtualFileSystemEntry createAndFindChildWithEventFire(@NotNull String name, @NotNull NewVirtualFileSystem delegate) { final VirtualFile fake = new FakeVirtualFile(this, name); final FileAttributes attributes = delegate.getAttributes(fake); if (attributes == null) return null; final String realName = delegate.getCanonicallyCasedName(fake); final VFileCreateEvent event = new VFileCreateEvent(null, this, realName, attributes.isDirectory(), true); RefreshQueue.getInstance().processSingleEvent(event); return findChild(realName); }
@Override public void after(List<? extends VFileEvent> events) { if (!enabled) { return; } for (VFileEvent event : events) { VirtualFile modifiedFile = null; // Skip delete events. if (event instanceof VFileContentChangeEvent || event instanceof VFileCreateEvent) { modifiedFile = event.getFile(); } else if (event instanceof VFileCopyEvent) { VFileCopyEvent copyEvent = (VFileCopyEvent) event; modifiedFile = copyEvent.getNewParent(); } else if (event instanceof VFileMoveEvent) { VFileMoveEvent moveEvent = (VFileMoveEvent) event; modifiedFile = moveEvent.getNewParent(); } else if (event instanceof VFilePropertyChangeEvent) { VFilePropertyChangeEvent propEvent = (VFilePropertyChangeEvent) event; // Check for file renames (sometimes we get property change events without the name // actually changing though) if (propEvent.getPropertyName().equals(VirtualFile.PROP_NAME) && !propEvent.getOldValue().equals(propEvent.getNewValue())) { modifiedFile = propEvent.getFile(); } } if (SymbolTableProvider.isSourceFile(modifiedFile)) { queueChange(modifiedFile); } } }
@Nullable private VirtualFileSystemEntry createAndFindChildWithEventFire(@Nonnull String name, @Nonnull NewVirtualFileSystem delegate) { final VirtualFile fake = new FakeVirtualFile(this, name); final FileAttributes attributes = delegate.getAttributes(fake); if (attributes == null) return null; final String realName = delegate.getCanonicallyCasedName(fake); final VFileCreateEvent event = new VFileCreateEvent(null, this, realName, attributes.isDirectory(), true); RefreshQueue.getInstance().processSingleEvent(event); return findChild(realName); }
private static void checkSubscription() { if (ourSubscribed.getAndSet(true)) return; Application app = ApplicationManager.getApplication(); app.getMessageBus().connect(app).subscribe(VirtualFileManager.VFS_CHANGES, new BulkFileListener.Adapter() { @Override public void after(@NotNull List<? extends VFileEvent> events) { InvalidationState state = null; synchronized (ourLock) { for (VFileEvent event : events) { if (!(event.getFileSystem() instanceof LocalFileSystem)) continue; if (event instanceof VFileCreateEvent) continue; // created file should not invalidate + getFile is costly if (event instanceof VFilePropertyChangeEvent && !VirtualFile.PROP_NAME.equals(((VFilePropertyChangeEvent)event).getPropertyName())) { continue; } String path = event.getPath(); if (event instanceof VFilePropertyChangeEvent) { path = ((VFilePropertyChangeEvent)event).getOldPath(); } else if (event instanceof VFileMoveEvent) { path = ((VFileMoveEvent)event).getOldPath(); } VirtualFile file = event.getFile(); if (file == null || !file.isDirectory()) { state = InvalidationState.invalidate(state, path); } else { Collection<String> affectedPaths = ourDominatorsMap.get(path); if (affectedPaths != null) { affectedPaths = ContainerUtil.newArrayList(affectedPaths); // defensive copying; original may be updated on invalidation for (String affectedPath : affectedPaths) { state = InvalidationState.invalidate(state, affectedPath); } } } } } if (state != null) state.scheduleRefresh(); } }); }
public void processAfterVfsChanges(@NotNull List<? extends VFileEvent> events) { boolean pushedSomething = false; List<Runnable> delayedTasks = ContainerUtil.newArrayList(); for (VFileEvent event : events) { final VirtualFile file = event.getFile(); if (file == null) continue; final FilePropertyPusher[] pushers = file.isDirectory() ? myPushers : myFilePushers; if (pushers.length == 0) continue; if (event instanceof VFileCreateEvent) { if (!event.isFromRefresh() || !file.isDirectory()) { // push synchronously to avoid entering dumb mode in the middle of a meaningful write action // avoid dumb mode for just one file doPushRecursively(file, pushers, ProjectRootManager.getInstance(myProject).getFileIndex()); pushedSomething = true; } else if (!ProjectCoreUtil.isProjectOrWorkspaceFile(file)) { ContainerUtil.addIfNotNull(delayedTasks, createRecursivePushTask(file, pushers)); } } else if (event instanceof VFileMoveEvent) { for (FilePropertyPusher pusher : pushers) { file.putUserData(pusher.getFileDataKey(), null); } // push synchronously to avoid entering dumb mode in the middle of a meaningful write action doPushRecursively(file, pushers, ProjectRootManager.getInstance(myProject).getFileIndex()); pushedSomething = true; } } if (!delayedTasks.isEmpty()) { queueTasks(delayedTasks); } if (pushedSomething) { Application application = ApplicationManager.getApplication(); Runnable runnable = new Runnable() { @Override public void run() { scheduleDumbModeReindexingIfNeeded(); } }; if (application.isUnitTestMode()) { runnable.run(); } else { application.invokeLater(runnable); } } }
private static void checkSubscription() { if (ourSubscribed.getAndSet(true)) return; Application app = ApplicationManager.getApplication(); app.getMessageBus().connect(app).subscribe(VirtualFileManager.VFS_CHANGES, new BulkFileListener.Adapter() { @Override public void after(@Nonnull List<? extends VFileEvent> events) { InvalidationState state = null; synchronized (ourLock) { for (VFileEvent event : events) { if (!(event.getFileSystem() instanceof LocalFileSystem)) continue; if (event instanceof VFileCreateEvent) continue; // created file should not invalidate + getFile is costly if (event instanceof VFilePropertyChangeEvent && !VirtualFile.PROP_NAME.equals(((VFilePropertyChangeEvent)event).getPropertyName())) { continue; } String path = event.getPath(); if (event instanceof VFilePropertyChangeEvent) { path = ((VFilePropertyChangeEvent)event).getOldPath(); } else if (event instanceof VFileMoveEvent) { path = ((VFileMoveEvent)event).getOldPath(); } VirtualFile file = event.getFile(); if (file == null || !file.isDirectory()) { state = InvalidationState.invalidate(state, path); } else { Collection<String> affectedPaths = ourDominatorsMap.get(path); if (affectedPaths != null) { affectedPaths = ContainerUtil.newArrayList(affectedPaths); // defensive copying; original may be updated on invalidation for (String affectedPath : affectedPaths) { state = InvalidationState.invalidate(state, affectedPath); } } } } } if (state != null) state.scheduleRefresh(); } }); }
public void processAfterVfsChanges(@Nonnull List<? extends VFileEvent> events) { boolean pushedSomething = false; List<Runnable> delayedTasks = ContainerUtil.newArrayList(); for (VFileEvent event : events) { final VirtualFile file = event.getFile(); if (file == null) continue; final FilePropertyPusher[] pushers = file.isDirectory() ? myPushers : myFilePushers; if (pushers.length == 0) continue; if (event instanceof VFileCreateEvent) { if (!event.isFromRefresh() || !file.isDirectory()) { // push synchronously to avoid entering dumb mode in the middle of a meaningful write action // avoid dumb mode for just one file doPushRecursively(file, pushers, ProjectRootManager.getInstance(myProject).getFileIndex()); pushedSomething = true; } else if (!ProjectCoreUtil.isProjectOrWorkspaceFile(file)) { ContainerUtil.addIfNotNull(delayedTasks, createRecursivePushTask(file, pushers)); } } else if (event instanceof VFileMoveEvent) { for (FilePropertyPusher pusher : pushers) { file.putUserData(pusher.getFileDataKey(), null); } // push synchronously to avoid entering dumb mode in the middle of a meaningful write action doPushRecursively(file, pushers, ProjectRootManager.getInstance(myProject).getFileIndex()); pushedSomething = true; } } if (!delayedTasks.isEmpty()) { queueTasks(delayedTasks); } if (pushedSomething) { GuiUtils.invokeLaterIfNeeded(new Runnable() { @Override public void run() { PushedFilePropertiesUpdaterImpl.this.scheduleDumbModeReindexingIfNeeded(); } }, ModalityState.defaultModalityState()); } }
void onFileCreate(VFileCreateEvent event, Facet facet);