ivaneeo's blog

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

            BlogJava :: 首頁(yè) :: 聯(lián)系 :: 聚合  :: 管理
            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對(duì)象,由于Scala標(biāo)準(zhǔn)生成的字段不使用getter/setter的格式,  
          22.     但是提供了注解 @scala.reflect.BeanProperty ,使得編譯器可以生成標(biāo)準(zhǔn)的JavaBean對(duì)象的getter/setter接口   
          23.     val 只生成了getter  
          24.     var 同時(shí)生成了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關(guān)鍵字是必須的,在java中使用的是注解 @override,但是java中@override并不是必須的。  
          35.         省略了 函數(shù)還回值,由編譯器進(jìn)行類型推演得到  
          36.     */  
          37.   override def toString()  = {  
          38.     threadName +" "+date +" "+ time +" "+module +" "+level+" "+content  
          39.   }  
          40.   
          41. }  
          42.   
          43. /*  
          44.     LogRecord 類的半生對(duì)象  
          45.     定義了 scala中的魔術(shù)接口 apply ,使得可以使用  LogRecord("sting 文本") 可以創(chuàng)建一個(gè)class LogRecord對(duì)象。  
          46.     apply方法的調(diào)用由編譯器自動(dòng)調(diào)用,我們只負(fù)責(zé)定義即可  
          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.         /*生成一個(gè) Regex對(duì)象,用于模式匹配*/  
          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 分配按次序綁定到模式匹配表達(dá)式中()的內(nèi)容 */  
          63.       case logRegex(threadName,date,time,module,level) =>  
          64.           val logRecord: LogRecord = new LogRecord( threadName, date, time, module, level,line)  
          65.             logRecord  
          66.             /*模式匹配通配符,在沒(méi)有匹配到的情況下,做通用處理。如果不添加,在匹配不到時(shí)會(huì)拋出 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對(duì)象的 列表項(xiàng)目的渲染。  
          78.     如果使用默認(rèn)的,那么ListView顯示對(duì)象時(shí),直接調(diào)用對(duì)象的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的命名對(duì)象的綁定語(yǔ)法,在從wtkx文件加載GUI時(shí),  
          101.     調(diào)用bind接口可以自動(dòng)和wtkx文件中聲明的wtkx:id對(duì)象進(jìn)行綁定,無(wú)需在掉嗎中調(diào)用 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添加事件處理函數(shù)*/  
          142.     browsePushButton.getButtonPressListeners.add( function2Listener (browseButtonPressed ) )  
          143.     loadPushButton.getButtonPressListeners.add( function2Listener(loadButtonPressed ))  
          144.       
          145.       
          146.     window.open(display)  
          147.   
          148.   }  
          149.   
          150.     /*瀏覽按鈕事件處理,打開(kāi)一個(gè)文件瀏覽窗口,讓用戶選擇文件,并在用戶關(guān)閉對(duì)話框時(shí),捕獲用戶選擇的文件名*/  
          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文件加載內(nèi)容,每一行是一個(gè)日志記錄  
          166.     for中使用了 if過(guò)濾器,只有條件符合了,才會(huì)進(jìn)入for循環(huán)體。  
          167.       
          168.     scala沒(méi)有提供continu,而是在 for中提供了條件過(guò)濾來(lái)替代  
          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.     /*按鈕事件輔助接口,用于把一個(gè) 事件處理函數(shù)轉(zhuǎn)換為ButtonPressListener對(duì)象,也可以采取更高級(jí)的內(nèi)容,使用implicit,這里沒(méi)有使用*/  
          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.     主函數(shù)  
          199.     符合Pivot主函數(shù)入口規(guī)則  
          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時(shí):

          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時(shí)

          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 閱讀(636) 評(píng)論(0)  編輯  收藏 所屬分類: java魔力scala-fun!
          主站蜘蛛池模板: 林芝县| 邵武市| 甘孜县| 文化| 临朐县| 武乡县| 威远县| 汽车| 汝州市| 本溪市| 凯里市| 大埔区| 灵寿县| 怀远县| 合江县| 色达县| 天峨县| 洛隆县| 宁陕县| 康马县| 孝感市| 平顶山市| 彭山县| 仁化县| 吴江市| 肇东市| 凉山| 姚安县| 六安市| 视频| 安乡县| 延吉市| 离岛区| 兖州市| 阿荣旗| 淮滨县| 松原市| 嘉祥县| 松滋市| 凤凰县| 达日县|