1 package com.protomatter.util; 2 3 52 53 import java.io.*; 54 import java.util.*; 55 import java.text.*; 56 import org.apache.oro.text.regex.*; 57 58 219 public class Debug 220 implements java.io.Serializable 221 { 222 225 private static Set tracePatternSet = new HashSet(); 226 227 230 private static Set debugPatternSet = new HashSet(); 231 232 235 private static Set infoPatternSet = new HashSet(); 236 237 240 private final static char DOT = '.'; 241 242 245 private final static String DOT_STAR = ".*"; 246 247 251 private static boolean allOff = false; 252 253 258 private static boolean scan = false; 259 260 263 private boolean traceOn = false; 264 265 268 private boolean debugOn = false; 269 270 273 private boolean infoOn = false; 274 275 278 private String name = null; 279 280 283 private static long configLastUpdateTime = 0; 284 285 291 private long lastUpdateTime = 0; 292 293 296 private static final int TRACE = 0; 297 298 301 private static final int DEBUG = 1; 302 303 306 private static final int INFO = 2; 307 308 311 private Debug(String name) 312 { 313 super(); 314 315 this.name = name; 316 init(); 317 } 318 319 326 public final void init() 327 { 328 this.traceOn = match(name, TRACE); 329 this.debugOn = match(name, DEBUG); 330 this.infoOn = match(name, INFO); 331 this.lastUpdateTime = System.currentTimeMillis(); 332 } 333 334 342 public final static Debug forClass(Class someClass) 343 { 344 return new Debug(someClass.getName()); 345 } 346 347 356 public final static Debug forPackage(Class someClass) 357 { 358 String packageName = someClass.getName(); 359 int pos = packageName.lastIndexOf(DOT); 360 if (pos < 0) 361 return new Debug(packageName); 362 return new Debug(packageName.substring(0, pos)); 363 } 364 365 369 public final static Debug forName(String name) 370 { 371 return new Debug(name); 372 } 373 374 381 public final static void disable() 382 { 383 allOff = true; 384 } 385 386 389 public final static void enable() 390 { 391 allOff = false; 392 } 393 394 397 public final static boolean isEnabled() 398 { 399 return (!allOff); 400 } 401 402 408 public final boolean trace() 409 { 410 if ((this.lastUpdateTime < Debug.configLastUpdateTime) && (!allOff)) 411 init(); 412 return (allOff) ? false : this.traceOn; 413 } 414 415 421 public final boolean debug() 422 { 423 if ((this.lastUpdateTime < Debug.configLastUpdateTime) && (!allOff)) 424 init(); 425 return (allOff) ? false : this.debugOn; 426 } 427 428 434 public final boolean info() 435 { 436 if ((this.lastUpdateTime < Debug.configLastUpdateTime) && (!allOff)) 437 init(); 438 return (allOff) ? false : this.infoOn; 439 } 440 441 448 private final static boolean match(String name, int severity) 449 { 450 if (name == null) 451 return false; 452 453 if (allOff) 455 return false; 456 457 Set patternSet = null; 458 if (TRACE == severity) 459 patternSet = tracePatternSet; 460 else if (DEBUG == severity) 461 patternSet = debugPatternSet; 462 else if (INFO == severity) 463 patternSet = infoPatternSet; 464 465 if (patternSet.isEmpty()) 467 return false; 468 469 if (scan) 471 { 472 if (patternSet.contains(name)) 473 return true; 474 475 int index = 1; 476 while (index > 0) 477 { 478 if (patternSet.contains(name + DOT_STAR)) 479 { 480 return true; 481 } 482 index = name.lastIndexOf(DOT); 483 if (index < 0) 484 return false; 485 name = name.substring(0, index); 486 } 487 return false; 488 } 489 490 return patternSet.contains(name); 492 } 493 494 501 public final static void setScan(boolean setting) 502 { 503 scan = setting; 504 configLastUpdateTime = System.currentTimeMillis(); 505 } 506 507 514 public final static boolean getScan() 515 { 516 return scan; 517 } 518 519 522 public final static Iterator getTraceNames() 523 { 524 return tracePatternSet.iterator(); 525 } 526 527 530 public final static Iterator getDebugNames() 531 { 532 return debugPatternSet.iterator(); 533 } 534 535 538 public final static Iterator getInfoNames() 539 { 540 return infoPatternSet.iterator(); 541 } 542 543 546 public final static void addTraceName(String name) 547 { 548 tracePatternSet.add(name); 549 configLastUpdateTime = System.currentTimeMillis(); 550 } 551 552 555 public final static void addDebugName(String name) 556 { 557 debugPatternSet.add(name); 558 configLastUpdateTime = System.currentTimeMillis(); 559 } 560 561 564 public final static void addInfoName(String name) 565 { 566 infoPatternSet.add(name); 567 configLastUpdateTime = System.currentTimeMillis(); 568 } 569 570 573 public final static void clear() 574 { 575 tracePatternSet = new HashSet(); 576 debugPatternSet = new HashSet(); 577 infoPatternSet = new HashSet(); 578 configLastUpdateTime = System.currentTimeMillis(); 579 } 580 581 584 public final String getName() 585 { 586 return this.name; 587 } 588 589 592 public final String toString() 593 { 594 if (this.lastUpdateTime < Debug.configLastUpdateTime) 595 init(); 596 StringBuffer b = new StringBuffer (); 597 b.append("Debug["); 598 b.append(name); 599 b.append(" "); 600 if (!traceOn && !debugOn && !infoOn) 601 { 602 b.append("OFF"); 603 } 604 else if (traceOn && debugOn && infoOn) 605 { 606 b.append("ON"); 607 } 608 else 609 { 610 b.append("trace"); 611 b.append((this.traceOn ? "=ON " : "=OFF ")); 612 613 b.append("debug"); 614 b.append((this.debugOn ? "=ON " : "=OFF ")); 615 616 b.append("info"); 617 b.append((this.infoOn ? "=ON" : "=OFF")); 618 } 619 620 b.append("]"); 621 622 return b.toString(); 623 } 624 625 626 629 public static void main(String args[]) 630 { 631 try 632 { 633 if (args.length != 4) 634 { 635 System.out.println("Usage: java com.protomatter.util.Debug \\"); 636 System.out.println(" scan? numCalls patterns.txt tests.txt"); 637 System.out.println(""); 638 System.out.println(" scan: true/false: passed to Debug.setScan()"); 639 System.out.println(" numCalls: number of Debug.forName() calls to make"); 640 System.out.println(" patterns.txt: a text file containing strings"); 641 System.out.println(" to pass to Debug.addInfoName()"); 642 System.out.println(" tests.txt: a text file containing strings"); 643 System.out.println(" to pass to Debug.forName() repeatedly."); 644 System.out.println(""); 645 System.exit(0); 646 } 647 648 Debug.setScan("true".equalsIgnoreCase(args[0])); 649 int numCalls = Integer.parseInt(args[1]); 650 651 BufferedReader names = new BufferedReader(new FileReader(new File(args[2]))); 652 BufferedReader tests = new BufferedReader(new FileReader(new File(args[3]))); 653 654 655 System.out.println("Debug.forName() and Debug.info() performance test"); 656 System.out.println(""); 657 658 Debug.setScan(true); 659 System.out.println("JVM Information:"); 660 System.out.println(" VM Name: " + System.getProperty("java.vm.name")); 661 System.out.println(" VM Version: " + System.getProperty("java.vm.version")); 662 System.out.println(" Runtime name: " + System.getProperty("java.runtime.name")); 663 System.out.println(" Runtime version: " + System.getProperty("java.runtime.version")); 664 System.out.println(""); 665 System.out.println("OS Information:"); 666 System.out.println(" " + System.getProperty("os.name") + " " + System.getProperty("os.version")); 667 System.out.println(""); 668 System.out.println("Scan: " + Debug.getScan()); 669 670 671 System.out.println("Adding names:"); 672 String line = null; 673 int num = 0; 674 while ((line = names.readLine()) != null) 675 { 676 Debug.addInfoName(line.trim()); 678 ++num; 679 } 680 System.out.println(" added " + num + " names/patterns"); 681 682 System.out.println(""); 683 System.out.println("Testing names:"); 684 DecimalFormat tf = new DecimalFormat("###,###,###,###"); 685 DecimalFormat format = new DecimalFormat("###.#######"); 686 Debug debug = null; 687 Debug debug1 = null; 688 while ((line = tests.readLine()) != null) 689 { 690 line = line.trim(); 691 System.out.println(" instance = Debug.forName(\"" + line + "\");"); 692 long time = System.currentTimeMillis(); 693 for (int i=0; i<numCalls; i++) 694 { 695 debug = Debug.forName(line); 696 } 697 if (debug1 == null) 698 debug1 = debug; 699 time = System.currentTimeMillis() - time; 700 System.out.println(" " + debug); 701 System.out.println(" " + tf.format(numCalls) + " calls in " + tf.format(time) + "ms"); 702 double average = ((double)time / (double)numCalls); 703 double persecond = ((double)1 / average) * 1000; 704 System.out.println(" Average = " + format.format(average) + "ms"); 705 System.out.println(" Per-second = " + tf.format(persecond)); 706 System.out.println(""); 707 } 708 System.out.println(""); 709 System.out.println(""); 710 numCalls = numCalls * 1000; 711 System.out.println(tf.format(numCalls) + " instance.info() calls"); 712 long time = System.currentTimeMillis(); 713 boolean on = false; 714 for (int i=0; i<numCalls; i++) 715 { 716 on = debug1.info(); 717 } 718 time = System.currentTimeMillis() - time; 719 System.out.println(" " + debug1); 720 System.out.println(" " + tf.format(numCalls) + " calls in " + tf.format(time) + "ms"); 721 double average = ((double)time / (double)numCalls); 722 double persecond = ((double)1 / average) * 1000; 723 System.out.println(" Average = " + format.format(average) + "ms"); 724 System.out.println(" Per-second = " + tf.format(persecond)); 725 System.out.println(""); 726 } 727 catch (Exception x) 728 { 729 x.printStackTrace(); 730 } 731 } 732 } 733 | Popular Tags |