# JUDE API 利用ガイド

## 【モデル情報の取得方法】

各インターフェース、メソッドの詳細については、 JUDE APIのJavaDocをご覧ください。

1. クラス図のモデル情報の取得
2. アクティビティ図のモデル情報の取得
3. シーケンス図のモデル情報の取得
4. ステートマシン図のモデル情報の取得
5. データフロー図のモデル情報の取得
6. CRUDのモデル情報の取得
7. 図の取得
8. 別名の取得
9. ハイパーリンクの取得
10. フローチャートの基本要素の取得

#### 【クラス図のモデル情報の取得】

ここでは、モデル情報の取得方法をクラス図やオブジェクト図、またはサンプルプログラムを 併用して、一部の例を紹介します。

#### クラスの属性情報の取得

クラス(IClass)のメソッドgetAttributes()を用いることによって、属性(IAttribute)の配列を取得 できます。クラスが他のクラスと関連している場合、属性情報オブジェクトには関連端の情報も 含まれます。
例えば、Class0が属性attribute0とClass1への関連（関連端のロール名class1）を持っている場合の 情報は、 図の様になります。

#### クラスの操作情報の取得

クラス(IClass)のメソッドgetOperations()を利用することによって、操作(IOperation)の配列を取得 できます。

#### クラスの依存情報の取得

クラス(IClass)のメソッドgetClientDependencies()を利用することによって、そのクラスが依存す るクラスに繋がる依存(IDependency)の配列を取得できます。それらに対しメソッドgetSupplier()を 用いることにより、依存元のクラスを取得することができます。
例えば、Class0がClass1に依存している場合の情報は、 図の様になります。

#### クラスの実現情報の取得

クラス(IClass)のメソッドgetClientRealizations()を利用することによって、そのクラスが実現して いるインターフェースクラスに繋がる実現(IRealization)の配列を取得できます。それらに対し メソッドgetSupplier()を用いることにより、実現されているインターフェースクラスを取得する ことができます。
例えば、Class1がClass0を実現している場合の情報は、 図の様になります。

#### クラスの汎化情報の取得

クラス(IClass)のメソッドgetGeneralizations()を利用することによって、そのクラスの スーパークラスに繋がる汎化(IGeneralization)の配列を取得できます。それらの汎化に対し メソッドgetSuperType()を用いることにより、スーパークラスを取得することができます。
例えば、Class1がClass0を継承している場合の情報は、 図の様になります。

#### テンプレートクラスの取得

クラス(IClass)のメソッドgetTemplateBindings()を利用することによって、そのクラスのテンプレートクラスに繋がる テンプレートバインディング(ITemplateBinding)の配列を取得できます。テンプレートバインディング(ITemplateBinding)の getTemplate()をりようすることによってテンプレートクラスを取得できます。

#### テンプレートクラスのテンプレートパラメータ情報の取得

クラス(IClass)のメソッドgetTemplateParameters()を利用することによって、そのクラスのテンプレートパラメータ(IClassifierTemplateParameter)の配列を取得できます。

#### プロジェクトを表す（起点となる）モデルの取得

JUDEプロジェクトファイルの全てのモデル情報は、プロジェクトを表すモデル（以下、 プロジェクトモデル）の下にツリー状に存在します。
まず、ProjectAccessorオブジェクトを取得して、JUDEプロジェクトファイルを開き、 プロジェクトモデル(IModelクラスのオブジェクト)を取得します。
ClassDefinitionBuilder.javaより

            // プロジェクトを開いて、プロジェクトモデルを取得する
            ProjectAccessor prjAccessor = ProjectAccessorFactory.getProjectAccessor();
            prjAccessor.open(inputFile);
            IModel iModel = prjAccessor.getProject();

#### パッケージ配下のパッケージを、再帰的に全て取得

ここでは、パッケージ(IPackage)を継承するサブシステムやモデルも、パッケージに含めます。
パッケージ(IPackage)の直下にある全てのモデル要素を、メソッドgetOwnedElements()の利用により 配列として取得し、その中からパッケージだけを抽出します。また、取得したパッケージに対しても 同様の処理を行い、再帰的に全てのパッケージを取得します。
ClassDefinitionBuilder.javaより

        /**
         * 指定パッケージ配下のパッケージを、再帰的に全て取得する。
         *
         * @param iPackage
         *            指定パッケージ
         * @param iPackages
         *            パッケージ一覧を格納するリスト
         * @return パッケージ一覧を格納したリスト
         */
        private List getPackages(IPackage iPackage, List iPackages) {
            INamedElement[] iNamedElements = iPackage.getOwnedElements();
            for (int i = 0; i < iNamedElements.length; i++) {
                INamedElement iNamedElement = iNamedElements[i];
                if (iNamedElement instanceof IPackage) {
                    iPackages.add(iNamedElement);
                    getPackages((IPackage)iNamedElement, iPackages);
                }
            }
            return iPackages;
        }

#### パッケージ配下のクラスの取得

パッケージ(IPackage)の直下にある全てのモデル要素を、メソッドgetOwnedElements()を用いること により配列として取得し、その中からクラスだけを抽出します。
ClassDefinitionBuilder.javaより

        /**
         * 指定パッケージ配下のクラスを取得する。
         *
         * @param iPackage
         *            指定パッケージ
         * @return クラス一覧を格納したリスト
         */
        private List getIClasses(IPackage iPackage) {
            List iClasses = new ArrayList();
            INamedElement[] iNamedElements = iPackage.getOwnedElements();
            for (int i = 0; i < iNamedElements.length; i++) {
                INamedElement iNamedElement = iNamedElements[i];
                if (iNamedElement instanceof IClass) {
                    iClasses.add(iNamedElement);
                }
            }
            return iClasses;
        }

#### クラスのフルパス名の取得

クラス(IClass)を含め、INamedElementのサブクラスの場合、メソッドgetName()を用いることで、 名前を取得することができます。
さらに、自分を所有するモデル要素を所得するメソッドgetOwner()を組み合わせることによって、 プロジェクトモデルからのフルパス名を取得することができます。
ClassDefinitionBuilder.javaより

        /**
         * クラスの名前をフルパスで取得する
         *
         * @param iClass
         *            クラス
         * @return クラス名（フルパス）
         */
        private String getFullName(IClass iClass) {
            StringBuffer sb = new StringBuffer();
            IElement owner = iClass.getOwner();
            while (owner != null && owner instanceof INamedElement && owner.getOwner() != null) {
                sb.insert(0, ((INamedElement) owner).getName() + "::");
                owner = owner.getOwner();
            }
            sb.append(iClass.getName());
            return sb.toString();
        }

#### 【アクティビティ図のモデル情報の取得】

ここでは、アクティビティ図に関連するモデル情報の取得方法をクラス図とオブジェクト図を併用して、一部の例を紹介します。

#### パーティション情報の取得

アクティビティ(IActivity)のメソッドgetPartitions()を用いることによって、パーティション(IPartition)の配列を取得できます。
アクティビティ(IActivity)のメソッドgetSubPartition()とgetSuperParition()を用いることによって、パーティション(IPartition)の階層を取得できます。
例えば、Partition0とPartition1の情報は、図の様になります。

#### 制御フロー情報の取得

アクティビティ(IActivity)のメソッドgetFlows()を用いることによって、制御フロー(IFlow)の配列を取得できます。
アクティビティノード(IActivityNode)のメソッドgetIncomings()とgetOutgoings()を用いることによってアクションに関連する制御フローを取得できます。
例えば、二つの制御フローの情報は、図の様になります。

#### アクションや開始ノードなどの情報の取得

アクティビティ(IActivity)のメソッドgetActivityNode()を用いることによって、アクティビティノード(IActivityNode)の配列を取得できます。
さらに、パーティション(IPartition)のメソッドgetActivityNode()を用いることによってパーティションに含まれるアクションを取得できます。
例えば、action0と開始ノードの情報は、図の様になります。

#### 【シーケンス図のモデル情報の取得】

ここでは、シーケンス図に関連するモデル情報の取得方法をクラス図とオブジェクト図を併用して、一部の例を紹介します。

#### ライフライン情報の取得

インタアクション(IInteraction)のメソッドgetLifelines()を用いることによって、ライフライン(ILifeline)の配列を取得できます。
例えば、LifeLine0の情報は、図の様になります。

#### 複合フラグメント情報の取得

ライフライン(IInteraction)のメソッドgetFragments()を用いることによって、このライフライン(ILifeline)に関連する
複合フラグメント(ICombinedFragment)と<メッセージ(IMessage)の配列を取得できます。
例えば、alt複合フラグメントの情報は、図の様になります。

#### オペランド情報の取得

複合フラグメント(ICombinedFragment)のメソッドgetInteractionOperands()を用いることによって、オペランド(IInteractionOperand)の配列
を取得できます。例えば、alt複合フラグメントにある二つの複合フラグメントの情報は、図の様になります。

#### メッセージ情報の取得

ライフライン(IInteraction)のメソッドgetFragments()を用いることによって、このライフライン(ILifeline)に関連する複合フラグメント(ICombinedFragment)
とメッセージ(IMessage)の配列を取得できます。さらに、ライフライン(IInteraction)のメソッドgetFragments(IInteractionOperand operand)を用いること
によって、特定のオペランドに属するメッセージ(IMessage)の配列を取得できます。
例えば、Message0の情報は、図の様になります。

#### 【ステートマシン図のモデル情報の取得】

ここでは、ステートマシン図に関連するモデル情報の取得方法を紹介します。

#### 状態とサブマシン状態情報の取得

ステートマシン図(IStateMachineDiagram)のメソッドgetStateMachine()を用いることによって、図のステートマシン(IStateMachine)を取得できます。
図のステートマシン(IStateMachine)のメソッドgetVertexes()を用いることによって、ステートマシン(IStateMachine)に含まれる状態(IState)の配列を取得できます。
状態(IState)のメソッドisSubmachineState()を用いることによってサブマシン状態を判定できます。

#### 開始擬似状態と浅い履歴擬似状態、深い履歴擬似状態、フォーク擬似状態などの情報の取得

ステートマシン図(IStateMachineDiagram)のメソッドgetStateMachine()を用いることによって、図のステートマシン(IStateMachine)を取得できます。
図のステートマシン(IStateMachine)のメソッドgetVertexes()を用いることによって、ステートマシン(IStateMachine)に含まれる擬似状態(IPseudoState)の配列を取得できます。
擬似状態(IPseudoState)のisForkPseudostate()などのメソッドによってフォーク擬似状態や開始擬似状態などを判定できます。

#### 【データフロー図のモデル情報の取得】

ここでは、データフロー図に関連するモデル情報の取得方法を紹介します。

#### プロセス情報の取得

データフロー図(IDataFlowDiagram)のメソッドgetDataFlowNodes()を用いることによって、プロセス(IProcessBox)の配列を取得できます。
プロセス(IProcessBox)のメソッドgetDataFlowDiagram()を用いることによって、プロセス(IProcessBox)の詳細を表すデータフロー図(IDataFlowDiagram)を取得できます。

#### データフロー情報の取得

プロセス(IProcessBox)のメソッドgetIncomings()とgetOutgoings()を用いることによって、プロセス(IProcessBox)に繋がるデータフローを取得できます。

#### 外部エンティティ情報の取得

データフロー図(IDataFlowDiagram)のメソッドgeDataFlowNodes()を用いることによって、外部エンティティ(IExternalEntity)の配列を取得できます。

#### データストア情報の取得

データフロー図(IDataFlowDiagram)のメソッドgeDataFlowNodes()を用いることによって、データストア(IDataStore)の配列を取得できます。

#### 【CRUDのモデル情報の取得】

ここでは、CRUDに関連するモデル情報の取得方法を紹介します。

#### ヘッダー情報の取得

CRUD(IMatrixDiagram)のメソッドgetColumnHeaders()とgetRowHeaders()を用いることによって、ヘッダーの配列を取得できます。

#### 値情報の取得

CRUD(IMatrixDiagram)のメソッドgetShowValueCell(row, column)を用いることによって、特定の行と列の値を取得できます。

### 【図の取得】

名前付き要素(INamedElement)は、図(IDiagram)やパッケージ(IPackage),パーティション(IPartition) などの親クラスです。
名前付き要素(INamedElement)のメソッドgetDiagrams()を用いることによって,配下のすべての図を取得できます。

アクティビティ図取得の例

    public List getActivityDiagram(IPackage iPackage) {
        List activityDiagrams = new ArrayList();

        IDiagram[] dgms = iPackage.getDiagrams();
        for (int i = 0; i < dgms.length; i++) {
            IDiagram dgm = dgms[i];
            if (dgm instanceof IActivityDiagram
                    && !((IActivityDiagram )dgm).isFlowChart()) {
                   activityDiagrams.add(dgm);
            }
        }
        return activityDiagrams;
    }

