1 52 53 package com.go.trove.log; 54 55 import java.io.*; 56 import java.util.*; 57 import java.lang.ref.WeakReference ; 58 59 106 public class Log implements LogListener, Serializable { 107 private static final int ENABLED_MASK = 0x01; 108 private static final int DEBUG_ENABLED_MASK = 0x02; 109 private static final int INFO_ENABLED_MASK = 0x04; 110 private static final int WARN_ENABLED_MASK = 0x08; 111 private static final int ERROR_ENABLED_MASK = 0x10; 112 113 private final transient PrintWriter mDebug; 114 private final transient PrintWriter mInfo; 115 private final transient PrintWriter mWarn; 116 private final transient PrintWriter mError; 117 118 private Log mParent; 119 private Collection mChildren = new Vector(); 120 private String mName; 121 private String mDescription; 122 private int mEnabledFlags = 0xfffffff; 123 private transient List mListeners = new Vector(); 124 125 134 public Log(String name, Log parent) { 135 this(); 136 137 if (parent != null) { 138 mParent = parent; 139 parent.mChildren.add(new WeakReference (this)); 140 mEnabledFlags = parent.mEnabledFlags; 141 addLogListener(parent); 142 } 143 144 mName = name; 145 mDescription = name; 146 } 147 148 private Log() { 149 LogEventParsingWriter writer; 150 151 writer = new LogEventParsingWriter(this, LogEvent.DEBUG_TYPE, this) { 152 public boolean isEnabled() { 153 return isDebugEnabled(); 154 } 155 }; 156 writer.addLogListener(this); 157 mDebug = new PrintWriter(writer, true); 158 159 writer = new LogEventParsingWriter(this, LogEvent.INFO_TYPE, this) { 160 public boolean isEnabled() { 161 return isInfoEnabled(); 162 } 163 }; 164 writer.addLogListener(this); 165 mInfo = new PrintWriter(writer, true); 166 167 writer = new LogEventParsingWriter(this, LogEvent.WARN_TYPE, this) { 168 public boolean isEnabled() { 169 return isWarnEnabled(); 170 } 171 }; 172 writer.addLogListener(this); 173 mWarn = new PrintWriter(writer, true); 174 175 writer = new LogEventParsingWriter(this, LogEvent.ERROR_TYPE, this) { 176 public boolean isEnabled() { 177 return isErrorEnabled(); 178 } 179 }; 180 writer.addLogListener(this); 181 mError = new PrintWriter(writer, true); 182 } 183 184 187 public void addRootLogListener(LogListener listener) { 188 if (mParent == null) { 189 addLogListener(listener); 190 } 191 else { 192 mParent.addRootLogListener(listener); 193 } 194 } 195 196 public void removeRootLogListener(LogListener listener) { 197 mListeners.remove(listener); 198 if (mParent == null) { 199 removeLogListener(listener); 200 } 201 else { 202 mParent.removeRootLogListener(listener); 203 } 204 } 205 206 public void addLogListener(LogListener listener) { 207 mListeners.add(listener); 208 } 209 210 public void removeLogListener(LogListener listener) { 211 mListeners.remove(listener); 212 } 213 214 218 public void logMessage(LogEvent e) { 219 if (isEnabled()) { 220 dispatchLogMessage(e); 221 } 222 } 223 224 228 public void logException(LogEvent e) { 229 if (isEnabled()) { 230 dispatchLogException(e); 231 } 232 } 233 234 private void dispatchLogMessage(LogEvent e) { 235 int size = mListeners.size(); 236 try { 237 for (int i=0; i<size; i++) { 238 ((LogListener)mListeners.get(i)).logMessage(e); 239 } 240 } 241 catch (IndexOutOfBoundsException ex) { 242 } 243 } 244 245 private void dispatchLogException(LogEvent e) { 246 int size = mListeners.size(); 247 try { 248 for (int i=0; i<size; i++) { 249 ((LogListener)mListeners.get(i)).logException(e); 250 } 251 } 252 catch (IndexOutOfBoundsException ex) { 253 } 254 } 255 256 259 public PrintWriter debug() { 260 return mDebug; 261 } 262 263 266 public synchronized void debug(String s) { 267 if (isEnabled() && isDebugEnabled()) { 268 dispatchLogMessage(new LogEvent(this, LogEvent.DEBUG_TYPE, s)); 269 } 270 } 271 272 275 public synchronized void debug(Throwable t) { 276 if (isEnabled() && isDebugEnabled()) { 277 dispatchLogException(new LogEvent(this, LogEvent.DEBUG_TYPE, t)); 278 } 279 } 280 281 284 public PrintWriter info() { 285 return mInfo; 286 } 287 288 291 public synchronized void info(String s) { 292 if (isEnabled() && isInfoEnabled()) { 293 dispatchLogMessage(new LogEvent(this, LogEvent.INFO_TYPE, s)); 294 } 295 } 296 297 300 public synchronized void info(Throwable t) { 301 if (isEnabled() && isInfoEnabled()) { 302 dispatchLogException(new LogEvent(this, LogEvent.INFO_TYPE, t)); 303 } 304 } 305 306 309 public PrintWriter warn() { 310 return mWarn; 311 } 312 313 316 public synchronized void warn(String s) { 317 if (isEnabled() && isWarnEnabled()) { 318 dispatchLogMessage(new LogEvent(this, LogEvent.WARN_TYPE, s)); 319 } 320 } 321 322 325 public synchronized void warn(Throwable t) { 326 if (isEnabled() && isWarnEnabled()) { 327 dispatchLogException(new LogEvent(this, LogEvent.WARN_TYPE, t)); 328 } 329 } 330 331 334 public PrintWriter error() { 335 return mError; 336 } 337 338 341 public synchronized void error(String s) { 342 if (isEnabled() && isErrorEnabled()) { 343 dispatchLogMessage(new LogEvent(this, LogEvent.ERROR_TYPE, s)); 344 } 345 } 346 347 350 public synchronized void error(Throwable t) { 351 if (isEnabled() && isErrorEnabled()) { 352 dispatchLogException(new LogEvent(this, LogEvent.ERROR_TYPE, t)); 353 } 354 } 355 356 359 public Log[] getChildren() { 360 Collection copy; 361 362 synchronized (mChildren) { 363 copy = new ArrayList(mChildren.size()); 364 Iterator it = mChildren.iterator(); 365 while (it.hasNext()) { 366 Log child = (Log)((WeakReference )it.next()).get(); 367 if (child == null) { 368 it.remove(); 369 } 370 else { 371 copy.add(child); 372 } 373 } 374 } 375 376 return (Log[])copy.toArray(new Log[copy.size()]); 377 } 378 379 382 public String getName() { 383 return mName; 384 } 385 386 389 public String getDescription() { 390 return mDescription; 391 } 392 393 396 public void setDescription(String desc) { 397 mDescription = desc; 398 } 399 400 404 public boolean isEnabled() { 405 return isEnabled(ENABLED_MASK); 406 } 407 408 412 public synchronized void setEnabled(boolean enabled) { 413 setEnabled(enabled, ENABLED_MASK); 414 if (enabled) { 415 Log parent; 416 if ((parent = mParent) != null) { 417 parent.setEnabled(true); 418 } 419 } 420 } 421 422 427 public boolean isDebugEnabled() { 428 return isEnabled(DEBUG_ENABLED_MASK); 429 } 430 431 435 public synchronized void setDebugEnabled(boolean enabled) { 436 setEnabled(enabled, DEBUG_ENABLED_MASK); 437 if (enabled) { 438 setEnabled(true); 439 } 440 } 441 442 447 public boolean isInfoEnabled() { 448 return isEnabled(INFO_ENABLED_MASK); 449 } 450 451 455 public synchronized void setInfoEnabled(boolean enabled) { 456 setEnabled(enabled, INFO_ENABLED_MASK); 457 if (enabled) { 458 setEnabled(true); 459 } 460 } 461 462 467 public boolean isWarnEnabled() { 468 return isEnabled(WARN_ENABLED_MASK); 469 } 470 471 475 public synchronized void setWarnEnabled(boolean enabled) { 476 setEnabled(enabled, WARN_ENABLED_MASK); 477 if (enabled) { 478 setEnabled(true); 479 } 480 } 481 482 487 public boolean isErrorEnabled() { 488 return isEnabled(ERROR_ENABLED_MASK); 489 } 490 491 495 public synchronized void setErrorEnabled(boolean enabled) { 496 setEnabled(enabled, ERROR_ENABLED_MASK); 497 if (enabled) { 498 setEnabled(true); 499 } 500 } 501 502 514 public synchronized void applyProperties(Map properties) { 515 if (properties.containsKey("enabled")) { 516 setEnabled(!"false".equalsIgnoreCase 517 ((String )properties.get("enabled"))); 518 } 519 520 if (properties.containsKey("debug")) { 521 setDebugEnabled(!"false".equalsIgnoreCase 522 ((String )properties.get("debug"))); 523 } 524 525 if (properties.containsKey("info")) { 526 setInfoEnabled(!"false".equalsIgnoreCase 527 ((String )properties.get("info"))); 528 } 529 530 if (properties.containsKey("warn")) { 531 setWarnEnabled(!"false".equalsIgnoreCase 532 ((String )properties.get("warn"))); 533 } 534 535 if (properties.containsKey("error")) { 536 setErrorEnabled(!"false".equalsIgnoreCase 537 ((String )properties.get("error"))); 538 } 539 } 540 541 544 public String toString() { 545 return "Log[" + getDescription() + "]@" + 546 Integer.toHexString(hashCode()); 547 } 548 549 private synchronized boolean isEnabled(int mask) { 550 return (mEnabledFlags & mask) == mask; 551 } 552 553 private synchronized void setEnabled(boolean enabled, int mask) { 554 if (enabled) { 555 mEnabledFlags |= mask; 556 } 557 else { 558 mEnabledFlags &= ~mask; 559 } 560 } 561 } 562 | Popular Tags |