`
newzai
  • 浏览: 13703 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Apache Pivot + Scala编写的一个小应用:日志分析

阅读更多
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}

/*为了避免和scala.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 ,使得编译器可以生成标准的JavaBean对象的getter/setter接口 
	val 只生成了getter
	var 同时生成了getter和setter */
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关键字是必须的,在java中使用的是注解 @override,但是java中@override并不是必须的。
		省略了 函数还回值,由编译器进行类型推演得到
	*/
  override def toString()  = {
    threadName +" "+date +" "+ time +" "+module +" "+level+" "+content
  }

}

/*
	LogRecord 类的半生对象
	定义了 scala中的魔术接口 apply ,使得可以使用  LogRecord("sting 文本") 可以创建一个class LogRecord对象。
	apply方法的调用由编译器自动调用,我们只负责定义即可
	我们要解析的日志格式
	
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 {
    	/*如果模式匹配成功,threadName,date,time,module,level 分配按次序绑定到模式匹配表达式中()的内容 */
      case logRegex(threadName,date,time,module,level) =>
          val logRecord: LogRecord = new LogRecord( threadName, date, time, module, level,line)
            logRecord
			/*模式匹配通配符,在没有匹配到的情况下,做通用处理。如果不添加,在匹配不到时会抛出 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对象的 列表项目的渲染。
	如果使用默认的,那么ListView显示对象时,直接调用对象的toString获得其字符串表示
*/
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)

     
        }
  }


  
}

/**
	定义主窗口界面代码,必须继承自 org.apache.pivot.Application
	使用了 @WTKX注解,该注解属于 wtkx的命名对象的绑定语法,在从wtkx文件加载GUI时,
	调用bind接口可以自动和wtkx文件中声明的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

		/*从xml(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)

  }

	/*浏览按钮事件处理,打开一个文件浏览窗口,让用户选择文件,并在用户关闭对话框时,捕获用户选择的文件名*/
  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)
          }
      }
    })
  }
  
  /*从log文件加载内容,每一行是一个日志记录
  	for中使用了 if过滤器,只有条件符合了,才会进入for循环体。
  	
  	scala没有提供continu,而是在 for中提供了条件过滤来替代
  */
  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)
    
  }
	/*按钮事件辅助接口,用于把一个 事件处理函数转换为ButtonPressListener对象,也可以采取更高级的内容,使用implicit,这里没有使用*/
   def function2Listener( fun : Button => Unit ) :ButtonPressListener =  {
    val listener = new ButtonPressListener()
    {
      def buttonPressed(button: Button) = {
        fun(button)
      }
    }

    listener
  }
}

/*
	主函数
	符合Pivot主函数入口规则
*/
object LogAnalyse {
  def main ( args : Array[String]) : Unit = {

  	
    DesktopApplicationContext.main( classOf[MainWindow], args)
   

  }
}

 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

分享到:
评论

相关推荐

    Excel Power Pivot数据建模分析(进阶篇)资料.zip

    TOPN分析是Power Pivot中的一个强大功能,允许用户根据特定条件(如销售额、利润等)选取最重要的N个条目,这对于决策支持和业务洞察至关重要。 2. **移动平均**:移动平均是统计分析中常用的一种平滑数据的方法,...

    PowerPivot的数据分析

    标题《PowerPivot的数据分析》所涵盖的知识点主要围绕Microsoft Excel 2010中的PowerPivot工具,这是微软为数据分析师提供的一个强大的数据建模工具,用以增强Excel的数据分析功能。从内容概览可以看出,本书全面地...

    pivot-wtk-skin-terra-2.0.1-build001.zip

    Apache Pivot是一个开源的用户界面开发框架,它允许开发者创建富客户端应用,支持多种平台。Terra是Pivot中的一款皮肤,提供了现代化的界面设计。这个压缩包可能是对Terra皮肤的更新或增强版。 描述中提到的"bar...

    EXCEL快捷键大全和EXCEL_常用技巧整理.doc

    - `Alt+.`:在单元格引用中跳转到下一个冒号。 - `F4`:在绝对引用、相对引用和混合引用间切换。 3. **查找与替换**: - `Ctrl+F`:打开查找对话框。 - `Ctrl+H`:打开替换对话框。 4. **工作表操作**: - `...

    EXEL快捷键大全

    - 选中下一个单元格:`Shift + Ctrl + Page Down` - 移动到上一行:`Ctrl + Page Up` - 移动到下一行:`Ctrl + Page Down` - 选择上方单元格:`Ctrl + 上箭头` - 选择下方单元格:`Ctrl + 下箭头` #### 二、...

    搜集的Pivot例子

    例如,一个例子可能是关于如何利用Pivot进行多维度分析,另一个可能是关于如何创建交互式Pivot,让用户能够自定义视图。 5. 官方说明资料:这些资料可能包括Pivot的使用教程、常见问题解答和最佳实践。它们可以帮助...

    Unity3D快捷键

    - **Ctrl + Shift + Tab**: 上一个窗口(Previous Window) - **Ctrl + Alt + F4**: 退出(Quit) **7. 工具(Tools)** - **Q**: 平移(Pan) - **W**: 移动(Move) - **E**: 旋转(Rotate) - **R**: 缩放(Scale) - **Z**: ...

    PowerPivot 入门手册_giantu54_PowerPivot_

    作为一个入门手册,本书将帮助初学者理解和掌握PowerPivot的核心概念和操作,从而在日常工作中更有效地处理和分析大量数据。 1. **PowerPivot概述** - PowerPivot是Excel的一个扩展插件,旨在处理和管理超大数据集...

    asp.net 实现Pivot表

    行列转换则是Pivot表的另一个重要特性。在ASP.NET中,可以通过改变数据源的结构,或者使用控件的属性和事件来实现这一功能。例如,可以设置PivotGrid的行和列字段,动态调整显示的维度和度量。 在提供的压缩包文件...

    微软Excel 2013:用PowerPivot 建立数据模型

    Microsoft Excel是进行数据分析的世界标准,其易用性和强大功能使得Excel电子表格成为人人使用的工具,无论分析何种信息。在写这本书时,我们决定把重点放在概念和实例上,从零开始带你掌握DAX语言。《微软Excel ...

    pivot_130_beta2_full_thumb3hr_pivot_php_

    "pivot_130_beta2_full_thumb3hr_pivot_php_" 这个标题提到了一个软件版本,"pivot 130 beta2 full version",这表明我们在讨论的是 Pivot 软件的第 130 版本的 Beta 2(测试版2)。"full version" 指的是这个版本是...

    Oracle行转列之pivot

    一个简单的PIVOT操作示例中,首先可以查看基础数据,例如: ```sql SELECT job, deptno, SUM(sal) AS sum_sal FROM emp GROUP BY job, deptno ORDER BY job, deptno; ``` 这将根据职位和部门汇总薪水。使用PIVOT进行...

    SQL Server 关于Pivot详解

    这个 Pivot 语句将成绩表转化为一个透视表,其中每一行代表一个学生,每一列代表一个课程号,单元格中的值为该学生在该课程的成绩。 实验题目 1. 使用 Pivot 语句将成绩表转化为透视表,显示每个学生的平均成绩。 ...

    Gauss_pivot.zip_pivot_数值分析pivot

    高斯迭代解方程 数值分析 西安交通大学 作业

    power pivot and power BI

    - **Power Pivot**:是Microsoft Excel的一个附加组件,它为用户提供了高级的数据分析工具,允许在Excel环境中处理大规模数据集。通过Power Pivot,用户可以创建复杂的数据模型、计算列和度量值,并进行高级数据分析...

    Pivot Lines TimeZone - MetaTrader 4脚本.zip

    总的来说,"Pivot Lines TimeZone"是MT4平台上的一个重要工具,它结合了枢轴点分析与时区适应性,为交易者提供了更精准的市场洞察。通过理解其工作原理和应用方法,交易者可以充分利用这一工具优化交易决策,提高...

    Pivot.Table.Data.Crunching.for.Microsoft.Office.Excel.2007.Jan.2007.pdf

    本章将介绍如何将多个数据源合并到同一个 PivotTable 中进行分析。这包括从多个工作表或工作簿中提取数据、从外部数据库导入数据等方法。 #### 九、与他人共享 PivotTable - **第8章:与他人共享 PivotTable** 本...

    pivot-luke-5.5.0-luke-release.zip

    在信息技术领域,全文检索是一个不可或缺的部分,而Lucene作为Apache软件基金会的一款高性能、全文检索引擎库,被广泛应用于各种搜索系统中。然而,对于开发者而言,直接操作Lucene的索引库可能会显得复杂且不便,这...

    Gauss_pivot.zip_gausspivot_matlab pivot_pivot_pivot of gauss_高斯p

    1. **选择主元**:从矩阵的第一列开始,选择绝对值最大的元素作为主元,将其所在行与首行交换,确保首行的第一个元素非零。 2. **行消元**:对首行以下的每一行,通过乘以适当的常数并加减首行,使得下一行的第一个...

Global site tag (gtag.js) - Google Analytics