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();
}
}