インストールや基本的な動かし方は、公式サイトを見てください。あと、今回作ったスクリプトは別エントリで公開しようと思ってる。例によって、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 コメント:
コメントを投稿