- package org.apache.pivot.scala.log
-
- import scala.reflect.BeanProperty
- import io.Source
- import org.apache.pivot.wtk.content.ListViewItemRenderer
- import java.lang.String
- import org.apache.pivot.wtkx.{WTKX, WTKXSerializer}
-
- /*涓轟簡閬垮厤鍜宻cala.Application鐨勫悕縐板啿紿侊紝榪欓噷淇敼浜嗗埆鍚?/
- import org.apache.pivot.wtk.{ Application => PivotApplication, _}
- import org.apache.pivot.collections.{ArrayList, Map}
-
- /**
- * Created by IntelliJ IDEA.
- * User: Administrator
- * Date: 2010-8-26
- * Time: 10:36:45
- * To change this template use File | Settings | File Templates.
- */
-
- /*鏃ュ織璁板綍Bean瀵硅薄,鐢變簬Scala鏍囧噯鐢熸垚鐨勫瓧孌典笉浣跨敤getter/setter鐨勬牸寮忥紝
- 浣嗘槸鎻愪緵浜嗘敞瑙?nbsp;@scala.reflect.BeanProperty 錛屼嬌寰楃紪璇戝櫒鍙互鐢熸垚鏍囧噯鐨凧avaBean瀵硅薄鐨刧etter/setter鎺ュ彛
- val 鍙敓鎴愪簡getter
- var 鍚屾椂鐢熸垚浜唃etter鍜宻etter */
- class LogRecord ( @BeanProperty val threadName : String,
- @BeanProperty val date : String,
- @BeanProperty val time : String,
- @BeanProperty val module : String,
- @BeanProperty val level : String,
- @BeanProperty val content : String){
-
- /*
- 閲嶈澆浜?nbsp;Any鐨?nbsp;toString鎺ュ彛
- override鍏抽敭瀛楁槸蹇呴』鐨勶紝鍦╦ava涓嬌鐢ㄧ殑鏄敞瑙?nbsp;@override,浣嗘槸java涓瑻override騫朵笉鏄繀欏葷殑銆?nbsp;
- 鐪佺暐浜?nbsp;鍑芥暟榪樺洖鍊鹼紝鐢辯紪璇戝櫒榪涜綾誨瀷鎺ㄦ紨寰楀埌
- */
- override def toString() = {
- threadName +" "+date +" "+ time +" "+module +" "+level+" "+content
- }
-
- }
-
- /*
- LogRecord 綾葷殑鍗婄敓瀵硅薄
- 瀹氫箟浜?nbsp;scala涓殑欖旀湳鎺ュ彛 apply 錛屼嬌寰楀彲浠ヤ嬌鐢?nbsp; LogRecord("sting 鏂囨湰") 鍙互鍒涘緩涓涓猚lass LogRecord瀵硅薄銆?nbsp;
- apply鏂規(guī)硶鐨勮皟鐢ㄧ敱緙栬瘧鍣ㄨ嚜鍔ㄨ皟鐢紝鎴戜滑鍙礋璐e畾涔夊嵆鍙?nbsp;
- 鎴戜滑瑕佽В鏋愮殑鏃ュ織鏍煎紡
-
- threadName date time module Level content
- DVOSMAIN 08/26/10 10:17:17 LOGINFO : INFO - Debug level: 2
- DVOSMAIN 08/26/10 10:17:17 LOGINFO : INFO - *=ERROR WARNING EXCEPT
- DVOSMAIN 08/26/10 10:17:17 LOGINFO : INFO - LM=*
-
- */
- object LogRecord {
- def apply( line : String ) : LogRecord = {
-
- /*鐢熸垚涓涓?nbsp;Regex瀵硅薄錛岀敤浜庢ā寮忓尮閰?/
- val logRegex = """([A-Za-z0-9]+) +([0-9/]*) +([0-9:]*) +([A-Z]*) +: *([A-Z_]+).*""".r
-
- line match {
- /*濡傛灉妯″紡鍖歸厤鎴愬姛錛宼hreadName,date,time,module,level 鍒嗛厤鎸夋搴忕粦瀹氬埌妯″紡鍖歸厤琛ㄨ揪寮忎腑()鐨勫唴瀹?nbsp;*/
- case logRegex(threadName,date,time,module,level) =>
- val logRecord: LogRecord = new LogRecord( threadName, date, time, module, level,line)
- logRecord
- /*妯″紡鍖歸厤閫氶厤絎︼紝鍦ㄦ病鏈夊尮閰嶅埌鐨勬儏鍐典笅錛屽仛閫氱敤澶勭悊銆傚鏋滀笉娣誨姞錛屽湪鍖歸厤涓嶅埌鏃朵細(xì)鎶涘嚭 MatchError寮傚父*/
- case _ =>
- val logRecord: LogRecord = new LogRecord("N/A","N/A","N/A","N/A","N/A","N/A")
- logRecord
- }
-
- }
- }
-
- /*
- Apache Pivot ListView ItemRenderer
- 閲嶆柊瀹氫箟浜嗗浣曟樉紺?nbsp;LogRecord瀵硅薄鐨?nbsp;鍒楄〃欏圭洰鐨勬覆鏌撱?nbsp;
- 濡傛灉浣跨敤榛樿鐨勶紝閭d箞ListView鏄劇ず瀵硅薄鏃訛紝鐩存帴璋冪敤瀵硅薄鐨則oString鑾峰緱鍏跺瓧絎︿覆琛ㄧず
- */
- class LogListViewItemRenderer extends ListViewItemRenderer {
-
- imageView.setVisible(false)
-
- override def render(item: AnyRef, index: Int, listView: ListView, selected: Boolean, checked: Boolean, highlighted: Boolean, disabled: Boolean) = {
- if ( item != null && item.isInstanceOf[LogRecord])
- {
- val log = item.asInstanceOf[LogRecord]
- label.setText(log.content)
-
-
- }
- }
-
-
-
- }
-
- /**
- 瀹氫箟涓葷獥鍙g晫闈唬鐮?蹇呴』緇ф壙鑷?nbsp;org.apache.pivot.Application
- 浣跨敤浜?nbsp;@WTKX娉ㄨВ錛岃娉ㄨВ灞炰簬 wtkx鐨勫懡鍚嶅璞$殑緇戝畾璇硶錛屽湪浠巜tkx鏂囦歡鍔犺澆GUI鏃訛紝
- 璋冪敤bind鎺ュ彛鍙互鑷姩鍜寃tkx鏂囦歡涓0鏄庣殑wtkx:id瀵硅薄榪涜緇戝畾錛屾棤闇鍦ㄦ帀鍚椾腑璋冪敤 get("name")
- */
- class MainWindow extends PivotApplication {
- var window : Window = null
- @WTKX var textInputFilePath : TextInput = null
- @WTKX var browsePushButton : PushButton = null
- @WTKX var loadPushButton : PushButton = null
- @WTKX var textInputThreadName :TextInput = null
- @WTKX var textInputModule : TextInput = null
- @WTKX var textInputLevel : TextInput = null
- @WTKX var textInputContent : TextInput = null
- @WTKX var logListView : ListView = null
-
-
- def resume = {}
-
- def suspend = {}
-
- def shutdown(optional: Boolean) = {
- if ( window != null)
- {
- window.close
- true
- }
- false
- }
-
- def startup(display: Display, properties: Map[String, String]) = {
- val wtkxSerializer = new WTKXSerializer()
- var matchString : String = null
-
- /*浠巟ml(wtkx)鏂囦歡鍔犺澆GUI*/
- window = wtkxSerializer.readObject(this,"MainWindow.xml").asInstanceOf[Window]
-
- wtkxSerializer.bind(this)
- if ( properties containsKey "logfile")
- {
- textInputFilePath setText ( properties get "logfile")
- }
-
- /*緇?nbsp;Button娣誨姞浜嬩歡澶勭悊鍑芥暟*/
- browsePushButton.getButtonPressListeners.add( function2Listener (browseButtonPressed ) )
- loadPushButton.getButtonPressListeners.add( function2Listener(loadButtonPressed ))
-
-
- window.open(display)
-
- }
-
- /*嫻忚鎸夐挳浜嬩歡澶勭悊錛屾墦寮涓涓枃浠舵祻瑙堢獥鍙o紝璁╃敤鎴烽夋嫨鏂囦歡錛屽茍鍦ㄧ敤鎴峰叧闂璇濇鏃訛紝鎹曡幏鐢ㄦ埛閫夋嫨鐨勬枃浠跺悕*/
- def browseButtonPressed( button : Button ) : Unit = {
- val dialog : FileBrowserSheet = new FileBrowserSheet(FileBrowserSheet.Mode.OPEN)
-
- dialog.open( window, new SheetCloseListener() {
- def sheetClosed(sheet: Sheet) = {
- if ( sheet.getResult)
- {
- val fileBrowseSheet = sheet.asInstanceOf[FileBrowserSheet]
- textInputFilePath.setText( fileBrowseSheet.getSelectedFile.getPath.toString)
- }
- }
- })
- }
-
- /*浠巐og鏂囦歡鍔犺澆鍐呭錛屾瘡涓琛屾槸涓涓棩蹇楄褰?nbsp;
- for涓嬌鐢ㄤ簡 if榪囨護(hù)鍣紝鍙湁鏉′歡絎﹀悎浜嗭紝鎵嶄細(xì)榪涘叆for寰幆浣撱?nbsp;
-
- scala娌℃湁鎻愪緵continu錛岃屾槸鍦?nbsp;for涓彁渚涗簡鏉′歡榪囨護(hù)鏉ユ浛浠?nbsp;
- */
- def loadButtonPressed( button : Button ) : Unit = {
- val logFile = Source.fromFile(textInputFilePath.getText)
- val list = new ArrayList[LogRecord]
- for ( line <- logFile.getLines ; logRecord = LogRecord(line.trim);
- if ( textInputThreadName.getText == "" || textInputThreadName.getText.contains(logRecord.threadName) );
- if ( textInputModule.getText == "" || textInputModule.getText.contains(logRecord.module));
- if ( textInputLevel.getText == "" || textInputLevel.getText.contains(logRecord.level))){
-
- list add logRecord
- }
-
- logListView.setListData( list)
-
- }
- /*鎸夐挳浜嬩歡杈呭姪鎺ュ彛錛岀敤浜庢妸涓涓?nbsp;浜嬩歡澶勭悊鍑芥暟杞崲涓築uttonPressListener瀵硅薄錛屼篃鍙互閲囧彇鏇撮珮綰х殑鍐呭錛屼嬌鐢╥mplicit,榪欓噷娌℃湁浣跨敤*/
- def function2Listener( fun : Button => Unit ) :ButtonPressListener = {
- val listener = new ButtonPressListener()
- {
- def buttonPressed(button: Button) = {
- fun(button)
- }
- }
-
- listener
- }
- }
-
- /*
- 涓誨嚱鏁?nbsp;
- 絎﹀悎Pivot涓誨嚱鏁板叆鍙h鍒?nbsp;
- */
- object LogAnalyse {
- def main ( args : Array[String]) : Unit = {
-
-
- DesktopApplicationContext.main( classOf[MainWindow], args)
-
-
- }
- }
package org.apache.pivot.scala.log
import scala.reflect.BeanProperty
import io.Source
import org.apache.pivot.wtk.content.ListViewItemRenderer
import java.lang.String
import org.apache.pivot.wtkx.{WTKX, WTKXSerializer}
/*涓轟簡閬垮厤鍜宻cala.Application鐨勫悕縐板啿紿侊紝榪欓噷淇敼浜嗗埆鍚?/
import org.apache.pivot.wtk.{ Application => PivotApplication, _}
import org.apache.pivot.collections.{ArrayList, Map}
/**
* Created by IntelliJ IDEA.
* User: Administrator
* Date: 2010-8-26
* Time: 10:36:45
* To change this template use File | Settings | File Templates.
*/
/*鏃ュ織璁板綍Bean瀵硅薄,鐢變簬Scala鏍囧噯鐢熸垚鐨勫瓧孌典笉浣跨敤getter/setter鐨勬牸寮忥紝
浣嗘槸鎻愪緵浜嗘敞瑙?@scala.reflect.BeanProperty 錛屼嬌寰楃紪璇戝櫒鍙互鐢熸垚鏍囧噯鐨凧avaBean瀵硅薄鐨刧etter/setter鎺ュ彛
val 鍙敓鎴愪簡getter
var 鍚屾椂鐢熸垚浜唃etter鍜宻etter */
class LogRecord ( @BeanProperty val threadName : String,
@BeanProperty val date : String,
@BeanProperty val time : String,
@BeanProperty val module : String,
@BeanProperty val level : String,
@BeanProperty val content : String){
/*
閲嶈澆浜?Any鐨?toString鎺ュ彛
override鍏抽敭瀛楁槸蹇呴』鐨勶紝鍦╦ava涓嬌鐢ㄧ殑鏄敞瑙?@override,浣嗘槸java涓瑻override騫朵笉鏄繀欏葷殑銆?
鐪佺暐浜?鍑芥暟榪樺洖鍊鹼紝鐢辯紪璇戝櫒榪涜綾誨瀷鎺ㄦ紨寰楀埌
*/
override def toString() = {
threadName +" "+date +" "+ time +" "+module +" "+level+" "+content
}
}
/*
LogRecord 綾葷殑鍗婄敓瀵硅薄
瀹氫箟浜?scala涓殑欖旀湳鎺ュ彛 apply 錛屼嬌寰楀彲浠ヤ嬌鐢? LogRecord("sting 鏂囨湰") 鍙互鍒涘緩涓涓猚lass LogRecord瀵硅薄銆?
apply鏂規(guī)硶鐨勮皟鐢ㄧ敱緙栬瘧鍣ㄨ嚜鍔ㄨ皟鐢紝鎴戜滑鍙礋璐e畾涔夊嵆鍙?
鎴戜滑瑕佽В鏋愮殑鏃ュ織鏍煎紡
threadName date time module Level content
DVOSMAIN 08/26/10 10:17:17 LOGINFO : INFO - Debug level: 2
DVOSMAIN 08/26/10 10:17:17 LOGINFO : INFO - *=ERROR WARNING EXCEPT
DVOSMAIN 08/26/10 10:17:17 LOGINFO : INFO - LM=*
*/
object LogRecord {
def apply( line : String ) : LogRecord = {
/*鐢熸垚涓涓?Regex瀵硅薄錛岀敤浜庢ā寮忓尮閰?/
val logRegex = """([A-Za-z0-9]+) +([0-9/]*) +([0-9:]*) +([A-Z]*) +: *([A-Z_]+).*""".r
line match {
/*濡傛灉妯″紡鍖歸厤鎴愬姛錛宼hreadName,date,time,module,level 鍒嗛厤鎸夋搴忕粦瀹氬埌妯″紡鍖歸厤琛ㄨ揪寮忎腑()鐨勫唴瀹?*/
case logRegex(threadName,date,time,module,level) =>
val logRecord: LogRecord = new LogRecord( threadName, date, time, module, level,line)
logRecord
/*妯″紡鍖歸厤閫氶厤絎︼紝鍦ㄦ病鏈夊尮閰嶅埌鐨勬儏鍐典笅錛屽仛閫氱敤澶勭悊銆傚鏋滀笉娣誨姞錛屽湪鍖歸厤涓嶅埌鏃朵細(xì)鎶涘嚭 MatchError寮傚父*/
case _ =>
val logRecord: LogRecord = new LogRecord("N/A","N/A","N/A","N/A","N/A","N/A")
logRecord
}
}
}
/*
Apache Pivot ListView ItemRenderer
閲嶆柊瀹氫箟浜嗗浣曟樉紺?LogRecord瀵硅薄鐨?鍒楄〃欏圭洰鐨勬覆鏌撱?
濡傛灉浣跨敤榛樿鐨勶紝閭d箞ListView鏄劇ず瀵硅薄鏃訛紝鐩存帴璋冪敤瀵硅薄鐨則oString鑾峰緱鍏跺瓧絎︿覆琛ㄧず
*/
class LogListViewItemRenderer extends ListViewItemRenderer {
imageView.setVisible(false)
override def render(item: AnyRef, index: Int, listView: ListView, selected: Boolean, checked: Boolean, highlighted: Boolean, disabled: Boolean) = {
if ( item != null && item.isInstanceOf[LogRecord])
{
val log = item.asInstanceOf[LogRecord]
label.setText(log.content)
}
}
}
/**
瀹氫箟涓葷獥鍙g晫闈唬鐮?蹇呴』緇ф壙鑷?org.apache.pivot.Application
浣跨敤浜?@WTKX娉ㄨВ錛岃娉ㄨВ灞炰簬 wtkx鐨勫懡鍚嶅璞$殑緇戝畾璇硶錛屽湪浠巜tkx鏂囦歡鍔犺澆GUI鏃訛紝
璋冪敤bind鎺ュ彛鍙互鑷姩鍜寃tkx鏂囦歡涓0鏄庣殑wtkx:id瀵硅薄榪涜緇戝畾錛屾棤闇鍦ㄦ帀鍚椾腑璋冪敤 get("name")
*/
class MainWindow extends PivotApplication {
var window : Window = null
@WTKX var textInputFilePath : TextInput = null
@WTKX var browsePushButton : PushButton = null
@WTKX var loadPushButton : PushButton = null
@WTKX var textInputThreadName :TextInput = null
@WTKX var textInputModule : TextInput = null
@WTKX var textInputLevel : TextInput = null
@WTKX var textInputContent : TextInput = null
@WTKX var logListView : ListView = null
def resume = {}
def suspend = {}
def shutdown(optional: Boolean) = {
if ( window != null)
{
window.close
true
}
false
}
def startup(display: Display, properties: Map[String, String]) = {
val wtkxSerializer = new WTKXSerializer()
var matchString : String = null
/*浠巟ml(wtkx)鏂囦歡鍔犺澆GUI*/
window = wtkxSerializer.readObject(this,"MainWindow.xml").asInstanceOf[Window]
wtkxSerializer.bind(this)
if ( properties containsKey "logfile")
{
textInputFilePath setText ( properties get "logfile")
}
/*緇?Button娣誨姞浜嬩歡澶勭悊鍑芥暟*/
browsePushButton.getButtonPressListeners.add( function2Listener (browseButtonPressed ) )
loadPushButton.getButtonPressListeners.add( function2Listener(loadButtonPressed ))
window.open(display)
}
/*嫻忚鎸夐挳浜嬩歡澶勭悊錛屾墦寮涓涓枃浠舵祻瑙堢獥鍙o紝璁╃敤鎴烽夋嫨鏂囦歡錛屽茍鍦ㄧ敤鎴峰叧闂璇濇鏃訛紝鎹曡幏鐢ㄦ埛閫夋嫨鐨勬枃浠跺悕*/
def browseButtonPressed( button : Button ) : Unit = {
val dialog : FileBrowserSheet = new FileBrowserSheet(FileBrowserSheet.Mode.OPEN)
dialog.open( window, new SheetCloseListener() {
def sheetClosed(sheet: Sheet) = {
if ( sheet.getResult)
{
val fileBrowseSheet = sheet.asInstanceOf[FileBrowserSheet]
textInputFilePath.setText( fileBrowseSheet.getSelectedFile.getPath.toString)
}
}
})
}
/*浠巐og鏂囦歡鍔犺澆鍐呭錛屾瘡涓琛屾槸涓涓棩蹇楄褰?
for涓嬌鐢ㄤ簡 if榪囨護(hù)鍣紝鍙湁鏉′歡絎﹀悎浜嗭紝鎵嶄細(xì)榪涘叆for寰幆浣撱?
scala娌℃湁鎻愪緵continu錛岃屾槸鍦?for涓彁渚涗簡鏉′歡榪囨護(hù)鏉ユ浛浠?
*/
def loadButtonPressed( button : Button ) : Unit = {
val logFile = Source.fromFile(textInputFilePath.getText)
val list = new ArrayList[LogRecord]
for ( line <- logFile.getLines ; logRecord = LogRecord(line.trim);
if ( textInputThreadName.getText == "" || textInputThreadName.getText.contains(logRecord.threadName) );
if ( textInputModule.getText == "" || textInputModule.getText.contains(logRecord.module));
if ( textInputLevel.getText == "" || textInputLevel.getText.contains(logRecord.level))){
list add logRecord
}
logListView.setListData( list)
}
/*鎸夐挳浜嬩歡杈呭姪鎺ュ彛錛岀敤浜庢妸涓涓?浜嬩歡澶勭悊鍑芥暟杞崲涓築uttonPressListener瀵硅薄錛屼篃鍙互閲囧彇鏇撮珮綰х殑鍐呭錛屼嬌鐢╥mplicit,榪欓噷娌℃湁浣跨敤*/
def function2Listener( fun : Button => Unit ) :ButtonPressListener = {
val listener = new ButtonPressListener()
{
def buttonPressed(button: Button) = {
fun(button)
}
}
listener
}
}
/*
涓誨嚱鏁?
絎﹀悎Pivot涓誨嚱鏁板叆鍙h鍒?
*/
object LogAnalyse {
def main ( args : Array[String]) : Unit = {
DesktopApplicationContext.main( classOf[MainWindow], args)
}
}
run錛?/p>
浣跨敤 java鏃訛細(xì)
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鏃?/p>
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