package net.varkhan.base.management.logging; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; /** * <b>A log writer that dispatches log events according to key prefix.</b> * <p/> * * @author varkhan * @date Nov 25, 2010 * @time 11:05:34 PM * * @param <T> the event type */ public class LogDispatchPrefix<T> implements LogWriter<T> { private final ConcurrentMap<String,LogWriter<T>> dsp = new ConcurrentHashMap<String,LogWriter<T>>(); public LogDispatchPrefix() { } public LogDispatchPrefix(Map<String,LogWriter<T>> dsp) { this.dsp.putAll(dsp); } public void log(String ctx, String key, int lev, long tms, T msg) { final LogWriter<T> wrt=get(key); if(wrt!=null) wrt.log(ctx, key, lev, tms, msg); } public void log(String ctx, String key, int lev, long tms, double val, T msg) { final LogWriter<T> wrt=get(key); if(wrt!=null) wrt.log(ctx, key, lev, tms, val, msg); } public void log(LogEvent<T> evt) { final LogWriter<T> wrt=get(evt.getKey()); if(wrt!=null) wrt.log(evt); } public void log(Iterable<LogEvent<T>> evts) { for(LogEvent<T> evt: evts) log(evt); } public void flush() { for(LogWriter<T> wrt: dsp.values()) wrt.flush(); } protected LogWriter<T> get(String key) { // Attempt to find exact key LogWriter<T> wrt=dsp.get(key); if(wrt!=null) return wrt; // Search for dot-delimited prefixes of the key int dot=key.lastIndexOf('.'); while(dot>0) { dot--; String sk=key.substring(0, dot); wrt=dsp.get(sk); if(wrt!=null) return wrt; dot=key.lastIndexOf('.', dot); } // No more dots in key, look for empty key return dsp.get(""); } public void set(String key, LogWriter<T> wrt) { this.dsp.put(key,wrt); } public void del(String key) { this.dsp.remove(key); } }