static FileChangeListener removeFileChangeListenerImpl(Logger logger, FileChangeListener listener, File path) { assert path.equals(FileUtil.normalizeFile(path)) : "Need to normalize " + FileUtil.toDebugString(path) + "!"; logger.log(Level.FINE, "removeFileChangeListener {0} @ {1}", new Object[]{listener, path}); synchronized (holders) { Map<File, FileChangeImpl> f2H = holders.get(listener); if (f2H == null) { throw new IllegalArgumentException("Was not listening to " + path); } if (!f2H.containsKey(path)) { throw new IllegalArgumentException(listener + " was not listening to " + path + "; only to " + f2H.keySet()); } FileChangeImpl h = f2H.remove(path); if (f2H.isEmpty()) { holders.remove(listener); } h.run(); return h.get(); } }