インストールや基本的な動かし方は、公式サイトを見てください。あと、今回作ったスクリプトは別エントリで公開しようと思ってる。例によって、VDM絡みのスクリプト。
気をつけること
getNameで取れるのは、JavaScriptのStringではない
Javaのjava.lang.Stringじゃないかと。
文字列比較が == ではできなくてequals使う必要あるし、typeofするとObjectになる。
getProjectで取れる要素の意味
開いているプロジェクトのトップ階層がAPI説明で言うところの「起点となるモデル」。
最初分からなくて、自分で取得するメソッド書いてた…。
JavaScriptのArrayクラスが持つindexOfは使えない
なぜだろう???そんなメソッドないエラーが出る。
Tips
UML版やPro版で可能なモデルの編集にはimportを追加する
importPackage(com.change_vision.jude.api.inf.editor);
XMIエクスポートみたいに、ファイルやディレクトリが絡むとMacとWindowsの関係が面倒
下のような関数を作って対応。ただし、ファイル名やディレクトリ名に円マーク使った場合は正常に動かない
var dirName = getCurrentDirectory(astah.getProjectPath());
function getCurrentDirectory(fullPath) {
var enPos = fullPath.lastIndexOf("¥¥");
var slaPos = fullPath.lastIndexOf("/");
return fullPath.substring(0, enPos >= slaPos ? enPos + 1 : slaPos + 1);
}
配列に含まれているか?のindexOfは、自分で実装
Arrayとastahから取れるStringをもらって判定。仕様はJavaScriptのindexOfと一緒で、見つからなければ-1を返す。
function indexOf(org, element) {
for (var i in org) {
if (org[i].equals(element)) {
return i;
}
}
return -1;
}
astah.close()すると、モデルを書き換えていてもいきなり閉じる
保存しますか?ダイアログ出ないので注意
今回の用途だと、モデルは一時的に書き換えたいだけだから良かった
要求図で、起点モデルから要求の包含関係を辿るスクリプト
ただし、satisfyやderiveReqtで繋がる要求まではカバーしない
importPackage(com.change_vision.jude.api.inf.model);
var req = astah.findElements(IRequirement);
for(var i in req) {
if (req[i].getNestedClasses().length != 0) {
if (req[i].getOwner().getName() == astah.getProject().getName()) {
println(req[i].getName());
printNestClass(req[i], 1);
}
}
}
function printNestClass(req, depth) {
var nestClasses = req.getNestedClasses();
for(var j in nestClasses) {
for(var k = 0; k < depth; k++) { print(" "); }
println("|- " + nestClasses[j].getName());
if (nestClasses[j].getNestedClasses().length != 0) {
printNestClass(nestClasses[j], ++depth);
}
}
}
使ってみて思ったこと
- おもしろい、簡単
- JavaScript上の問題なのかJavaの問題なのかが切り分け辛い
- Groovyあたりで書いた方がJavaとの親和性も高くてやりやすいかも
- Groovyで書いておけば、astah Scriptでちょろっと試して、それをプラグインまで持ってくのがラクかも


0 コメント:
コメントを投稿