JUDE API を使ったクラスの出力 - Groovy と Scala

以前 id:fits:20070515 は JRuby から JUDE API を使ったが、今回は Groovy と Scala で .jude ファイル内の全クラス(IClass インターフェース実装オブジェクト)を出力するような簡単なスクリプトを書いてみた。

実行に使った環境は以下の通り。

  • Groovy 1.5.6
  • Scala 2.7.1

なお、IClass インターフェースで判定するとユースケースやアクター等も含まれる。

  • ユースケースは、IClass を extends した IUseCase の実装オブジェクト
  • アクターは、IClass の実装オブジェクトでステレオタイプが "actor"

Groovy で処理

まず、Groovy。args でスクリプト実行時の引数を参照。

class_listup.groovy
import com.change_vision.jude.api.inf.project.*
import com.change_vision.jude.api.inf.model.*

scriptName = System.getProperty("script.name")

if (args.length < 1) {
    println "groovy ${scriptName} [jude fileName]"
    return
}

def printClasses(packageObj) {
    packageObj.ownedElements.each {
        if (it instanceof IClass) {
            println it.name
        }
        else if(it instanceof IPackage) {
            printClasses(it)
        }
    }
}

def pro = ProjectAccessorFactory.projectAccessor
pro.open(args[0])

printClasses(pro.project)

pro.close()

Scala で処理

次に Scala。パターンマッチングでクラスの判定をやってるのが特徴。
Groovy と同様に args で実行時の引数を参照。

class_listup.scala
import com.change_vision.jude.api.inf.project.ProjectAccessorFactory
import com.change_vision.jude.api.inf.model.{IClass, IPackage}

if (args.length < 1) {
    println("scala class_listup.scala [jude fileName]")
    return
}

def printClasses(packageObj: IPackage): Unit = {
    packageObj.getOwnedElements.foreach {el =>
        el match {
            case o: IClass => println(o.getName)
            case p: IPackage => printClasses(p)
        }
    }
}

val pro = ProjectAccessorFactory.getProjectAccessor
pro.open(args(0))

printClasses(pro.getProject)

pro.close

実行は以下の通り。(%JUDE_HOME% は JUDE のインストールディレクトリへのパス)

>scala -classpath %JUDE_HOME%\jude-api.jar;%JUDE_HOME%\jude-community.jar  class_listup.scala test.jude