1 4 package org.oddjob.jmx.client; 5 6 import org.apache.log4j.Logger; 7 import org.oddjob.logging.AbstractPollingArchiver; 8 import org.oddjob.logging.ConsoleArchiver; 9 import org.oddjob.logging.ConsoleArchiverCache; 10 import org.oddjob.logging.LogArchive; 11 import org.oddjob.logging.LogArchiver; 12 import org.oddjob.logging.LogArchiverCache; 13 import org.oddjob.logging.LogHelper; 14 import org.oddjob.logging.LogEvent; 15 import org.oddjob.logging.LogLevel; 16 import org.oddjob.logging.LogListener; 17 18 24 public class RemoteLogPoller extends Thread 25 implements LogArchiver, ConsoleArchiver { 26 private static final Logger logger = Logger.getLogger(RemoteLogPoller.class); 27 28 private final AbstractPollingArchiver consoleArchiver; 29 30 private final AbstractPollingArchiver loggerArchiver; 31 32 private long logPollingInterval; 33 34 38 public RemoteLogPoller(Object root, 39 final int consoleHistoryLines, final int logHistoryLines) { 40 ConsoleArchiverCache consoleCache = new ConsoleArchiverCache(root, 41 new ConsoleArchiverCache.Resolver() { 42 public LogArchive archiveFor(Object component) { 43 return new LogArchive(idFor(component), 44 consoleHistoryLines); 45 } 46 public String idFor(Object component) { 47 return consoleArchiveFor(component); 48 } 49 } 50 ); 51 52 consoleArchiver = new AbstractPollingArchiver(consoleCache) { 53 public String archiveFor(Object component) { 54 return consoleArchiveFor(component); 55 } 56 public LogEvent[] retrieveEvents(Object component, long last, 57 int max) { 58 logger.debug("Retrieving console events for [" + component + "]"); 59 LogPollable pollable = (LogPollable) component; 60 return pollable.retrieveConsoleEvents(last, max); 61 } 62 }; 63 64 LogArchiverCache loggerCache = new LogArchiverCache(root, logHistoryLines, 65 new LogArchiverCache.Resolver() { 66 public String loggerFor(Object component) { 67 return logArchiveFor(component); 68 } 69 }); 70 71 loggerArchiver = new AbstractPollingArchiver(loggerCache) { 72 public String archiveFor(Object component) { 73 return logArchiveFor(component); 74 } 75 public LogEvent[] retrieveEvents(Object component, long last, 76 int max) { 77 logger.debug("Retrieving log events for [" + component + "]"); 78 LogPollable pollable = (LogPollable) component; 79 return pollable.retrieveLogEvents(last, max); 80 } 81 }; 82 83 } 84 85 90 static String logArchiveFor(Object component) { 91 if (! (component instanceof LogPollable)) { 92 return null; 93 } 94 LogPollable pollable = (LogPollable) component; 95 String url = pollable.url(); 96 if (url == null) { 97 throw new NullPointerException ("[" + component + "] has no URL."); 98 } 99 String archive = LogHelper.getLogger(component); 100 if (archive == null) { 101 return null; 102 } 103 return url + archive; 104 } 105 106 111 static String consoleArchiveFor(Object component) { 112 if (! (component instanceof LogPollable)) { 113 return null; 114 } 115 LogPollable pollable = (LogPollable) component; 116 String url = pollable.url(); 117 if (url == null) { 118 throw new NullPointerException ("Proxy for [" + component + "] has no URL."); 119 } 120 String consoleId = pollable.consoleId(); 121 if (consoleId == null) { 122 throw new NullPointerException ("Proxy for [" + component + "] has no consoleId."); 123 } 124 return url + consoleId; 125 } 126 127 131 public void addLogListener(LogListener l, Object component, 132 LogLevel level, long last, int max) { 133 loggerArchiver.addArchiveListener(l, component, level, last, max); 134 } 135 136 140 public void removeLogListener(LogListener l, Object component) { 141 loggerArchiver.removeArchiveListener(l, component); 142 } 143 144 147 public void addConsoleListener(LogListener l, Object component, long last, 148 int max) { 149 consoleArchiver.addArchiveListener(l, component, LogLevel.DEBUG, last, max); 150 } 151 152 155 public void removeConsoleListener(LogListener l, Object component) { 156 consoleArchiver.removeArchiveListener(l, component); 157 } 158 159 162 public String consoleIdFor(Object component) { 163 return consoleArchiver.archiveFor(component); 164 } 165 166 public long getLogPollingInterval() { 167 return logPollingInterval; 168 } 169 170 public void setLogPollingInterval(long logPollingInterval) { 171 this.logPollingInterval = logPollingInterval; 172 } 173 174 178 public void poll() { 179 consoleArchiver.poll(); 180 loggerArchiver.poll(); 181 } 182 183 public void run() { 184 while (!isInterrupted()) { 185 poll(); 186 synchronized (this) { 187 try { 188 wait(logPollingInterval); 189 } 190 catch (InterruptedException e) { 191 return; 192 } 193 } 194 } 195 196 } 197 198 public void destroy() { 199 consoleArchiver.destroy(); 200 loggerArchiver.poll(); 201 } 202 } 203 | Popular Tags |