1 4 package org.oddjob.logging; 5 6 import java.util.HashMap ; 7 import java.util.HashSet ; 8 import java.util.Iterator ; 9 import java.util.Map ; 10 import java.util.Set ; 11 12 import org.apache.log4j.Logger; 13 14 25 abstract public class AbstractPollingArchiver { 26 private static final Logger logger = Logger.getLogger(AbstractPollingArchiver.class); 27 28 29 private final AbstractArchiverCache cache; 30 31 32 private final Map components = new HashMap (); 33 34 35 private SimpleCounter listenerCounter = new SimpleCounter(); 36 37 41 public AbstractPollingArchiver(AbstractArchiverCache cache) { 42 this.cache = cache; 43 } 44 45 54 public void addArchiveListener(LogListener l, Object component, 55 LogLevel level, long last, int max) { 56 String archive = archiveFor(component); 57 logger.debug("Adding LogListener for [" + archive + "]"); 58 if (archive == null) { 59 l.logEvent(AbstractArchiverCache.NO_LOG_AVAILABLE); 60 return; 61 } 62 synchronized (components) { 63 components.put(component, archive); 64 listenerCounter.add(component); 65 cache.addLogListener(l, archive, 66 level, last, max); 67 } 68 } 69 70 76 public void removeArchiveListener(LogListener l, final Object component) { 77 synchronized (components) { 78 String archive = (String ) components.get(component); 79 if (archive == null) { 80 return; 81 } 82 if (cache.removeLogListener(l, archive)) { 83 listenerCounter.remove(component, new Runnable () { 88 public void run() { 89 components.remove(component); 90 } 91 }); 92 } 93 } 94 } 95 96 abstract public String archiveFor(Object component); 97 98 102 public void poll() { 103 synchronized (components) { 104 Set polled = new HashSet (); 105 for (Iterator it = components.entrySet().iterator(); it.hasNext(); ) { 106 Map.Entry entry = (Map.Entry ) it.next(); 107 Object component = entry.getKey(); 108 String archive = (String ) entry.getValue(); 109 if (polled.contains(archive)) { 112 continue; 113 } 114 LogEvent[] events = null; 115 try { 116 events = retrieveEvents(component, 119 cache.getLastMessageNumber(archive), 120 cache.getMaxHistory()); 121 } catch (Exception e) { 122 logger.debug("Failed to retrieve events for [" + component + "]", e); 123 continue; 124 } 125 for (int i = 0; i < events.length; ++i) { 126 cache.addEvent(archive, events[i].getLevel(), events[i].getMessage()); 127 } 128 polled.add(archive); 129 } 130 } 131 } 132 133 public abstract LogEvent[] retrieveEvents(Object component, long last, int max); 134 135 public void destroy() { 136 cache.destroy(); 137 } 138 } 139
| Popular Tags
|