<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    ivaneeo's blog

    自由的力量,自由的生活。

      BlogJava :: 首頁 :: 聯系 :: 聚合  :: 管理
      669 Posts :: 0 Stories :: 64 Comments :: 0 Trackbacks

    Scala代碼
    1. package org.apache.pivot.scala.log  
    2.   
    3. import scala.reflect.BeanProperty  
    4. import io.Source  
    5. import org.apache.pivot.wtk.content.ListViewItemRenderer  
    6. import java.lang.String  
    7. import org.apache.pivot.wtkx.{WTKX, WTKXSerializer}  
    8.   
    9. /*為了避免和scala.Application的名稱沖突,這里修改了別名*/  
    10. import org.apache.pivot.wtk.{ Application => PivotApplication, _}  
    11. import org.apache.pivot.collections.{ArrayList, Map}  
    12.   
    13. /**  
    14.  * Created by IntelliJ IDEA.  
    15.  * User: Administrator  
    16.  * Date: 2010-8-26  
    17.  * Time: 10:36:45  
    18.  * To change this template use File | Settings | File Templates.  
    19.  */  
    20.   
    21. /*日志記錄Bean對象,由于Scala標準生成的字段不使用getter/setter的格式,  
    22.     但是提供了注解 @scala.reflect.BeanProperty ,使得編譯器可以生成標準的JavaBean對象的getter/setter接口   
    23.     val 只生成了getter  
    24.     var 同時生成了getter和setter */  
    25. class LogRecord ( @BeanProperty val threadName : String,  
    26.                   @BeanProperty val date : String,  
    27.                   @BeanProperty val time : String,  
    28.                   @BeanProperty val module : String,  
    29.                   @BeanProperty val level : String,  
    30.                   @BeanProperty val content : String){  
    31.   
    32.     /*  
    33.         重載了 Any的 toString接口  
    34.         override關鍵字是必須的,在java中使用的是注解 @override,但是java中@override并不是必須的。  
    35.         省略了 函數還回值,由編譯器進行類型推演得到  
    36.     */  
    37.   override def toString()  = {  
    38.     threadName +" "+date +" "+ time +" "+module +" "+level+" "+content  
    39.   }  
    40.   
    41. }  
    42.   
    43. /*  
    44.     LogRecord 類的半生對象  
    45.     定義了 scala中的魔術接口 apply ,使得可以使用  LogRecord("sting 文本") 可以創建一個class LogRecord對象。  
    46.     apply方法的調用由編譯器自動調用,我們只負責定義即可  
    47.     我們要解析的日志格式  
    48.       
    49. threadName date    time     module       Level   content  
    50. DVOSMAIN 08/26/10 10:17:17 LOGINFO     : INFO  - Debug level: 2  
    51. DVOSMAIN 08/26/10 10:17:17 LOGINFO     : INFO  - *=ERROR WARNING EXCEPT  
    52. DVOSMAIN 08/26/10 10:17:17 LOGINFO     : INFO  - LM=*  
    53.   
    54. */  
    55. object LogRecord {  
    56.   def apply( line : String  ) : LogRecord = {  
    57.   
    58.         /*生成一個 Regex對象,用于模式匹配*/  
    59.     val logRegex = """([A-Za-z0-9]+) +([0-9/]*) +([0-9:]*) +([A-Z]*) +: *([A-Z_]+).*""".r  
    60.   
    61.     line match {  
    62.         /*如果模式匹配成功,threadName,date,time,module,level 分配按次序綁定到模式匹配表達式中()的內容 */  
    63.       case logRegex(threadName,date,time,module,level) =>  
    64.           val logRecord: LogRecord = new LogRecord( threadName, date, time, module, level,line)  
    65.             logRecord  
    66.             /*模式匹配通配符,在沒有匹配到的情況下,做通用處理。如果不添加,在匹配不到時會拋出 MatchError異常*/  
    67.       case _ =>  
    68.           val logRecord: LogRecord = new LogRecord("N/A","N/A","N/A","N/A","N/A","N/A")  
    69.             logRecord  
    70.     }  
    71.   
    72.   }  
    73. }  
    74.   
    75. /*  
    76.     Apache Pivot ListView ItemRenderer   
    77.     重新定義了如何顯示 LogRecord對象的 列表項目的渲染。  
    78.     如果使用默認的,那么ListView顯示對象時,直接調用對象的toString獲得其字符串表示  
    79. */  
    80. class LogListViewItemRenderer extends ListViewItemRenderer {  
    81.   
    82.   imageView.setVisible(false)  
    83.   
    84.   override def render(item: AnyRef, index: Int, listView: ListView, selected: Boolean, checked: Boolean, highlighted: Boolean, disabled: Boolean) = {  
    85.       if ( item != null && item.isInstanceOf[LogRecord])  
    86.         {  
    87.           val log = item.asInstanceOf[LogRecord]  
    88.           label.setText(log.content)  
    89.   
    90.        
    91.         }  
    92.   }  
    93.   
    94.   
    95.     
    96. }  
    97.   
    98. /**  
    99.     定義主窗口界面代碼,必須繼承自 org.apache.pivot.Application  
    100.     使用了 @WTKX注解,該注解屬于 wtkx的命名對象的綁定語法,在從wtkx文件加載GUI時,  
    101.     調用bind接口可以自動和wtkx文件中聲明的wtkx:id對象進行綁定,無需在掉嗎中調用 get("name")  
    102. */  
    103. class MainWindow extends PivotApplication {  
    104.   var window : Window   = null  
    105.   @WTKX var textInputFilePath : TextInput  = null  
    106.   @WTKX var browsePushButton : PushButton  = null  
    107.   @WTKX var loadPushButton : PushButton   = null  
    108.   @WTKX var textInputThreadName :TextInput   = null  
    109.   @WTKX var textInputModule : TextInput    = null  
    110.   @WTKX var textInputLevel : TextInput    = null  
    111.   @WTKX var textInputContent : TextInput   = null  
    112.   @WTKX var logListView : ListView = null  
    113.   
    114.   
    115.   def resume = {}  
    116.   
    117.   def suspend = {}  
    118.   
    119.   def shutdown(optional: Boolean) = {  
    120.     if ( window != null)  
    121.       {  
    122.         window.close  
    123.         true  
    124.       }  
    125.     false  
    126.   }  
    127.   
    128.   def startup(display: Display, properties: Map[String, String]) = {  
    129.     val wtkxSerializer = new WTKXSerializer()  
    130.     var matchString : String = null  
    131.   
    132.         /*從xml(wtkx)文件加載GUI*/  
    133.     window = wtkxSerializer.readObject(this,"MainWindow.xml").asInstanceOf[Window]  
    134.   
    135.     wtkxSerializer.bind(this)  
    136.         if ( properties containsKey "logfile")  
    137.         {  
    138.                 textInputFilePath setText ( properties get "logfile")  
    139.         }  
    140.           
    141.         /*給 Button添加事件處理函數*/  
    142.     browsePushButton.getButtonPressListeners.add( function2Listener (browseButtonPressed ) )  
    143.     loadPushButton.getButtonPressListeners.add( function2Listener(loadButtonPressed ))  
    144.       
    145.       
    146.     window.open(display)  
    147.   
    148.   }  
    149.   
    150.     /*瀏覽按鈕事件處理,打開一個文件瀏覽窗口,讓用戶選擇文件,并在用戶關閉對話框時,捕獲用戶選擇的文件名*/  
    151.   def browseButtonPressed( button : Button ) : Unit = {  
    152.      val dialog : FileBrowserSheet = new   FileBrowserSheet(FileBrowserSheet.Mode.OPEN)  
    153.   
    154.     dialog.open( window, new SheetCloseListener() {  
    155.       def sheetClosed(sheet: Sheet) = {  
    156.         if ( sheet.getResult)  
    157.           {  
    158.              val fileBrowseSheet = sheet.asInstanceOf[FileBrowserSheet]  
    159.              textInputFilePath.setText( fileBrowseSheet.getSelectedFile.getPath.toString)  
    160.           }  
    161.       }  
    162.     })  
    163.   }  
    164.     
    165.   /*從log文件加載內容,每一行是一個日志記錄  
    166.     for中使用了 if過濾器,只有條件符合了,才會進入for循環體。  
    167.       
    168.     scala沒有提供continu,而是在 for中提供了條件過濾來替代  
    169.   */  
    170.   def loadButtonPressed( button : Button ) : Unit = {  
    171.      val logFile = Source.fromFile(textInputFilePath.getText)  
    172.      val list = new ArrayList[LogRecord]  
    173.     for ( line <- logFile.getLines ; logRecord = LogRecord(line.trim);  
    174.           if ( textInputThreadName.getText == "" || textInputThreadName.getText.contains(logRecord.threadName) );  
    175.           if ( textInputModule.getText == "" || textInputModule.getText.contains(logRecord.module));  
    176.           if ( textInputLevel.getText == "" || textInputLevel.getText.contains(logRecord.level))){  
    177.         
    178.       list add logRecord  
    179.     }  
    180.   
    181.     logListView.setListData( list)  
    182.       
    183.   }  
    184.     /*按鈕事件輔助接口,用于把一個 事件處理函數轉換為ButtonPressListener對象,也可以采取更高級的內容,使用implicit,這里沒有使用*/  
    185.    def function2Listener( fun : Button => Unit ) :ButtonPressListener =  {  
    186.     val listener = new ButtonPressListener()  
    187.     {  
    188.       def buttonPressed(button: Button) = {  
    189.         fun(button)  
    190.       }  
    191.     }  
    192.   
    193.     listener  
    194.   }  
    195. }  
    196.   
    197. /*  
    198.     主函數  
    199.     符合Pivot主函數入口規則  
    200. */  
    201. object LogAnalyse {  
    202.   def main ( args : Array[String]) : Unit = {  
    203.   
    204.       
    205.     DesktopApplicationContext.main( classOf[MainWindow], args)  
    206.      
    207.   
    208.   }  
    209. }  

     run:

    使用 java時:

    java  -classpath scala-library.jar;pivot-core-1.5.jar;pivot-tools-1.5.jar;pivot-wtk-1.5.jar;pivot-wtk-terra-1.5.jar;. org.apache.pivot.scala.log.LogAnalyse

     

    使用 scala時

    java  -classpath pivot-core-1.5.jar;pivot-tools-1.5.jar;pivot-wtk-1.5.jar;pivot-wtk-terra-1.5.jar;. org.apache.pivot.scala.log.LogAnalyse

    posted on 2010-12-23 20:37 ivaneeo 閱讀(633) 評論(0)  編輯  收藏 所屬分類: java魔力scala-fun!
    主站蜘蛛池模板: 免费一级黄色毛片| 桃子视频在线观看高清免费完整| 亚洲一区爱区精品无码| 亚洲国产精品综合久久2007| 男的把j放进女人下面视频免费| 人人揉揉香蕉大免费不卡| 在线观看亚洲天天一三视| 男女拍拍拍免费视频网站| 亚洲国产av一区二区三区| 无人视频免费观看免费视频 | 亚洲人成在线电影| a级毛片视频免费观看| 亚洲中文字幕无码爆乳AV| 国产精品偷伦视频观看免费| 亚洲VA中文字幕无码毛片| 91精品国产免费| 国产AV旡码专区亚洲AV苍井空| 一级做受视频免费是看美女 | 久久久精品国产亚洲成人满18免费网站| 国产一级在线免费观看| 亚洲乱码中文字幕综合| 久久国产福利免费| 亚洲精品在线观看视频| 日本免费一区二区在线观看| 在线综合亚洲欧洲综合网站| 免费jjzz在在线播放国产| 国产精品极品美女自在线观看免费| 黄页网站免费观看| 男男gay做爽爽的视频免费| MM131亚洲国产美女久久| 在线免费观看h片| 亚洲av无码一区二区三区观看| 老司机69精品成免费视频| 亚洲精品国产手机| 四虎免费久久影院| 最好免费观看高清在线| 天天爽亚洲中文字幕| 亚洲人成色7777在线观看不卡| 亚洲妇女无套内射精| 亚洲区小说区图片区| 91热成人精品国产免费|