package tc.oc.pgm.development;
import java.util.Collection;
import java.util.logging.Handler;
import java.util.logging.Level;
import java.util.logging.LogRecord;
import javax.inject.Inject;
import javax.inject.Singleton;
import com.google.common.collect.ArrayListMultimap;
import com.google.common.collect.Multimap;
import tc.oc.commons.core.plugin.PluginFacet;
import tc.oc.commons.bukkit.logging.MapdevLogger;
import tc.oc.pgm.map.MapDefinition;
import tc.oc.pgm.map.MapLogRecord;
/**
* Log handler that collects map-related errors and indexes them by map
*/
@Singleton
public class MapErrorTracker extends Handler implements PluginFacet {
private final MapdevLogger mapdevLogger;
private Multimap<MapDefinition, MapLogRecord> errors = ArrayListMultimap.create();
@Inject MapErrorTracker(MapdevLogger mapdevLogger) {
this.mapdevLogger = mapdevLogger;
this.setLevel(Level.WARNING);
}
@Override
public void enable() {
mapdevLogger.addHandler(this);
}
public Multimap<MapDefinition, MapLogRecord> getErrors() {
return errors;
}
public void clearAllErrors() {
errors.clear();
}
public void clearErrors(MapDefinition map) {
errors.removeAll(map);
}
/**
* Clear errors for any maps NOT in the given set
*/
public void clearErrorsExcept(Collection<? extends MapDefinition> excepted) {
errors.keySet().retainAll(excepted);
}
@Override
public void publish(LogRecord record) {
if(record instanceof MapLogRecord && isLoggable(record)) {
MapLogRecord mapRecord = (MapLogRecord) record;
errors.put(mapRecord.getMap(), mapRecord);
}
}
@Override
public void close() throws SecurityException {
}
@Override
public void flush() {
}
}