1 19 package org.archive.crawler.util; 20 21 import java.io.BufferedReader ; 22 import java.io.File ; 23 import java.io.FileNotFoundException ; 24 import java.io.FileReader ; 25 import java.io.IOException ; 26 import java.io.InputStreamReader ; 27 import java.io.RandomAccessFile ; 28 import java.text.DecimalFormat ; 29 import java.text.NumberFormat ; 30 import java.util.LinkedList ; 31 import java.util.regex.Matcher ; 32 import java.util.regex.Pattern ; 33 import java.util.regex.PatternSyntaxException ; 34 35 import org.archive.crawler.framework.CrawlController; 36 import org.archive.io.CompositeFileReader; 37 import org.archive.util.ArchiveUtils; 38 39 47 48 public class LogReader 49 { 50 57 public static String get(String aFileName){ 58 try { 59 return get(new FileReader (aFileName)); 60 } catch (FileNotFoundException e) { 61 e.printStackTrace(); 62 return null; 63 } 64 } 65 66 72 public static String get(InputStreamReader reader){ 73 StringBuffer ret = new StringBuffer (); 74 try{ 75 BufferedReader bf = new BufferedReader (reader, 8192); 76 77 String line = null; 78 while ((line = bf.readLine()) != null) { 79 ret.append(line); 80 ret.append("\n"); 81 } 82 } catch(IOException e){ 83 e.printStackTrace(); 84 return null; 85 } 86 return ret.toString(); 87 } 88 89 107 public static String [] get(String aFileName, int lineNumber, int n) 108 { 109 File f = new File (aFileName); 110 long logsize = f.length(); 111 try { 112 return get(new FileReader (aFileName),lineNumber,n,logsize); 113 } catch (FileNotFoundException e) { 114 e.printStackTrace(); 115 return null; 116 } 117 } 118 119 139 public static String [] getFromSeries(String aFileName, int lineNumber, int n) 140 { 141 File f = new File (aFileName); 142 long logsize = f.length(); 143 try { 144 return get(seriesReader(aFileName),lineNumber,n,logsize); 145 } catch (IOException e) { 146 e.printStackTrace(); 147 return null; 148 } 149 } 150 151 public static String buildDisplayingHeader(int len, long logsize) 152 { 153 double percent = 0.0; 154 if (logsize != 0) { 155 percent = ((double) len/logsize) * 100; 156 } 157 return "Displaying: " + ArchiveUtils.doubleToString(percent,1) + 158 "% of " + ArchiveUtils.formatBytesForDisplay(logsize); 159 } 160 161 180 public static String [] get(InputStreamReader reader, 181 int lineNumber, 182 int n, 183 long logsize) 184 { 185 StringBuffer ret = new StringBuffer (); 186 String info = null; 187 try{ 188 BufferedReader bf = new BufferedReader (reader, 8192); 189 190 String line = null; 191 int i=1; 192 while ((line = bf.readLine()) != null) { 193 if(i >= lineNumber && i < (lineNumber+n)) 194 { 195 ret.append(line); 196 ret.append('\n'); 197 } else if( i >= (lineNumber+n)){ 198 break; 199 } 200 i++; 201 } 202 info = buildDisplayingHeader(ret.length(), logsize); 203 }catch(IOException e){ 204 e.printStackTrace(); 205 return null; 206 } 207 String [] tmp = {ret.toString(),info}; 208 return tmp; 209 } 210 211 222 public static int findFirstLineContaining(String aFileName, String regExpr) 223 { 224 try { 225 return findFirstLineContaining(new FileReader (aFileName), regExpr); 226 } catch (FileNotFoundException e) { 227 e.printStackTrace(); 228 return -1; 229 } 230 } 231 232 243 public static int findFirstLineBeginningFromSeries(String aFileName, 244 String prefix) 245 { 246 try { 247 return findFirstLineBeginning(seriesReader(aFileName), prefix); 248 } catch (IOException e) { 249 e.printStackTrace(); 250 return -1; 251 } 252 } 253 254 265 public static int findFirstLineBeginning(InputStreamReader reader, 266 String prefix) 267 { 268 269 try{ 270 BufferedReader bf = new BufferedReader (reader, 8192); 271 272 String line = null; 273 int i = 1; 274 while ((line = bf.readLine()) != null) { 275 if(line.startsWith(prefix)){ 276 return i; 278 } 279 i++; 280 } 281 } catch(IOException e){ 282 e.printStackTrace(); 283 } 284 return -1; 285 } 286 287 298 public static int findFirstLineContainingFromSeries(String aFileName, 299 String regExpr) 300 { 301 try { 302 return findFirstLineContaining(seriesReader(aFileName), regExpr); 303 } catch (IOException e) { 304 e.printStackTrace(); 305 return -1; 306 } 307 } 308 309 320 public static int findFirstLineContaining(InputStreamReader reader, 321 String regExpr) 322 { 323 Pattern p = Pattern.compile(regExpr); 324 325 try{ 326 BufferedReader bf = new BufferedReader (reader, 8192); 327 328 String line = null; 329 int i = 1; 330 while ((line = bf.readLine()) != null) { 331 if(p.matcher(line).matches()){ 332 return i; 334 } 335 i++; 336 } 337 } catch(IOException e){ 338 e.printStackTrace(); 339 } 340 return -1; 341 } 342 343 371 public static String [] getByRegExpr(String aFileName, 372 String regExpr, 373 int addLines, 374 boolean prependLineNumbers, 375 int skipFirstMatches, 376 int numberOfMatches) { 377 try { 378 File f = new File (aFileName); 379 return getByRegExpr( 380 new FileReader (f), 381 regExpr, 382 addLines, 383 prependLineNumbers, 384 skipFirstMatches, 385 numberOfMatches, 386 f.length()); 387 } catch (FileNotFoundException e) { 388 e.printStackTrace(); 389 return null; 390 } 391 } 392 393 421 public static String [] getByRegExprFromSeries(String aFileName, 422 String regExpr, 423 int addLines, 424 boolean prependLineNumbers, 425 int skipFirstMatches, 426 int numberOfMatches) { 427 try { 428 File f = new File (aFileName); 429 return getByRegExpr( 430 seriesReader(aFileName), 431 regExpr, 432 addLines, 433 prependLineNumbers, 434 skipFirstMatches, 435 numberOfMatches, 436 f.length()); 437 } catch (IOException e) { 438 e.printStackTrace(); 439 return null; 440 } 441 } 442 443 472 public static String [] getByRegExpr(InputStreamReader reader, 473 String regExpr, 474 int addLines, 475 boolean prependLineNumbers, 476 int skipFirstMatches, 477 int numberOfMatches, 478 long logsize) { 479 StringBuffer ret = new StringBuffer (); 480 String info = ""; 481 482 try{ 483 Pattern p = Pattern.compile(regExpr); 484 BufferedReader bf = new BufferedReader (reader, 8192); 485 486 String line = null; 487 int i = 1; 488 boolean doAdd = false; 489 int addCount = 0; 490 long linesMatched = 0; 491 while ((line = bf.readLine()) != null) { 492 if(p.matcher(line).matches()){ 493 if(numberOfMatches > 0 && 495 linesMatched >= skipFirstMatches + numberOfMatches){ 496 break; 498 } 499 linesMatched++; 500 if(linesMatched > skipFirstMatches){ 501 if(prependLineNumbers){ 502 ret.append(i); 503 ret.append(". "); 504 } 505 ret.append(line); 506 ret.append("\n"); 507 doAdd = true; 508 addCount = 0; 509 } 510 } else if(doAdd) { 511 if(addCount < addLines){ 512 linesMatched++; 514 if(prependLineNumbers){ 515 ret.append(i); 516 ret.append(". "); 517 } 518 ret.append(line); 519 ret.append("\n"); 520 }else{ 521 doAdd = false; 522 addCount = 0; 523 } 524 } 525 i++; 526 } 527 info = buildDisplayingHeader(ret.length(), logsize); 528 }catch(FileNotFoundException e){ 529 return null; 530 }catch(IOException e){ 531 e.printStackTrace(); 532 return null; 533 }catch(PatternSyntaxException e){ 534 ret = new StringBuffer (e.getMessage()); 535 } 536 String [] tmp = {ret.toString(),info}; 537 return tmp; 538 } 539 540 566 public static String [] getByRegExpr(String aFileName, 567 String regExpr, 568 String addLines, 569 boolean prependLineNumbers, 570 int skipFirstMatches, 571 int numberOfMatches){ 572 try { 573 File f = new File (aFileName); 574 return getByRegExpr( 575 new FileReader (f), 576 regExpr, 577 addLines, 578 prependLineNumbers, 579 skipFirstMatches, 580 numberOfMatches, 581 f.length()); 582 } catch (FileNotFoundException e) { 583 e.printStackTrace(); 584 return null; 585 } 586 } 587 588 614 public static String [] getByRegExprFromSeries(String aFileName, 615 String regExpr, 616 String addLines, 617 boolean prependLineNumbers, 618 int skipFirstMatches, 619 int numberOfMatches){ 620 try { 621 File f = new File (aFileName); 622 return getByRegExpr( 623 seriesReader(aFileName), 624 regExpr, 625 addLines, 626 prependLineNumbers, 627 skipFirstMatches, 628 numberOfMatches, 629 f.length()); 630 } catch (IOException e) { 631 e.printStackTrace(); 632 return null; 633 } 634 } 635 636 663 public static String [] getByRegExpr(InputStreamReader reader, 664 String regExpr, 665 String addLines, 666 boolean prependLineNumbers, 667 int skipFirstMatches, 668 int numberOfMatches, 669 long logsize) { 670 StringBuffer ret = new StringBuffer (); 671 String info = ""; 672 try{ 673 Matcher m = Pattern.compile(regExpr).matcher(""); 674 BufferedReader bf = new BufferedReader (reader, 8192); 675 676 String line = null; 677 int i = 1; 678 boolean doAdd = false; 679 long linesMatched = 0; 680 while ((line = bf.readLine()) != null) { 681 m.reset(line); 682 if(m.matches()){ 683 if(numberOfMatches > 0 && 685 linesMatched >= skipFirstMatches + numberOfMatches){ 686 break; 688 } 689 linesMatched++; 690 if(linesMatched > skipFirstMatches){ 691 if(prependLineNumbers){ 692 ret.append(i); 693 ret.append(". "); 694 } 695 ret.append(line); 696 ret.append("\n"); 697 doAdd = true; 698 } 699 } else if(doAdd) { 700 if(line.indexOf(addLines)==0){ 701 linesMatched++; 702 if(prependLineNumbers){ 704 ret.append(i); 705 ret.append(". "); 706 } 707 ret.append(line); 708 ret.append("\n"); 709 }else{ 710 doAdd = false; 711 } 712 } 713 i++; 714 } 715 info = buildDisplayingHeader(ret.length(), logsize); 716 }catch(FileNotFoundException e){ 717 return null; 718 }catch(IOException e){ 719 e.printStackTrace(); 720 return null; 721 }catch(PatternSyntaxException e){ 722 ret = new StringBuffer (e.getMessage()); 723 } 724 String [] tmp = {ret.toString(),info}; 725 return tmp; 726 } 727 728 738 public static String [] tail(String aFileName) { 739 return tail(aFileName, 10); 740 } 741 742 753 public static String [] tail(String aFileName, int n) { 754 try { 755 return tail(new RandomAccessFile (new File (aFileName),"r"),n); 756 } catch (FileNotFoundException e) { 757 e.printStackTrace(); 758 return null; 759 } 760 } 761 762 773 public static String [] tail(RandomAccessFile raf, int n) { 774 int BUFFERSIZE = 1024; 775 long pos; 776 long endPos; 777 long lastPos; 778 int numOfLines = 0; 779 String info=null; 780 byte[] buffer = new byte[BUFFERSIZE]; 781 StringBuffer sb = new StringBuffer (); 782 try { 783 endPos = raf.length(); 784 lastPos = endPos; 785 786 if (endPos > 0) { 789 byte[] oneByte = new byte[1]; 790 raf.seek(endPos - 1); 791 raf.read(oneByte); 792 if ((char) oneByte[0] != '\n') { 793 numOfLines++; 794 } 795 } 796 797 do { 798 pos = 0; 801 if ((lastPos - BUFFERSIZE) > 0) { 802 pos = lastPos - BUFFERSIZE; 803 } 804 raf.seek(pos); 805 if ((lastPos - pos) < BUFFERSIZE) { 807 int remainer = (int) (lastPos - pos); 808 buffer = new byte[remainer]; 809 } 810 raf.readFully(buffer); 811 for (int i = buffer.length - 1; i >= 0; i--) { 813 if ((char) buffer[i] == '\n') { 814 numOfLines++; 815 if (numOfLines > n) { 817 pos += (i + 1); 818 break; 819 } 820 } 821 } 822 lastPos = pos; 824 } while ((numOfLines <= n) && (pos != 0)); 825 826 for (pos = lastPos; pos < endPos; pos += buffer.length) { 828 raf.seek(pos); 829 if ((endPos - pos) < BUFFERSIZE) { 830 int remainer = (int) (endPos - pos); 831 buffer = new byte[remainer]; 832 } 833 raf.readFully(buffer); 834 sb.append(new String (buffer)); 835 } 836 837 info = buildDisplayingHeader(sb.length(), raf.length()); 838 } catch (FileNotFoundException e) { 839 sb = null; 840 } catch (IOException e) { 841 e.printStackTrace(); 842 sb = null; 843 } finally { 844 try { 845 if (raf != null) { 846 raf.close(); 847 } 848 } catch (IOException e) { 849 e.printStackTrace(); 850 } 851 } 852 if(sb==null){ 853 return null; 854 } 855 String [] tmp = {sb.toString(),info}; 856 return tmp; 857 } 858 859 864 private static CompositeFileReader seriesReader(String fileName) 865 throws IOException { 866 LinkedList <File > filenames = new LinkedList <File >(); 867 int seriesNumber = 1; 868 NumberFormat fmt = new DecimalFormat ("00000"); 869 String predecessorFilename = 870 fileName.substring(0,fileName.length() 871 - CrawlController.CURRENT_LOG_SUFFIX.length()) 872 + fmt.format(seriesNumber); 873 while((new File (predecessorFilename)).exists()) { 874 filenames.add(new File (predecessorFilename)); 875 seriesNumber++; 876 predecessorFilename = 877 fileName.substring(0,fileName.length() 878 - CrawlController.CURRENT_LOG_SUFFIX.length()) 879 + fmt.format(seriesNumber); 880 } 881 filenames.add(new File (fileName)); return new CompositeFileReader(filenames); 883 } 884 } 885 | Popular Tags |