Advertisement
Guest User

RMSAnalyzer

a guest
Feb 28th, 2010
576
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 7.62 KB | None | 0 0
  1. package com.ericgiguere;
  2.  
  3. import java.io.*;
  4. import javax.microedition.rms.*;
  5.  
  6. // Анализирует содержимое хранилища.
  7. // По умолчанию печатает вывод в System.out,
  8. // но вы можете реализовать свой Logger.
  9.  
  10. public class RMSAnalyzer {
  11.  
  12.     // интерфейс Logger
  13.  
  14.     public interface Logger {
  15.         void logEnd( RecordStore rs );
  16.         void logException( String name, Throwable e );
  17.         void logException( RecordStore rs, Throwable e );
  18.         void logRecord( RecordStore rs, int id,
  19.                         byte[] data, int size );
  20.         void logStart( RecordStore rs );
  21.     }
  22.  
  23.     private Logger logger;
  24.  
  25.     // конструктор анализатора, выводящего результат в System.out.
  26.  
  27.     public RMSAnalyzer(){
  28.         this( null );
  29.     }
  30.  
  31.     // конструктор анализатора с заданным logger.
  32.  
  33.     public RMSAnalyzer( Logger logger ){
  34.         this.logger = ( logger != null ) ? logger :
  35.                                            new SystemLogger();
  36.     }
  37.  
  38.     // открывает все хранилища приложения
  39.     // и анализирует их содержимое
  40.  
  41.     public void analyzeAll(){
  42.         String[] names = RecordStore.listRecordStores();
  43.  
  44.         for( int i = 0;
  45.              names != null && i < names.length;
  46.              ++i ){
  47.             analyze( names[i] );
  48.         }
  49.     }
  50.  
  51.     // открывает хранилище по имени и анализирует его
  52.  
  53.     public void analyze( String rsName ){
  54.         RecordStore rs = null;
  55.  
  56.         try {
  57.             rs = RecordStore.openRecordStore( rsName, false );
  58.             analyze( rs );
  59.         } catch( RecordStoreException e ){
  60.             logger.logException( rsName, e );
  61.         } finally {
  62.             try {
  63.                 rs.closeRecordStore();
  64.             } catch( RecordStoreException e ){
  65.                 // Ignore this exception
  66.             }
  67.         }
  68.     }
  69.  
  70.     // Анализирует содержимое хранилища
  71.     // простым перебором записей
  72.  
  73.     public synchronized void analyze( RecordStore rs ){
  74.         try {
  75.             logger.logStart( rs );
  76.  
  77.             int    lastID = rs.getNextRecordID();
  78.             int    numRecords = rs.getNumRecords();
  79.             int    count = 0;
  80.             byte[] data = null;
  81.  
  82.             for( int id = 0;
  83.                  id < lastID && count < numRecords;
  84.                  ++id ){
  85.                 try {
  86.                     int size = rs.getRecordSize( id );
  87.  
  88.                     // проверяем, что массив достаточно большой
  89.                     // и добавляем немного для роста
  90.  
  91.                     if( data == null || data.length < size ){
  92.                         data = new byte[ size + 20 ];
  93.                     }
  94.  
  95.                     rs.getRecord( id, data, 0 );
  96.                     logger.logRecord( rs, id, data, size );
  97.  
  98.                     ++count; // увеличивается, только если запись существует
  99.                 }
  100.                 catch( InvalidRecordIDException e ){
  101.                     // игнорируем и переходим к следующей записи
  102.                 }
  103.                 catch( RecordStoreException e ){
  104.                     logger.logException( rs, e );
  105.                 }
  106.             }
  107.  
  108.         } catch( RecordStoreException e ){
  109.             logger.logException( rs, e );
  110.         } finally {
  111.             logger.logEnd( rs );
  112.         }
  113.     }
  114. }
  115. // Logger, печатающий в PrintStream.
  116.  
  117. public static class PrintStreamLogger implements Logger {
  118.     public static final int COLS_MIN = 10;
  119.     public static final int COLS_DEFAULT = 20;
  120.  
  121.     private int          cols;
  122.     private int          numBytes;
  123.     private StringBuffer hBuf;
  124.     private StringBuffer cBuf;
  125.     private StringBuffer pBuf;
  126.     private PrintStream  out;
  127.  
  128.     public PrintStreamLogger( PrintStream out ){
  129.         this( out, COLS_DEFAULT );
  130.     }
  131.  
  132.     public PrintStreamLogger( PrintStream out, int cols ){
  133.         this.out = out;
  134.         this.cols = ( cols > COLS_MIN ? cols : COLS_MIN );
  135.     }
  136.  
  137.     private char convertChar( char ch ){
  138.         if( ch < 0x20 ) return '.';
  139.         return ch;
  140.     }
  141.  
  142.     public void logEnd( RecordStore rs ){
  143.         out.println( "\nActual size of records = "
  144.                      + numBytes );
  145.         printChar( '-', cols * 4 + 1 );
  146.  
  147.         hBuf = null;
  148.         cBuf = null;
  149.         pBuf = null;
  150.     }
  151.  
  152.     public void logException( String name, Throwable e ){
  153.         out.println( "Exception while analyzing " +
  154.                      name + ": " + e );
  155.     }
  156.  
  157.     public void logException( RecordStore rs, Throwable e ){
  158.         String name;
  159.  
  160.         try {
  161.             name = rs.getName();
  162.         } catch( RecordStoreException rse ){
  163.             name = "";
  164.         }
  165.  
  166.         logException( name, e );
  167.     }
  168.  
  169.     public void logRecord( RecordStore rs, int id,
  170.                            byte[] data, int len ){
  171.         if( len < 0 && data != null ){
  172.             len = data.length;
  173.         }
  174.  
  175.         hBuf.setLength( 0 );
  176.         cBuf.setLength( 0 );
  177.  
  178.         numBytes += len;
  179.  
  180.         out.println( "Record #" + id + " of length "
  181.                      + len + " bytes" );
  182.  
  183.         for( int i = 0; i < len; ++i ){
  184.             int    b = Math.abs( data[i] );
  185.             String hStr = Integer.toHexString( b );
  186.  
  187.             if( b < 0x10 ){
  188.                 hBuf.append( '0');
  189.             }
  190.  
  191.             hBuf.append( hStr );
  192.             hBuf.append( ' ' );
  193.  
  194.             cBuf.append( convertChar( (char) b ) );
  195.  
  196.             if( cBuf.length() == cols ){
  197.                 out.println( hBuf + " " + cBuf );
  198.  
  199.                 hBuf.setLength( 0 );
  200.                 cBuf.setLength( 0 );
  201.             }
  202.         }
  203.  
  204.         len = cBuf.length();
  205.  
  206.         if( len > 0 ){
  207.             while( len++ < cols ){
  208.                 hBuf.append( "   " );
  209.                 cBuf.append( ' ' );
  210.             }
  211.  
  212.             out.println( hBuf + " " + cBuf );
  213.         }
  214.     }
  215.  
  216.     public void logStart( RecordStore rs ){
  217.         hBuf = new StringBuffer( cols * 3 );
  218.         cBuf = new StringBuffer( cols );
  219.         pBuf = new StringBuffer();
  220.  
  221.         printChar( '=', cols * 4 + 1 );
  222.  
  223.         numBytes = 0;
  224.  
  225.         try {
  226.             out.println( "Record store: "
  227.                          + rs.getName() );
  228.             out.println( "    Number of records = "
  229.                          + rs.getNumRecords() );
  230.             out.println( "    Total size = "
  231.                          + rs.getSize() );
  232.             out.println( "    Version = "
  233.                          + rs.getVersion() );
  234.             out.println( "    Last modified = "
  235.                          + rs.getLastModified() );
  236.             out.println( "    Size available = "
  237.                          + rs.getSizeAvailable() );
  238.             out.println( "" );
  239.         } catch( RecordStoreException e ){
  240.             logException( rs, e );
  241.         }
  242.     }
  243.  
  244.     private void printChar( char ch, int num ){
  245.         pBuf.setLength( 0 );
  246.         while( num-- > 0 ){
  247.             pBuf.append( ch );
  248.         }
  249.         out.println( pBuf.toString() );
  250.     }
  251. }
  252.  
  253. // Logger, печатающий в System.out.
  254.  
  255. public static class SystemLogger
  256.                     extends PrintStreamLogger {
  257.     public SystemLogger(){
  258.         super( System.out );
  259.     }
  260.  
  261.     public SystemLogger( int cols ){
  262.         super( System.out, cols );
  263.     }
  264. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement