API Reference

Luruju::JudeApiLoader クラスによるJUDEモデル情報のロード

Luruju::JudeApiLoader.load(jude_file) [クラスメソッド]

JUDEモデル情報をロードする。引数はJUDEファイルのパス(文字列)

JUDE APIの再現

JudeApiLoaderで取得したJUDEモデルオブジェクトは、Javaのオブジェクトではなく、JudeApiLoader内で動的に生成したクラスのインスタンスであり、純粋なRubyベースのオブジェクトですが、JavaベースのJUDE APIをほぼそのまま再現しています。

JudeApiLoader内で動的に生成したクラス構成は以下のようになっています。

  • Luruju::JudeApiモジュール配下にクラスを作成
  • クラス名はJUDE APIのインターフェース名をベースにしています。インターフェース名の先頭のIをとって、Judeをプレフィックスにしています。
JUDE APIインターフェース LuRuJuクラス
IModel Luruju::JudeApi::JudeModel
IClass Luruju::JudeApi::JudeClass
IAttribute Luruju::JudeApi::JudeAttribute
  • ER図で使用されるクラスに含まれる『ER』は『Er』に変換しています。
JUDE APIインターフェース LuRuJuクラス
IERSchema Luruju::JudeApi::JudeErSchema
IEREntity Luruju::JudeApi::JudeErEntity
IERRelationship Luruju::JudeApi::JudeErRelationship
  • 各クラスLuruju::JudeApi::JudeBaseを継承しています。
  • JUDE APIでインスタンスとして実体化されないものはLuRuJuでクラス化されません。(IElement, INamedElement ..etc)
  • 各クラスのメソッドは以下のようにしてつくっています。
    • JUDE APIが提供する各getterメソッド名より属性名を取得する。(例getId -> id, getSuperType -> super_type)
    • attr_accessor を使用して属性名に対応するgetter,setterを生成する。
    • JUDE APIのメソッドの戻り値がbooleanの場合、Rubyの慣習に習い、getterのエイリアスメソッドとして『?』のサフィックスを付与したメソッドも作成する。

これらのマッピングルールを理解すれば、Java上でJUDE APIを利用するときと同様の感覚でRubyでJUDEモデル情報を扱うことができます。JUDE APIの詳細はJUDEをインストールしたときに添付されるAPI User Guideをご参照ください。

JUDE APIの論理モデルの再現

API Referenceといいつつ、ここでは少し内部実装に踏み込んでいます。

Rubyのような動的言語は、ダックタイピングの作法で自由なプログラミングができ、インターフェースや継承関係を意識することはあまりない。ただUMLの世界を忠実に表現したJUDE APIの洗練された論理モデルをRuby上で再現することは実用上でも大きな意味があると考え、LuRuJu 0.1.0版よりこれを実現した。

JUDE APIのインターフェース間の継承は多重化されている部分もある。Rubyのクラスは多重継承はできないので、モジュールのミックスインにより多重継承をシュミレートした。(多重継承はあまり多用してはいけないという意見は一応明記しておく)

一部モデル化したものを以下に示す。

上記にしめすJUDE APIのインターフェース間の継承関係をRuby上では以下のように変換した。

探索

Luruju::JudeApi::JudeBase#search_XXX(options={})

ロードしたモデル内のオブジェクトから条件に合致したオブジェクトの一覧を返す。 ロードしたモデル内の全てのオブジェクトから実行可能。

XXXにはJUDE APIのインターフェース名(class, package, association ..etc)がはいる。メソッド名として定義したインターフェース名を実装しているオブジェクトが検索対象となる。

optionsは現在以下が有効

  • :id – オブジェクトのidが検索条件となる。
  • :name – オブジェクトの名前が検索条件となる。

ブロックを渡すことが可能で、この場合ブロックで定義した条件が検索対象となる。

タグ付き値の簡単な参照

Luruju::JudeApi::JudeBase#tagged(key)

各モデルオブジェクトのタグ付き値(TaggedValue)を取得することができます。 ActiveSupportのHashWithIndifferentAccessを使用しているのでキーがシンボルでも文字列でも参照可能です。

所有する要素(owned_elements)の簡単な参照

既存のLuruju::JudeApi::JudePackageのowned_elementsメソッドの結果は様々な型の要素が取得される。

そこで特定の型(JudePackage, JudeClass ..etc)の要素を取得するために、要素の型名の複数形をメソッド名として指定すると、その要素のみのリストを取得することができる。

また、要素の型名の単数形をメソッド名として指定すると、その要素の一覧の最初のオブジェクトを取得することができる。

作者はER図のSchameを取得するときに使用している。

種別の判別

Luruju::JudeApi::JudeBase#kind_of_XXX?

自身がJUDE APIのインターフェースを実装している場合に真を返す。 XXXにはJUDE APIのインターフェース名(class, package, association ..etc)がはいる。

JUDEファイルの更新時間

Luruju::JudeApi::JudeModel#mtime

JUDEファイルの更新時間を返す。ロードしたオブジェクトのトップのModelにのみ値が格納されている。 LuRuJuライブラリ内部でキャッシュを利用するかリロードするかどうかの判別に使用している。

デフォルトのクラスかどうかの判別

Luruju::JudeApi::JudeClass#default?

JUDEプロジェクトを新規作成したときにすでに存在するjava.lang,java.utilのクラスの場合に真を返す。

スーパークラス、サブクラスの取得

Luruju::JudeApi::JudeClass#super_classes

Luruju::JudeApi::JudeClass#sub_classes

super_classesは自身のスーパークラスの一覧を返す。

sub_classesは自身のサブクラスの一覧を返す。

集約、コンポジットの判別

Luruju::JudeApi::JudeAttribute#broad_aggregate?

Luruju::JudeApi::JudeAttribute#not_broad_aggregate?

broad_aggregate?は自身が集約またはコンポジットの場合に真を返す。 not_broad_aggregate?は自身が集約でもコンポジットでもない場合に真を返す。

反対側の関連端の取得

Luruju::JudeApi::JudeAttribute#contra

自身の反対側の関連端のJudeAttributeを取得する。