static void addFileChangeListenerImpl(Logger logger, FileChangeListener listener, File path) { assert FileUtil.assertNormalized(path); logger.log(Level.FINE, "addFileChangeListener {0} @ {1}", new Object[]{listener, path}); synchronized (holders) { Map<File, FileChangeImpl> f2H = holders.get(listener); if (f2H == null) { f2H = new HashMap<File, FileChangeImpl>(); holders.put(listener, f2H); } final FileChangeImpl prev = f2H.get(path); if (prev != null) { StringBuilder sb = new StringBuilder(); sb.append("Already listening to ").append(path); sb.append("\nnew listener : ").append(listener); sb.append("\nholder listener: ").append(prev.get()); throw new IllegalArgumentException(sb.toString()); } final FileChangeImpl holder = new FileChangeImpl(listener, path); f2H.put(path, holder); holder.locateCurrent(); } }