フローチャートの取得

    public List getFlowCharts(IPackage iPackage) {
        List flowCharts = new ArrayList();

        IDiagram[] dgms = iPackage.getDiagrams();
        for (int i = 0; i < dgms.length; i++) {
            IDiagram dgm = dgms[i];
            if (dgm instanceof IActivityDiagram
                    && ((IActivityDiagram )dgm).isFlowChart()) {
                flowCharts.add(dgm);
            }
        }
        return flowCharts ;
    }

### 【別名の取得】

別名の情報は、内部ではタグ付き値として保持しています。タグ付き値にはITaggedValueを通してアクセスできます。
タグ付き値のキーは別名１が"jude.multi_language.alias1",別名２が"jude.multi_language.alias2"となっておりますので、
以下のコードのように取得することが可能です。

別名１取得の例

    private static final String KEY_ALIAS1 = "jude.multi_language.alias1";

    private String geAlias1(INamedElement element) {
        ITaggedValue[] tvs = element.getTaggedValues();
        for (int i = 0; i < tvs.length; i++) {
            ITaggedValue tv = tvs[i];
            if (KEY_ALIAS1.equals(tv.getKey())) {
                return tv.getValue();
            }
        }
        return null;
    }

### 【ハイパーリンクの取得】

INamedElementおよびIPresentationはIHyperlinkOwnerを継承しています。
IHyperlinkOwnerのgetHyperlinks()によって保持しているハイパーリンク(IHyperlink)のリストを取得することが可能です。

ハイパーリンク取得の例

    private void showHyperlinkStrings(INamedElement element) {

        IHyperlink[] links = element.getHyperlinks();
        for (int i = 0; i < links.length; i++) {
            IHyperlink link = links[i];
            if(link.isFile()) {
                System.out.println(link.getName());
                System.out.println(link.getPath());
                System.out.println(link.getComment());
            } else if(link.isModel()) {
                System.out.println(link.getName());
                System.out.println(link.getPath());
                System.out.println(link.getComment());
            } else if(link.isURL()) {
                System.out.println(link.getName());
                System.out.println(link.getPath());
                System.out.println(link.getComment());
            }
         }
    }

以下の例のように、ハイパーリンクの種類がモデルになる場合、nameがモデルのidで,IElementImpのgetId()によって取得することも可能です。

ハイパーリンク文字列の例

    type=file,name=jude.log,path=C:/Documents and Settings,comment= Target is a file
    type=url,name=http://www.change-vision.com,path=http://,comment= Target is a web page
    type=model,name=9a1411-1112fec29a5-0804d01aa6c5fb9fe2aab956b4ca593a,path=,comment= Target is a Jude model

### 【フローチャートの基本要素の取得】

JUDEはフローチャートをアクティビティ図の一系統に考えています。アクションにステレオタイプを付加することで、 基本要素オブジェクトを実現しています。

ループ開始要素の取得

    private static final String LOOP_START_ELEMENT = "loop_start";

    public List getLoopStartElements(IActivityDiagram iActivityDiagram) {
       List loopStartElements = new ArrayList();

       IActivity iActivity = iActivityDiagram.getActivity();
       IActivityNode[] activityNodes = iActivity.getActivityNodes();
       for (int i = 0; i < activityNodes.length; i++) {
            IActivityNode node = activityNodes[i];
            String[] stereotypes = node.getStereotypes();
            for (int j = 0; j < stereotypes.length; j++) {
               if (LOOP_START_ELEMENT.equals(stereotypes[j])) {
                   loopStartElements.add(node);
                   break;
               }
            }
        }
        return loopStartElements;
    }

#### 基本要素オブジェクトのステレオタイプ一覧

処理１ <--- 標準アイコンの要素にステレオタイプを付加しません。
処理２(flow_process)
定義済処理 (predefined_process)
手作業 (hand_work)
準備 (preparation)
サーバー(server)
端末(machine)
データ(data)
記憶データ(stored_data)
内部記憶(internal_storage)
順次アクセス(sequential_storage)
ディスク１(disk)
ディスク２(database)
文書(document)
手操作入力(hand_inputting)
表示(display)
判断(judgement)
ループ開始(loop_start)
ループ終了(loop_end)
ページ内結合子(internal_connector)
ページ外結合子(external_connector)

Home