2012年12月9日日曜日

astah Scriptでパッケージを取り払ったXMI出力するスクリプト書いた

いや、ホントは書いてからだいぶ時間経っちゃったけど…。

astah Scriptが出た時に、これはおもしろいということで、何か作ることにした。例によって、VDM関連でできたら良いな、というものがあったので、それを作ることに。

作ったのは、パッケージに分けられたクラス構造から、パッケージが全くないフラットなクラス構造にしたXMI出力するスクリプト。

何に使うかというと、VDM++にはパッケージの概念がないので、これまでastah→VDMToolsにクラス構造をXMIエクスポートしてくると、パッケージ内のクラスが反映されなかった。

でも、クラス構造をUMLで見る場合はツリー構造になってる方が分かりやすい。そこで、XMI出力する時だけパッケージ構造を取り払うことにした。

仕様

  • パッケージを全て取り払ったクラス構造のXMI出力をします
  • XMLファイルは、元の.astaファイルがある場所に「exportFlat.xml」という固定ファイル名で出力します
  • パッケージ構造を取り払うのは一時的で、元の.astaファイルには反映されません
  • パッケージを越えて同じクラス名があった場合は、先に見つかった方が優先されます
    この時、astahのスクリプトウィンドウ下部に、「duplicate class -> クラス名」と表示されます

使い方

  1. ここからダウンロードして、ExportFlatClassXMI.jsを任意の場所に置く
  2. クラス構造を含む.astaファイルを開く
  3. メニューの [ツール] -> [スクリプト] で、スクリプトウィンドウを表示する
  4. ここからスクリプトウィンドウでの操作
    1. [ファイル] -> [開く]で、保存したExportFlatClassXMI.jsを指定
    2. [アクション] -> [実行] でスクリプト実行

制限事項

  • astahのXMI出力機能を使うため、astah* professionalが必要です
  • パッケージを全てなくしてしまうため、パッケージをまたがって同じクラス名があった場合は、 最初に発見したクラスを優先します
  • Macにおいて、円マークをファイル名やディレクトリ名に使用した場合の動作は保証できません

試行錯誤したとこ

パッケージのない構造が元ファイルに保存されると困るので、XMI出力した後で保存しないで閉じる→再度開くをしてる。もうちょっとスマートなやり方ないもんかな。

トップのパッケージをスクリプトで取得するのに、全パッケージをループして親がいないパッケージを探索する関数を書いたけど、途中で「astah.getProject()」で取れることに気づいた…。ちなみに、最初は以下のようなコードで取ってた。

function getTopPackage() {    packages = astah.findElements(IPackage);        for(var j in packages) {        if (packages[j].getOwner() == null) {            topPacakge = packages[j];        }    }    return topPacakge;}

これを使うと、astahでおおよそのクラス構造を書いて、VDMにXMIで持っていくのが便利になった。自分では常用しそうだから、スクリプトじゃなくてプラグインにしちゃった方が良いかな???

0 コメント:

コメントを投稿