Seasar Conference 2009 Autumnでのデモ
Seasar Conference 2009 Autumn 「Javaプログラマに捧げるScala入門」でデモで使ったソースです。
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) } }