( ꒪⌓꒪) ゆるよろ日記

( ゚∀゚)o彡°オパーイ!オパーイ! ( ;゚皿゚)ノシΣ フィンギィィーーッ!!!

Seasar Conference 2009 Autumnでのデモ

Seasar Conference 2009 Autumn 「Javaプログラマに捧げるScala入門」でデモで使ったソースです。

yuroyoro/s2conAutumn · GitHub

S2Console

勝手に名前つけましたが、要はScalaインタプリタからS2Containerを操作するためのスクリプトです。
このスクリプトはSeasar用ですが、同じような考え方でGuiceやSpringなど他のコンテナも利用できるでしょう。

import _root_.scala.tools.nsc.MainGenericRunner
import scala.reflect.Manifest
import scala.collection.jcl.Conversions._
import org.seasar.framework.container.factory.SingletonS2ContainerFactory
import org.seasar.framework.container.S2Container
import org.seasar.extension.jdbc.JdbcManager

// your pakcages
import com.yuroyoro.scala.sastruts.service._
import com.yuroyoro.scala.sastruts.entity._

val cc = Thread.currentThread( ).getContextClassLoader
Thread.currentThread( ).setContextClassLoader( cc.getParent.getParent  )

implicit lazy val ct:S2Container = {
  SingletonS2ContainerFactory.init
  SingletonS2ContainerFactory.getContainer
}

def typeOf[T](implicit ct: S2Container, m: Manifest[T]):T =
  ct.getComponent( m.erasure ).asInstanceOf[T]

def nameOf[T]( name:String )(implicit ct: S2Container,  m: Manifest[T]):T =
  ct.getComponent( name ).asInstanceOf[T]

val jm = typeOf[JdbcManager]

使い方

1.pom.xmlに、maven-scala-toolsを追記します。
  <!-- ▼ 追加 -->
  <properties>
    <scala.version>2.7.5</scala.version>
  </properties>
  <!-- ▲ 追加 -->

  <pluginRepositories>
    <!-- ▼ 追加 -->
    <pluginRepository>
      <id>scala-tools.org</id>
      <name>Scala-Tools Maven2 Repository</name>
      <url>http://scala-tools.org/repo-releases</url>
    </pluginRepository>
    <!-- ▲ 追加 -->
  </pluginRepositories>

  <repositories>
    <!-- ▼ 追加 -->
    <repository>
      <id>scala-tools.org</id>
      <name>Scala-Tools Maven2 Repository</name>
      <url>http://scala-tools.org/repo-releases</url>
    </repository>
    <!-- ▲ 追加 -->
  </repositories>

  <dependencies>
    <!-- ▼ 追加 -->
    <dependency>
      <groupId>org.scala-lang</groupId>
      <artifactId>scala-library</artifactId>
      <version>${scala.version}</version>
    </dependency>
    <dependency>
      <groupId>org.scala-lang</groupId>
      <artifactId>scala-compiler</artifactId>
      <version>${scala.version}</version>
    </dependency>
    <dependency>
      <groupId>org.scala-tools.testing</groupId>
      <artifactId>specs</artifactId>
      <version>1.4.4</version>
      <scope>test</scope>
    </dependency>
    <!-- ▲ 追加 -->
  </dependencies>
  
 <build>
    <plugins>
      <!-- ▼ 追加 -->
      <plugin>
        <groupId>org.scala-tools</groupId>
        <artifactId>maven-scala-plugin</artifactId>
        <executions>
          <execution>
            <goals>
              <goal>compile</goal>
              <goal>testCompile</goal>
            </goals>
          </execution>
        </executions>
        <configuration>
          <scalaVersion>${scala.version}</scalaVersion>
        </configuration>
      </plugin>
      <!-- ▲ 追加 -->
    </plugins>
 </build>
2.パッケージのインポートを追加する

S2Console.scalaの中で、利用するプロジェクトのパッケージ名に応じたimportを追加します。

// your pakcages ここのパッケージ名を修正してネ☆
import com.yuroyoro.scala.sastruts.service._
import com.yuroyoro.scala.sastruts.entity._
3.コンパイルしておく

mvn complieなどでコンパイルします。

4.インタプリタ起動

mvn scala:console でscalaインタプリタを起動します。

5.S2Console.scalaをLoadする

インタプリタ上で、:load S2Console.scalaと入力してスクリプトを読み込みます。

scala > :load S2Console.scala
6.コンポーネントを取り出す

typeOf[クラス名]やnameOf("コンポーネント名")でコンポーネントをコンテナから取得できます。

scala > val dept = typeOf[DeptService]
scala > dept.findAll // 検索
scala > dept.findAll.foreach( d => println( d.deptNo + ":" + d.deptName )) // scalaのコレクションAPIを利用
10:ACCOUNTING
20:RESEARCH
30:SALES
40:OPERATIONS
99:Hoge
100:hogehoge

scala> val d = new Dept    // entityを作成
scala> d.deptNo = 111
scala> d.deptName = "Dept1"
scala> d.loc="Tokyo"
scala> dept.insert(d)  // insertする!

ハッシュタグ抽出

S2ConHashTag.scala
content内のHTMLタグ除去でお作法的によくないことしてますんでそこはあまり参考にしないで><

import scala.xml._
import scala.io.Source
 
object S2ConHashTag extends Application{
    val url = "http://search.twitter.com/search.atom?q=sc2009autumn"
    val source = Source.fromURL( url )
    val xml = XML.loadString( source.getLines.mkString )
    for( entry <- xml \\ "entry" ;
         c = entry \\ "content" text ;
         user = entry \\ "author" \\ "name" text ){
     val cxml = XML.loadString("<c>" + c + "</c>" )
     println(user + ":" + cxml.child.text)
    }
}