List<VFileEvent> (@NotNull VFileEvent event, @NotNull List<? super Runnable> outApplyActions) { if (!(event instanceof VFileDeleteEvent || event instanceof VFileMoveEvent || event instanceof VFilePropertyChangeEvent propertyChangeEvent && VirtualFile.PROP_NAME.equals(propertyChangeEvent.getPropertyName()))) { return Collections.emptyList(); } String path; if (event instanceof VFilePropertyChangeEvent propertyChangeEvent) { path = propertyChangeEvent.getOldPath(); } else if (event instanceof VFileMoveEvent moveEvent) { path = moveEvent.getOldPath(); } else { path = event.getPath(); } VirtualFile file = event.getFile(); VirtualFileSystem entryFileSystem = file.getFileSystem(); VirtualFile local = null; if (entryFileSystem instanceof ArchiveFileSystem) { local = ((ArchiveFileSystem)entryFileSystem).getLocalByEntry(file); path = local == null ? getLocalPath((ArchiveFileSystem)entryFileSystem, path) : local.getPath(); } String[] jarPaths; synchronized (ourLock) { Set<String> handlers = ourDominatorsMap.get(path); if (handlers == null) { jarPaths = new String[] {path}; } else { jarPaths = ArrayUtil.toStringArray(handlers); } } List<VFileEvent> events = new ArrayList<>(jarPaths.length); for (String jarPath : jarPaths) { Pair<ArchiveFileSystem, ArchiveHandler> handlerPair = ourHandlerCache.get(jarPath); if (handlerPair == null) { continue; } if (entryFileSystem instanceof LocalFileSystem) { ArchiveFileSystem fileSystem = handlerPair.first; NewVirtualFile root = ManagingFS.getInstance().findRoot(fileSystem.composeRootPath(jarPath), fileSystem); if (root != null) { VFileDeleteEvent jarDeleteEvent = new VFileDeleteEvent(event.getRequestor(), root); Runnable runnable = () -> { Pair<ArchiveFileSystem, ArchiveHandler> pair = ourHandlerCache.remove(jarPath); if (pair != null) { pair.second.clearCaches(); synchronized (ourLock) { forEachDirectoryComponent(jarPath, containingDirectoryPath -> { Set<String> handlers = ourDominatorsMap.get(containingDirectoryPath); if (handlers != null && handlers.remove(jarPath) && handlers.isEmpty()) { ourDominatorsMap.remove(containingDirectoryPath); } }); } } }; events.add(jarDeleteEvent); outApplyActions.add(runnable); } } else if (local != null) { // for "delete jar://x.jar!/" generate "delete file://x.jar", but // for "delete jar://x.jar!/web.xml" generate "changed file://x.jar" VFileEvent localJarDeleteEvent = file.getParent() == null ? new VFileDeleteEvent(event.getRequestor(), local) : new VFileContentChangeEvent(event.getRequestor(), local, local.getModificationStamp(), local.getModificationStamp()); events.add(localJarDeleteEvent); } } return events; }