﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-ivaneeo's blog-随笔分类-scala-fun！</title><link>http://www.blogjava.net/ivanwan/category/47448.html</link><description>自由的力量，自由的生活。</description><language>zh-cn</language><lastBuildDate>Sat, 25 Dec 2010 16:52:43 GMT</lastBuildDate><pubDate>Sat, 25 Dec 2010 16:52:43 GMT</pubDate><ttl>60</ttl><item><title>高手组合 Scala整合Spring框架</title><link>http://www.blogjava.net/ivanwan/archive/2010/12/25/341536.html</link><dc:creator>ivaneeo</dc:creator><author>ivaneeo</author><pubDate>Sat, 25 Dec 2010 15:15:00 GMT</pubDate><guid>http://www.blogjava.net/ivanwan/archive/2010/12/25/341536.html</guid><wfw:comment>http://www.blogjava.net/ivanwan/comments/341536.html</wfw:comment><comments>http://www.blogjava.net/ivanwan/archive/2010/12/25/341536.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ivanwan/comments/commentRss/341536.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ivanwan/services/trackbacks/341536.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Scala近期正式发布了2.8版本，这门优秀的编程语言将简洁、清晰的语法与面向对象和函数式编程范式无缝融合起来，同时又完全兼容于Java，这样Scala就能使用Java开发者所熟知的Java API和众多的框架了。在这种情况下，我们可以通过Scala改进并简化现有的Java框架。此外，Scala的学习门槛也非常低，因为我们可以轻松将其集成到&#8220;众所周知的Java世界中&#8221;。...&nbsp;&nbsp;<a href='http://www.blogjava.net/ivanwan/archive/2010/12/25/341536.html'>阅读全文</a><img src ="http://www.blogjava.net/ivanwan/aggbug/341536.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ivanwan/" target="_blank">ivaneeo</a> 2010-12-25 23:15 <a href="http://www.blogjava.net/ivanwan/archive/2010/12/25/341536.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Interop Between Java and Scala</title><link>http://www.blogjava.net/ivanwan/archive/2010/12/25/341534.html</link><dc:creator>ivaneeo</dc:creator><author>ivaneeo</author><pubDate>Sat, 25 Dec 2010 15:08:00 GMT</pubDate><guid>http://www.blogjava.net/ivanwan/archive/2010/12/25/341534.html</guid><wfw:comment>http://www.blogjava.net/ivanwan/comments/341534.html</wfw:comment><comments>http://www.blogjava.net/ivanwan/archive/2010/12/25/341534.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ivanwan/comments/commentRss/341534.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ivanwan/services/trackbacks/341534.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Sometimes, the simplest things are the most difficult to explain.&nbsp; Scala&#8217;s interoperability with Java is completely unparalleled, even including languages like Groovy which tout their tight...&nbsp;&nbsp;<a href='http://www.blogjava.net/ivanwan/archive/2010/12/25/341534.html'>阅读全文</a><img src ="http://www.blogjava.net/ivanwan/aggbug/341534.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ivanwan/" target="_blank">ivaneeo</a> 2010-12-25 23:08 <a href="http://www.blogjava.net/ivanwan/archive/2010/12/25/341534.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Unit意义</title><link>http://www.blogjava.net/ivanwan/archive/2010/12/25/341511.html</link><dc:creator>ivaneeo</dc:creator><author>ivaneeo</author><pubDate>Sat, 25 Dec 2010 02:59:00 GMT</pubDate><guid>http://www.blogjava.net/ivanwan/archive/2010/12/25/341511.html</guid><wfw:comment>http://www.blogjava.net/ivanwan/comments/341511.html</wfw:comment><comments>http://www.blogjava.net/ivanwan/archive/2010/12/25/341511.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ivanwan/comments/commentRss/341511.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ivanwan/services/trackbacks/341511.html</trackback:ping><description><![CDATA[<font color="#8000ff"><strong>Unit的结果类型指的是函数没有返回有用的值。Scala的Unit类型比较接近Java的void类型，而且实际上Java里每一个返回void的方法都被映射为Scala里返回Unit的方法</strong></font>。因此结果类型为Unit的方法，仅仅是为了它们的副作用而运行。
<img src ="http://www.blogjava.net/ivanwan/aggbug/341511.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ivanwan/" target="_blank">ivaneeo</a> 2010-12-25 10:59 <a href="http://www.blogjava.net/ivanwan/archive/2010/12/25/341511.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Apache Pivot + Scala编写的一个小应用：日志分析</title><link>http://www.blogjava.net/ivanwan/archive/2010/12/23/341411.html</link><dc:creator>ivaneeo</dc:creator><author>ivaneeo</author><pubDate>Thu, 23 Dec 2010 12:37:00 GMT</pubDate><guid>http://www.blogjava.net/ivanwan/archive/2010/12/23/341411.html</guid><wfw:comment>http://www.blogjava.net/ivanwan/comments/341411.html</wfw:comment><comments>http://www.blogjava.net/ivanwan/archive/2010/12/23/341411.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ivanwan/comments/commentRss/341411.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ivanwan/services/trackbacks/341411.html</trackback:ping><description><![CDATA[<br />
<div class="blog_title">
<h3><a href="http://swing.group.javaeye.com/group/blog/748665">Apache Pivot + Scala编写的一个小应用：日志分析</a></h3>
</div>
<div class="blog_content">
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Scala代码 </div>
</div>
<ol class="dp-default" start="1">
    <li><span><span>package&nbsp;org.apache.pivot.scala.log&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>import&nbsp;scala.reflect.BeanProperty&nbsp;&nbsp;</span></li>
    <li><span>import&nbsp;io.Source&nbsp;&nbsp;</span></li>
    <li><span>import&nbsp;org.apache.pivot.wtk.content.ListViewItemRenderer&nbsp;&nbsp;</span></li>
    <li><span>import&nbsp;java.lang.String&nbsp;&nbsp;</span></li>
    <li><span>import&nbsp;org.apache.pivot.wtkx.{WTKX,&nbsp;WTKXSerializer}&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>/*为了避免和scala.Application的名称冲突，这里修改了别名*/&nbsp;&nbsp;</span></li>
    <li><span>import&nbsp;org.apache.pivot.wtk.{&nbsp;Application&nbsp;=&gt;&nbsp;PivotApplication,&nbsp;_}&nbsp;&nbsp;</span></li>
    <li><span>import&nbsp;org.apache.pivot.collections.{ArrayList,&nbsp;Map}&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>/**&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;*&nbsp;Created&nbsp;by&nbsp;IntelliJ&nbsp;IDEA.&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;*&nbsp;User:&nbsp;Administrator&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;*&nbsp;Date:&nbsp;<span class="number">2010</span><span>-</span><span class="number">8</span><span>-</span><span class="number">26</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;*&nbsp;Time:&nbsp;<span class="number">10</span><span>:</span><span class="number">36</span><span>:</span><span class="number">45</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;*&nbsp;To&nbsp;change&nbsp;this&nbsp;template&nbsp;use&nbsp;File&nbsp;|&nbsp;Settings&nbsp;|&nbsp;File&nbsp;Templates.&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;*/&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>/*日志记录Bean对象,由于Scala标准生成的字段不使用getter/setter的格式，&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;但是提供了注解&nbsp;@scala.reflect.BeanProperty&nbsp;，使得编译器可以生成标准的JavaBean对象的getter/setter接口&nbsp;&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;val&nbsp;只生成了getter&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;同时生成了getter和setter&nbsp;*/&nbsp;&nbsp;</span></li>
    <li><span>class&nbsp;LogRecord&nbsp;(&nbsp;@BeanProperty&nbsp;val&nbsp;threadName&nbsp;:&nbsp;String,&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@BeanProperty&nbsp;val&nbsp;date&nbsp;:&nbsp;String,&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@BeanProperty&nbsp;val&nbsp;time&nbsp;:&nbsp;String,&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@BeanProperty&nbsp;val&nbsp;module&nbsp;:&nbsp;String,&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@BeanProperty&nbsp;val&nbsp;level&nbsp;:&nbsp;String,&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@BeanProperty&nbsp;val&nbsp;content&nbsp;:&nbsp;String){&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;重载了&nbsp;Any的&nbsp;toString接口&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;override关键字是必须的，在java中使用的是注解&nbsp;@override,但是java中@override并不是必须的。&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;省略了&nbsp;函数还回值，由编译器进行类型推演得到&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;*/&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;override&nbsp;def&nbsp;toString()&nbsp;&nbsp;=&nbsp;{&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;threadName&nbsp;+<span class="string">"&nbsp;"</span><span>+date&nbsp;+</span><span class="string">"&nbsp;"</span><span>+&nbsp;time&nbsp;+</span><span class="string">"&nbsp;"</span><span>+module&nbsp;+</span><span class="string">"&nbsp;"</span><span>+level+</span><span class="string">"&nbsp;"</span><span>+content&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>}&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>/*&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;LogRecord&nbsp;类的半生对象&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;定义了&nbsp;scala中的魔术接口&nbsp;apply&nbsp;，使得可以使用&nbsp;&nbsp;LogRecord(<span class="string">"sting&nbsp;文本"</span><span>)&nbsp;可以创建一个class&nbsp;LogRecord对象。&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;apply方法的调用由编译器自动调用，我们只负责定义即可&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;我们要解析的日志格式&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li>
    <li><span>threadName&nbsp;date&nbsp;&nbsp;&nbsp;&nbsp;time&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;module&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Level&nbsp;&nbsp;&nbsp;content&nbsp;&nbsp;</span></li>
    <li><span>DVOSMAIN&nbsp;<span class="number">08</span><span>/</span><span class="number">26</span><span>/</span><span class="number">10</span><span>&nbsp;</span><span class="number">10</span><span>:</span><span class="number">17</span><span>:</span><span class="number">17</span><span>&nbsp;LOGINFO&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;INFO&nbsp;&nbsp;-&nbsp;Debug&nbsp;level:&nbsp;</span><span class="number">2</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>DVOSMAIN&nbsp;<span class="number">08</span><span>/</span><span class="number">26</span><span>/</span><span class="number">10</span><span>&nbsp;</span><span class="number">10</span><span>:</span><span class="number">17</span><span>:</span><span class="number">17</span><span>&nbsp;LOGINFO&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;INFO&nbsp;&nbsp;-&nbsp;*=ERROR&nbsp;WARNING&nbsp;EXCEPT&nbsp;&nbsp;</span></span></li>
    <li><span>DVOSMAIN&nbsp;<span class="number">08</span><span>/</span><span class="number">26</span><span>/</span><span class="number">10</span><span>&nbsp;</span><span class="number">10</span><span>:</span><span class="number">17</span><span>:</span><span class="number">17</span><span>&nbsp;LOGINFO&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;INFO&nbsp;&nbsp;-&nbsp;LM=*&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>*/&nbsp;&nbsp;</span></li>
    <li><span>object&nbsp;LogRecord&nbsp;{&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;def&nbsp;apply(&nbsp;line&nbsp;:&nbsp;String&nbsp;&nbsp;)&nbsp;:&nbsp;LogRecord&nbsp;=&nbsp;{&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*生成一个&nbsp;Regex对象，用于模式匹配*/&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;val&nbsp;logRegex&nbsp;=&nbsp;<span class="string">""</span><span class="string">"([A-Za-z0-9]+)&nbsp;+([0-9/]*)&nbsp;+([0-9:]*)&nbsp;+([A-Z]*)&nbsp;+:&nbsp;*([A-Z_]+).*"</span><span class="string">""</span><span>.r&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;line&nbsp;match&nbsp;{&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*如果模式匹配成功，threadName,date,time,module,level&nbsp;分配按次序绑定到模式匹配表达式中()的内容&nbsp;*/&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;logRegex(threadName,date,time,module,level)&nbsp;=&gt;&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;val&nbsp;logRecord:&nbsp;LogRecord&nbsp;=&nbsp;new&nbsp;LogRecord(&nbsp;threadName,&nbsp;date,&nbsp;time,&nbsp;module,&nbsp;level,line)&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;logRecord&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*模式匹配通配符，在没有匹配到的情况下，做通用处理。如果不添加，在匹配不到时会抛出&nbsp;MatchError异常*/&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;_&nbsp;=&gt;&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;val&nbsp;logRecord:&nbsp;LogRecord&nbsp;=&nbsp;new&nbsp;LogRecord(<span class="string">"N/A"</span><span>,</span><span class="string">"N/A"</span><span>,</span><span class="string">"N/A"</span><span>,</span><span class="string">"N/A"</span><span>,</span><span class="string">"N/A"</span><span>,</span><span class="string">"N/A"</span><span>)&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;logRecord&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li><span>}&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>/*&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;Apache&nbsp;Pivot&nbsp;ListView&nbsp;ItemRenderer&nbsp;&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;重新定义了如何显示&nbsp;LogRecord对象的&nbsp;列表项目的渲染。&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;如果使用默认的，那么ListView显示对象时，直接调用对象的toString获得其字符串表示&nbsp;&nbsp;</span></li>
    <li><span>*/&nbsp;&nbsp;</span></li>
    <li><span>class&nbsp;LogListViewItemRenderer&nbsp;extends&nbsp;ListViewItemRenderer&nbsp;{&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;imageView.setVisible(false)&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;override&nbsp;def&nbsp;render(item:&nbsp;AnyRef,&nbsp;index:&nbsp;Int,&nbsp;listView:&nbsp;ListView,&nbsp;selected:&nbsp;Boolean,&nbsp;checked:&nbsp;Boolean,&nbsp;highlighted:&nbsp;Boolean,&nbsp;disabled:&nbsp;Boolean)&nbsp;=&nbsp;{&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(&nbsp;item&nbsp;!=&nbsp;null&nbsp;&amp;&amp;&nbsp;item.isInstanceOf[LogRecord])&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;val&nbsp;log&nbsp;=&nbsp;item.asInstanceOf[LogRecord]&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;label.setText(log.content)&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span></li>
    <li><span>}&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>/**&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;定义主窗口界面代码,必须继承自&nbsp;org.apache.pivot.Application&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;使用了&nbsp;@WTKX注解，该注解属于&nbsp;wtkx的命名对象的绑定语法，在从wtkx文件加载GUI时，&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;调用bind接口可以自动和wtkx文件中声明的wtkx:id对象进行绑定，无需在掉吗中调用&nbsp;get(<span class="string">"name"</span><span>)&nbsp;&nbsp;</span></span></li>
    <li><span>*/&nbsp;&nbsp;</span></li>
    <li><span>class&nbsp;MainWindow&nbsp;extends&nbsp;PivotApplication&nbsp;{&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;var&nbsp;window&nbsp;:&nbsp;Window&nbsp;&nbsp;&nbsp;=&nbsp;null&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;@WTKX&nbsp;var&nbsp;textInputFilePath&nbsp;:&nbsp;TextInput&nbsp;&nbsp;=&nbsp;null&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;@WTKX&nbsp;var&nbsp;browsePushButton&nbsp;:&nbsp;PushButton&nbsp;&nbsp;=&nbsp;null&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;@WTKX&nbsp;var&nbsp;loadPushButton&nbsp;:&nbsp;PushButton&nbsp;&nbsp;&nbsp;=&nbsp;null&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;@WTKX&nbsp;var&nbsp;textInputThreadName&nbsp;:TextInput&nbsp;&nbsp;&nbsp;=&nbsp;null&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;@WTKX&nbsp;var&nbsp;textInputModule&nbsp;:&nbsp;TextInput&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;null&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;@WTKX&nbsp;var&nbsp;textInputLevel&nbsp;:&nbsp;TextInput&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;null&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;@WTKX&nbsp;var&nbsp;textInputContent&nbsp;:&nbsp;TextInput&nbsp;&nbsp;&nbsp;=&nbsp;null&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;@WTKX&nbsp;var&nbsp;logListView&nbsp;:&nbsp;ListView&nbsp;=&nbsp;null&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;def&nbsp;resume&nbsp;=&nbsp;{}&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;def&nbsp;suspend&nbsp;=&nbsp;{}&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;def&nbsp;shutdown(optional:&nbsp;Boolean)&nbsp;=&nbsp;{&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(&nbsp;window&nbsp;!=&nbsp;null)&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;window.close&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;true&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;false&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;def&nbsp;startup(display:&nbsp;Display,&nbsp;properties:&nbsp;Map[String,&nbsp;String])&nbsp;=&nbsp;{&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;val&nbsp;wtkxSerializer&nbsp;=&nbsp;new&nbsp;WTKXSerializer()&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;matchString&nbsp;:&nbsp;String&nbsp;=&nbsp;null&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*从xml(wtkx)文件加载GUI*/&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;window&nbsp;=&nbsp;wtkxSerializer.readObject(this,<span class="string">"MainWindow.xml"</span><span>).asInstanceOf[Window]&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;wtkxSerializer.bind(this)&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(&nbsp;properties&nbsp;containsKey&nbsp;<span class="string">"logfile"</span><span>)&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;textInputFilePath&nbsp;setText&nbsp;(&nbsp;properties&nbsp;get&nbsp;<span class="string">"logfile"</span><span>)&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*给&nbsp;Button添加事件处理函数*/&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;browsePushButton.getButtonPressListeners.add(&nbsp;function2Listener&nbsp;(browseButtonPressed&nbsp;)&nbsp;)&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;loadPushButton.getButtonPressListeners.add(&nbsp;function2Listener(loadButtonPressed&nbsp;))&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;window.open(display)&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;/*浏览按钮事件处理，打开一个文件浏览窗口，让用户选择文件，并在用户关闭对话框时，捕获用户选择的文件名*/&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;def&nbsp;browseButtonPressed(&nbsp;button&nbsp;:&nbsp;Button&nbsp;)&nbsp;:&nbsp;Unit&nbsp;=&nbsp;{&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;val&nbsp;dialog&nbsp;:&nbsp;FileBrowserSheet&nbsp;=&nbsp;new&nbsp;&nbsp;&nbsp;FileBrowserSheet(FileBrowserSheet.Mode.OPEN)&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;dialog.open(&nbsp;window,&nbsp;new&nbsp;SheetCloseListener()&nbsp;{&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;def&nbsp;sheetClosed(sheet:&nbsp;Sheet)&nbsp;=&nbsp;{&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(&nbsp;sheet.getResult)&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;val&nbsp;fileBrowseSheet&nbsp;=&nbsp;sheet.asInstanceOf[FileBrowserSheet]&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;textInputFilePath.setText(&nbsp;fileBrowseSheet.getSelectedFile.getPath.toString)&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;})&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;/*从log文件加载内容，每一行是一个日志记录&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;for中使用了&nbsp;if过滤器，只有条件符合了，才会进入for循环体。&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;scala没有提供continu，而是在&nbsp;for中提供了条件过滤来替代&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;*/&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;def&nbsp;loadButtonPressed(&nbsp;button&nbsp;:&nbsp;Button&nbsp;)&nbsp;:&nbsp;Unit&nbsp;=&nbsp;{&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;val&nbsp;logFile&nbsp;=&nbsp;Source.fromFile(textInputFilePath.getText)&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;val&nbsp;list&nbsp;=&nbsp;new&nbsp;ArrayList[LogRecord]&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(&nbsp;line&nbsp;&lt;-&nbsp;logFile.getLines&nbsp;;&nbsp;logRecord&nbsp;=&nbsp;LogRecord(line.trim);&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(&nbsp;textInputThreadName.getText&nbsp;==&nbsp;<span class="string">""</span><span>&nbsp;||&nbsp;textInputThreadName.getText.contains(logRecord.threadName)&nbsp;);&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(&nbsp;textInputModule.getText&nbsp;==&nbsp;<span class="string">""</span><span>&nbsp;||&nbsp;textInputModule.getText.contains(logRecord.module));&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(&nbsp;textInputLevel.getText&nbsp;==&nbsp;<span class="string">""</span><span>&nbsp;||&nbsp;textInputLevel.getText.contains(logRecord.level))){&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;list&nbsp;add&nbsp;logRecord&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;logListView.setListData(&nbsp;list)&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;/*按钮事件辅助接口，用于把一个&nbsp;事件处理函数转换为ButtonPressListener对象，也可以采取更高级的内容，使用implicit,这里没有使用*/&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;def&nbsp;function2Listener(&nbsp;fun&nbsp;:&nbsp;Button&nbsp;=&gt;&nbsp;Unit&nbsp;)&nbsp;:ButtonPressListener&nbsp;=&nbsp;&nbsp;{&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;val&nbsp;listener&nbsp;=&nbsp;new&nbsp;ButtonPressListener()&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;def&nbsp;buttonPressed(button:&nbsp;Button)&nbsp;=&nbsp;{&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fun(button)&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;listener&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li><span>}&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>/*&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;主函数&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;符合Pivot主函数入口规则&nbsp;&nbsp;</span></li>
    <li><span>*/&nbsp;&nbsp;</span></li>
    <li><span>object&nbsp;LogAnalyse&nbsp;{&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;def&nbsp;main&nbsp;(&nbsp;args&nbsp;:&nbsp;Array[String])&nbsp;:&nbsp;Unit&nbsp;=&nbsp;{&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;DesktopApplicationContext.main(&nbsp;classOf[MainWindow],&nbsp;args)&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li><span>}&nbsp;&nbsp;</span></li>
</ol>
</div>
<pre style="display: none;" name="code" class="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 =&gt; 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) =&gt;
val logRecord: LogRecord = new LogRecord( threadName, date, time, module, level,line)
logRecord
/*模式匹配通配符，在没有匹配到的情况下，做通用处理。如果不添加，在匹配不到时会抛出 MatchError异常*/
case _ =&gt;
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 &amp;&amp; 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 &lt;- 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 =&gt; 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)
}
}</pre>
<p>&nbsp;run：</p>
<p>使用 java时：</p>
<p>java&nbsp; -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 </p>
<p>&nbsp;</p>
<p>使用 scala时</p>
<p>java&nbsp; -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 </p>
</div>
<img src ="http://www.blogjava.net/ivanwan/aggbug/341411.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ivanwan/" target="_blank">ivaneeo</a> 2010-12-23 20:37 <a href="http://www.blogjava.net/ivanwan/archive/2010/12/23/341411.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>