アーカイブ : 2009年 3月

EAアドインでブックマークを使用する方法

EnterpriseArchitectには「ブックマーク」という機能があるのをご存じだろうか。
ブックマークは、「Shiftキー+スペースキー」 で設定することが出来る。(メニューからはElementを選択状態でメニューバーの「編集」から選択)
私はこれを知らずに一年ほど使っていて、展示会で(ちょうど二年前ぐらい)中の人に教えて貰った。

BookmarkedClassImage

ブックマークは検索時の条件にも使用できる為、 アドインとの相性が非常に良いと個人的には思う。
たとえば、社内ルールに違反しているクラスに対してブックマークを設定しておき、検索を使用してその中から条件でふるいにかける という事にも利用可能だ。
(正直、ブックマークが一種類(赤)しか無い為、複数欲しいとは思う。せめて黄色があれば、WarningとErrorを表現できるのに!)

さて、そんなブックマーク機能だが残念ながらAPIが提供されていない。
これはとってももったいない話なので、C#3.0の拡張メソッドを使用して Repositoryインタフェースを拡張してみた。 (なぜ Elementインタフェースじゃないのかは後述)

public static class RepositoryExtension
{
    public static void SetBookmark(this EA.Repository repository, EA.Element element)
    {
        Bookmarked(repository, element, 1);
    }

    public static void ClearBookmark(this EA.Repository repository, EA.Element element)
    {
        Bookmarked(repository, element, 0);
    }

    private static void Bookmarked(EA.Repository repository, EA.Element element, int tagged)
    {
        string query = String.Format(@"update t_object set Tagged = {0} where ea_guid = ""{1}""",
                                     tagged, element.ElementGUID);
        repository.Execute(query);
    }
}

このコードを利用すると、次のようにしてElementに対してブックマークを設定/解除することが出来る。

repository.SetBookmark(element);    // ブックマークを設定する
repository.ClearBookmark(element);  // ブックマークを解除する

なんでElementインタフェースじゃないの?と思う人もいるかと思うが、コードをみてお分かりの通り、実際の設定/解除処理はRepository.Executeを使用している為、Repositorのインスタンスを渡さなければならない。
Elementインタフェースにぶら下げてRepoisitoryインタフェースを渡すよりは「個人的に」気持ち悪くなかった、という理由だけである。お好みに応じて変更頂きたい。

なお、このコードは未サポートのメソッドを使用している為、この拡張メソッドを利用して発生した問題については全くサポートされないと思って良い。
アドインを利用している以上、ある程度は自己責任だというのはご承知だとは思うが、 一応念のため。

あ、そうそう。呼び出したのに反映されないぞ、と思ったアナタ。 Repository.ReloadDiagram の呼び出しをお忘れ無く。(10分前の私 :-)

アドインの道の第一歩はEA.Collection ?

EAアドインを公開して、スペシャリストパートナーという名前負けしそうな(既にしている…)肩書きを頂いているが、アドイン開発なら n 分で出来るわけでも、一般の方が知らない xxx な機能を使って…という訳ではない。ごく一般の方法で唯々開発している。

久しぶりにアドインの開発をしようと思ったら開発方法をすっかり忘れてしまい(!)、過去のアドインセミナー資料を見ながらコソコソ作ったのが「アドインプロジェクトテンプレート」である。
いつの間にやら、アドイン開発よりもテンプレート開発に目的が移ってしまい、テンプレート完成した今頃我に返って、アドイン作成中…。

ところで、アドインをAPIで開発している方なら、最初に躓くのが EA.Collection インタフェースではないだろうか。
EA.Collectionというは、ElementのAttributesや、 Methodsなど、複数形のプロパティでよく帰ってくるインタフェースである。

このEA.Collectionが辛いのは、何が帰ってくるのかよく分からない事にある。Attributesなら、Attributeインタフェースの集合が帰ってくるのだろうと予想がつくが、予想通りに行かないとキャストに失敗し、Exceptionが発生したりする。
単純な解決策といえば「ヘルプ(SDK)をちゃんと読め」 という素直な答えになるわけだが、EA.Collection毎にヘルプを見て確認…を繰り返すのは少々辛い。

最近、他のスペシャリストパートナーの方が、Frameworkのようなクラスライブラリを提供していたけれど、こういったちょっと使い勝手が…というメソッド類をラップしてくれると非常に助かると思う。(とはいっても、EAのAPI変更に追従するという負荷があって、私はあんまりやりたくない :-p)

話は、EA.Collectionに戻るが、EA.Collectionがちょっと嫌いな理由の一つに「追加」がある。
たとえば、ダイアグラム上にあるAというクラスが持つメソッドをBというクラスにも追加したい、といったケースの場合、EA.CollectionのAddNewメソッドを呼び出し、そのメソッドを変更するという手順で変更しなければならない。
EAのプロジェクトファイルは、DBだという事実を知っている方なら、あのテーブルの要素を増やして object_ID を変えるだけなのに!と思ってしまうんじゃないだろうか。(実際、セミナーに参加すると、メソッド使ってません。SQLでやってます。という人によく会う)

最近(とはいっても、ずいぶん前?)、RepositoryインタフェースにExecuteメソッドが追加されて、公式に上記のような離れ業を公式にサポートしてしまった。
サポート対象外なメソッドだけれど、この手のAPIを提供しちゃうあたりが本当の「EnterpriseArchitect」のすごさ、だと思うのだがあんまり評価されていない風ですよねぇ。

さて、引き続きアドイン作成しようっと。

EnterpriseArchitectアドイン向けプロジェクトテンプレートを公開しました。

 

EnterpriseArchitectアドイン作成向けのC#プロジェクトテンプレートを本日公開しました。

今回作成したテンプレートをご使用いただくと以下のような作業を自動的にテンプレートが設定・生成します。

  • EA_Connect, EA_Disconnectやメニュー項目の自動生成
  • COMの登録設定やデバッグ設定(外部プログラムの設定)
  • アドイン登録用のレジストリファイルの生成

これにより、アドインがよりスムーズに開発することができます。

続きを読む