2012年8月31日金曜日

astah Scriptで遊ぼう

astah*が、JavaScriptでastahにアクセスできるプラグイン「astah Script」を出してた。ホントはETロボコンのモデルを書かなきゃいけないから遊んでる場合じゃないんだけど、遊んでたらおもしろかったので…。色々書いてみて遊んだメモを残しておく。

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

コメントを投稿