001: package net.suberic.pooka;
002:
003: import net.suberic.util.*;
004:
005: import java.util.logging.*;
006: import java.util.*;
007:
008: /**
009: * This class manages logging for Pooka. It basically provides a bridge
010: * between Pooka configuration files and the JDK 1.4 Logging system.
011: */
012:
013: public class PookaLogManager implements ValueChangeListener {
014:
015: // the logging strings that we're currently monitoring
016: Set mMonitoredLogStrings = null;
017:
018: // the default list of log settings we monitor
019: String[] mDefaultLogSettings = new String[] { "Pooka.debug",
020: "Pooka.debug.session", "editors.debug", "Pooka.debug.gui",
021: "Pooka.debug.gui.focus", "Pooka.debug.gui.filechooser",
022: "Pooka.debug.folderTracker", "Pooka.debug.logManager",
023: "Pooka.debug.startupManager", "Pooka.debug.messaging" };
024:
025: /**
026: * Constructor. Sets itself as a valueChangeListener for all of the
027: * log settings configured.
028: */
029: public PookaLogManager() {
030: VariableBundle globalBundle = Pooka.getResources();
031: mMonitoredLogStrings = new HashSet(Arrays
032: .asList(mDefaultLogSettings));
033:
034: Iterator it = mMonitoredLogStrings.iterator();
035: while (it.hasNext()) {
036: globalBundle.addValueChangeListener(this , (String) it
037: .next()
038: + ".logLevel");
039: }
040:
041: refresh();
042:
043: configureListeners();
044:
045: // set up logging to log all messages. stupid.
046: Logger global = Logger.getLogger("");
047: Handler[] globalHandlers = global.getHandlers();
048: for (int i = 0; i < globalHandlers.length; i++) {
049: globalHandlers[i].setLevel(Level.ALL);
050: }
051: }
052:
053: /**
054: * Refreshes all logging states from the current configuration.
055: */
056: public void refresh() {
057: Iterator it = mMonitoredLogStrings.iterator();
058: while (it.hasNext()) {
059: String current = (String) it.next();
060: refresh(current);
061: }
062: }
063:
064: /**
065: * Refreshes the logging state for the given property.
066: */
067: public void refresh(String pKey) {
068: String levelKey = Pooka.getProperty(pKey + ".logLevel",
069: "DEFAULT");
070: Level newLevel = null;
071: if (levelKey == null || levelKey.equals("")
072: || levelKey.equalsIgnoreCase("DEFAULT")) {
073: newLevel = null;
074: } else {
075: newLevel = Level.parse(levelKey);
076: }
077: getLogger().log(Level.FINE,
078: "set log level for " + pKey + " to " + newLevel);
079: setLogLevel(pKey, newLevel);
080:
081: }
082:
083: /**
084: * Sets up additional listeners.
085: */
086: public void configureListeners() {
087: // focus listener
088: java.awt.KeyboardFocusManager mgr = java.awt.KeyboardFocusManager
089: .getCurrentKeyboardFocusManager();
090: mgr
091: .addPropertyChangeListener(new java.beans.PropertyChangeListener() {
092: public void propertyChange(
093: java.beans.PropertyChangeEvent evt) {
094: Logger logger = Logger
095: .getLogger("Pooka.debug.gui.focus");
096: Level logLevel = Level.FINEST;
097: if (evt.getPropertyName().equalsIgnoreCase(
098: "permanentFocusOwner")) {
099: logLevel = Level.FINE;
100: } else if (evt.getPropertyName()
101: .equalsIgnoreCase("focusOwner")
102: || evt.getPropertyName()
103: .equalsIgnoreCase("focusOwner")) {
104: logLevel = Level.FINER;
105: }
106: String oldValue = "null";
107: String newValue = "null";
108: if (evt.getOldValue() != null) {
109: oldValue = evt.getOldValue().getClass()
110: .getName();
111: }
112: if (evt.getNewValue() != null) {
113: newValue = evt.getNewValue().getClass()
114: .getName();
115: }
116: logger.log(logLevel, evt.getPropertyName()
117: + ": oldValue=" + oldValue
118: + "; newValue=" + newValue);
119:
120: }
121: });
122:
123: }
124:
125: /**
126: * Sets the appropriate log setting.
127: */
128: public void setLogLevel(String pName, Level pLogLevel) {
129: Logger current = Logger.getLogger(pName);
130: if (current.getLevel() != pLogLevel) {
131: current.setLevel(pLogLevel);
132:
133: }
134:
135: if (pName == "Pooka.debug") {
136: setLogLevel("", pLogLevel);
137: }
138:
139: }
140:
141: // ValueChangeListener
142: /**
143: * Responds to a change in a configured value.
144: */
145: public void valueChanged(String pChangedValue) {
146: String key = pChangedValue;
147: // this should always end with .logLevel.
148: if (pChangedValue.endsWith(".logLevel")) {
149: key = pChangedValue
150: .substring(0, pChangedValue.length() - 9);
151: }
152:
153: refresh(key);
154: }
155:
156: /**
157: * Adds a logger for us to watch over.
158: */
159: public void addLogger(String pKey) {
160: if (!mMonitoredLogStrings.contains(pKey)) {
161: mMonitoredLogStrings.add(pKey);
162: Pooka.getResources().addValueChangeListener(this ,
163: pKey + ".logLevel");
164: String levelKey = Pooka.getProperty(pKey + ".logLevel",
165: "DEFAULT");
166: Level newLevel = null;
167: if (levelKey == null || levelKey.equals("")
168: || levelKey.equalsIgnoreCase("DEFAULT")) {
169: newLevel = null;
170: } else {
171: newLevel = Level.parse(levelKey);
172: }
173: setLogLevel(pKey, newLevel);
174: getLogger().log(Level.FINE,
175: "added key " + pKey + "; set value to " + newLevel);
176: }
177: }
178:
179: /**
180: * Removes a logger from the monitored list.
181: */
182: public void removeLogger(String pKey) {
183: if (mMonitoredLogStrings.contains(pKey)) {
184: mMonitoredLogStrings.remove(pKey);
185: Pooka.getResources().removeValueChangeListener(this ,
186: pKey + ".logLevel");
187: getLogger().log(Level.FINE, "removed key " + pKey);
188: }
189: }
190:
191: /**
192: * Gets the logger for this class.
193: */
194: public Logger getLogger() {
195: return Logger.getLogger("Pooka.debug.logManager");
196: }
197: }
|