KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > oddjob > jmx > client > RemoteLogPoller


1 /*
2  * (c) Rob Gordon 2005
3  */

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 /**
19  * A LogArchiver which maintains it's log archives by polling a JMX MBean for
20  * log information.
21  *
22  * @author Rob Gordon
23  */

24 public class RemoteLogPoller extends Thread JavaDoc
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     /**
35      * Constructor.
36      *
37      */

38     public RemoteLogPoller(Object JavaDoc root,
39             final int consoleHistoryLines, final int logHistoryLines) {
40         ConsoleArchiverCache consoleCache = new ConsoleArchiverCache(root,
41                 new ConsoleArchiverCache.Resolver() {
42                     public LogArchive archiveFor(Object JavaDoc component) {
43                         return new LogArchive(idFor(component),
44                                 consoleHistoryLines);
45                     }
46                     public String JavaDoc idFor(Object JavaDoc component) {
47                         return consoleArchiveFor(component);
48                     }
49                 }
50         );
51         
52         consoleArchiver = new AbstractPollingArchiver(consoleCache) {
53             public String JavaDoc archiveFor(Object JavaDoc component) {
54                 return consoleArchiveFor(component);
55             }
56             public LogEvent[] retrieveEvents(Object JavaDoc 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 JavaDoc loggerFor(Object JavaDoc component) {
67                         return logArchiveFor(component);
68                     }
69             });
70         
71         loggerArchiver = new AbstractPollingArchiver(loggerCache) {
72             public String JavaDoc archiveFor(Object JavaDoc component) {
73                 return logArchiveFor(component);
74             }
75             public LogEvent[] retrieveEvents(Object JavaDoc 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     /**
86      * Utility function to get the log archive name.
87      *
88      * @return The log archive name for the given component.
89      */

90     static String JavaDoc logArchiveFor(Object JavaDoc component) {
91         if (! (component instanceof LogPollable)) {
92             return null;
93         }
94         LogPollable pollable = (LogPollable) component;
95         String JavaDoc url = pollable.url();
96         if (url == null) {
97             throw new NullPointerException JavaDoc("[" + component + "] has no URL.");
98         }
99         String JavaDoc archive = LogHelper.getLogger(component);
100         if (archive == null) {
101             return null;
102         }
103         return url + archive;
104     }
105     
106     /**
107      * Utility function to get the console archive name.
108      *
109      * @return The console archive name for the given component.
110      */

111     static String JavaDoc consoleArchiveFor(Object JavaDoc component) {
112         if (! (component instanceof LogPollable)) {
113             return null;
114         }
115         LogPollable pollable = (LogPollable) component;
116         String JavaDoc url = pollable.url();
117         if (url == null) {
118             throw new NullPointerException JavaDoc("Proxy for [" + component + "] has no URL.");
119         }
120         String JavaDoc consoleId = pollable.consoleId();
121         if (consoleId == null) {
122             throw new NullPointerException JavaDoc("Proxy for [" + component + "] has no consoleId.");
123         }
124         return url + consoleId;
125     }
126     
127     /*
128      * (non-Javadoc)
129      * @see org.oddjob.logging.LogArchiver#addLogListener(org.oddjob.logging.LogListener, java.lang.Object, org.oddjob.logging.LogLevel, long, int)
130      */

131     public void addLogListener(LogListener l, Object JavaDoc component,
132             LogLevel level, long last, int max) {
133         loggerArchiver.addArchiveListener(l, component, level, last, max);
134     }
135     
136     /*
137      * (non-Javadoc)
138      * @see org.oddjob.logging.LogArchiver#removeLogListener(org.oddjob.logging.LogListener)
139      */

140     public void removeLogListener(LogListener l, Object JavaDoc component) {
141         loggerArchiver.removeArchiveListener(l, component);
142     }
143     
144     /* (non-Javadoc)
145      * @see org.oddjob.logging.ConsoleArchiver#addConsoleListener(org.oddjob.logging.LogListener, java.lang.Object, long, int)
146      */

147     public void addConsoleListener(LogListener l, Object JavaDoc component, long last,
148             int max) {
149         consoleArchiver.addArchiveListener(l, component, LogLevel.DEBUG, last, max);
150     }
151     
152     /* (non-Javadoc)
153      * @see org.oddjob.logging.ConsoleArchiver#removeConsoleListener(org.oddjob.logging.LogListener, java.lang.Object)
154      */

155     public void removeConsoleListener(LogListener l, Object JavaDoc component) {
156         consoleArchiver.removeArchiveListener(l, component);
157     }
158     
159     /* (non-Javadoc)
160      * @see org.oddjob.logging.ConsoleArchiver#consoleIdFor(java.lang.Object)
161      */

162     public String JavaDoc consoleIdFor(Object JavaDoc 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     /**
175      * Poll a remote MBean for Log Messages.
176      *
177      */

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 JavaDoc e) {
191                     return;
192                 }
193             }
194         }
195         
196     }
197     
198     public void destroy() {
199         consoleArchiver.destroy();
200         loggerArchiver.poll();
201     }
202 }
203
Popular Tags