class DefaultIndexChangedListener implements IndexChangedListener {

    private static final Logger LOGGER = LoggerFactory.getLogger(DefaultIndexChangedListener.class);

    private final Map<String, Statistics> statMap = new ConcurrentHashMap<>();

    @Override
    public void fileAdd(String path, String analyzer) {
        if (LOGGER.isLoggable(Level.FINE)) {
            LOGGER.log(Level.FINE, "Add: ''{0}'' ({1})", new Object[]{path, analyzer});
        }
        statMap.put(path, new Statistics());
    }

    @Override
    public void fileRemove(String path) {
        LOGGER.log(Level.FINE, "Remove: ''{0}''", path);
    }

    @Override
    public void fileAdded(String path, String analyzer) {<FILL_FUNCTION_BODY>}

    @Override
    public void fileRemoved(String path) {
        LOGGER.log(Level.FINER, "Removed: ''{0}''", path);
    }
}

        Statistics stat = statMap.get(path);
        if (stat != null) {
            boolean loggingDone = stat.report(LOGGER, Level.FINEST, String.format("Added: '%s' (%s)", path, analyzer),
                    "indexer.file.add.latency");
            statMap.remove(path, stat);

            // The report() updated the meter, however might not have emitted the log message.
            // In such case allow it to fall through to the below log() statement.
            if (loggingDone) {
                return;
            }
        }

        if (LOGGER.isLoggable(Level.FINER)) {
            LOGGER.log(Level.FINER, "Added: ''{0}'' ({1})", new Object[]{path, analyzer});
        }
    
<no_super_class>