モデル / プレゼンテーションの参照

モデルおよびプレゼンテーションの参照方法について説明します。
対応モデル対応プレゼンテーションについてはこちらをご覧ください。

モデルの参照

以下に、モデルを参照する例を示します。

プロジェクトからモデルを検索する

プロジェクト全体からモデルを取得するにはProjectAccessorのfindElementsメソッドを用います。
ProjectAccessorAstahAPI#getProjectAccessor()から取得できます。

ModelFinderの実装例

クラス図の抽出
public class ClassDiagramPicker implements ModelFinder {
    public boolean isTarget(INamedElement namedElement) {
        return namedElement instanceof IClassDiagram;
    }
}
入場点の抽出
public class EntryPointPicker implements ModelFinder {
    public boolean isTarget(INamedElement namedElement) {
        if (namedElement instanceof IPseudostate) {
            return ((IPseudostate) namedElement).isEntryPointPseudostate();
        }
        return false;
    }
}

構造ツリーで選択しているモデルを取得する

public IEntity[] getSelectedEntities(IViewManager viewManager) {
    IProjectViewManager projectViewManager = viewManager.getProjectViewManager();
    return projectViewManager.getSelectedEntities();
}

図上で選択しているプレゼンテーションからモデルを取得する

public List<IElement> getModelsOfSelectedPresentations(IViewManager viewManager) {
    List<IElement> models = new ArrayList<>();
    for (IPresentation selectedP : getSelectedPresentations(viewManager)) {
        models.add(selectedP.getModel());
    }
    return models;
}

private IPresentation[] getSelectedPresentations(IViewManager viewManager) {
    IDiagramViewManager diagramViewManager = viewManager.getDiagramViewManager();
    return diagramViewManager.getSelectedPresentations();
}

クラスから関連を取得する

astah*上で下図のようなクラス図があり、Class0から関連を取得するとします。

01_view_diagram_editor

この場合、astah*のプロジェクト内のモデルは下図のようになります。
クラスから直接取得することができないため、関連端を取得してから関連のモデルを取得する必要があることがわかります。

02_instance_diagram

また、対応するastah* APIの構造は下図のようになります。

03_diagram_showing_class_structure

クラスから属性・関連端はIClass#getAttributes()で取得できます。
関連端から関連はIAttribute#getAssociation()で取得できます(属性からIAttribute#getAssociation()した場合はnullが返ります)。

public List<IAssociation> getAssociations(IClass clazz) {
    List<IAssociation> associations = new ArrayList<>();
    IAttribute[] attributes = clazz.getAttributes();
    for (IAttribute iAttribute : attributes) {
        IAssociation association = iAttribute.getAssociation();
        if (association == null) {
            continue;
        }
        associations.add(association);
    }
    return associations;
}

クラスから依存を取得する

astah*上で下図のようなクラス図があり、Class0から依存を取得するとします。

01_view_diagram_editor

この場合、astah*のプロジェクト内のモデルは下図のようになります。

02_instance_diagram

また、対応するastah* APIの構造は下図のようになります。
INamedElementIClassの親クラスです。

03_diagram_showing_class_structure

Class0から依存は、INamedElement#getClientDependencies()を用いることで取得することができます。
Class1からはINamedElement#getSupplierDependencies()で取得できます。

テンプレートクラスを取得する

IClass#getTemplateBindings()を利用することで、そのクラスのテンプレートクラスに繋がるテンプレートバインディング(ITemplateBinding)の配列を取得できます。
ITemplateBinding#getTemplate()を利用することでテンプレートクラスを取得できます。
また、テンプレートパラメータについては、IClass#getTemplateParameters()を利用することで、そのクラスのテンプレートパラメータ(IClassifierTemplateParameter)の配列を取得できます。

パッケージ配下のパッケージを再帰的に取得する

パッケージ(IPackage)を継承するサブシステムやモデルも、パッケージに含めます。

public List getPackages(IPackage iPackage, List iPackages) {
     INamedElement[] iNamedElements = iPackage.getOwnedElements();
     for (INamedElement iNamedElement : iNamedElements) {
        if (iNamedElement instanceof IPackage) {
            iPackages.add(iNamedElement);
            getPackages((IPackage)iNamedElement, iPackages);
        }
      }
      return iPackages;
}

パッケージ配下のクラスを取得する

パッケージ(IPackage)配下にある全モデル要素を取得し、クラスを抽出します。

public List getIClasses(IPackage iPackage) {
    List iClasses = new ArrayList();
    INamedElement[] iNamedElements = iPackage.getOwnedElements();
    for (INamedElement iNamedElement : iNamedElement) {
       if (iNamedElement instanceof IClass) {
           iClasses.add(iNamedElement);
        }
    }
    return iClasses;
}

クラスのネームスペースを取得する

クラス(IClass)等INamedElementのサブクラスの場合、メソッドgetName()を用いることでその名前を取得できます。
さらに自らを所有するモデル要素をgetOwner()を使用することによって、 プロジェクトモデルからのネームスペースを取得します。

public 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();
}

アクティビティ図のモデルを取得する

アクティビティ図のモデル構造を示します。下記を参考にしてモデルを取得して下さい。

astah*上で下図のようなアクティビティ図がある場合、

01_view_diagram_editor

astah*プロジェクト内のモデルは下図のようになります。
上図には表示されていませんが、Partition0のsuperPartitionにディメンジョンが存在することに注意して下さい。

02_instance_diagram

また、対応するastah* APIの構造は下図のようになります。

03_diagram_showing_class_structure

シーケンス図のモデルを取得する

シーケンス図のモデル構造を示します。下記を参考にしてモデルを取得して下さい。

astah*上で下図のようなシーケンス図がある場合、

01_view_diagram_editor

astah*のプロジェクト内のモデルは下図のようになります。

02_instance_diagram

また、対応するastah* APIの構造は下図のようになります。

03_diagram_showing_class_structure

ステートマシン図のモデルを取得する

ステートマシン図のモデル構造を示します。下記を参考にしてモデルを取得して下さい。

astah*上で下図のようなステートマシン図がある場合、

01_view_diagram_editor

astah*のプロジェクト内のモデルは下図のようになります。

02_instance_diagram

また、対応するastah* APIの構造は下図のようになります。

03_diagram_showing_class_structure

state0から領域にかかわらず全子要素を取得するにはIState#getSubvertexes()、state0の各領域から子要素を取得するにはIState#getSubvertexes(int regionIndex)を用います。

タグ付き値を取得する

タグ付き値はITaggedValueを使用してアクセスできます。下記はタグ付き値の値を取得する例です。

public String getTaggedValueValue(IElement element, String taggedValueKey) {
    for (ITaggedValue taggedValue : element.getTaggedValues()) {
        if (taggedValueKey.equals(taggedValue.getKey())) {
            return taggedValue.getValue();
        }
    }
    return null;
}

ステレオタイプを取得する

IElement#getStereotypes()からStringの配列として取得できます。

別名を取得する

別名の情報は、モデルではタグ付き値として保持しています。 タグ付き値の取得方法はタグ付き値を取得するをご覧ください。
タグ付き値のキーは別名1が”jude.multi_language.alias1”、別名2が”jude.multi_language.alias2”です。

なお、モデルからプレゼンテーションを取得し、プレゼンテーションから別名を取得することも可能です。

図 / プレゼンテーションの参照

図を取得する

public List getActivityDiagram(IPackage iPackage) {
    List activityDiagrams = new ArrayList();
 
    IDiagram[] dgms = iPackage.getDiagrams();
    for (IDiaram dgm : dgms) {
       if (dgm instanceof IActivityDiagram
           && !((IActivityDiagram )dgm).isFlowChart()) {
           activityDiagrams.add(dgm);
       }
    }
    return activityDiagrams;
}

図内の全プレゼンテーションを取得する

IDiagram#getPresentations() を用いると図内の全プレゼンテーションを取得することができます。
IElement#getPresentations() とは異なる挙動をするため注意してください。

public IPresentation[] getOwnedPresentation(IDiagram diagram) throws InvalidUsingException {
    return diagram.getPresentations();
}

モデルからプレゼンテーションを取得する

IElement#getPresentations() を用いると IPresentation#getModel() == element となるプレゼンテーションをすべて取得できます。
IDiagram#getPresentations()は図内のプレゼンテーションを取得することとなりますので、下記例では例外処理をしています。

public IPresentation[] getPresentation(IElement element) throws InvalidUsingException {
    if (element instanceof IDiagram) {
        throw new IllegalArgumentException("element is IDiagram.");
    }
    return element.getPresentations();
}

図上で選択しているプレゼンテーションを取得する

IDiagramViewManager#getSelectedPresentations() を用いると、現在アクティブなダイアグラムエディタ上で選択されている図要素を取得できます。

public IPresentation[] getSelectedPresentations(IViewManager viewManager) {
    IDiagramViewManager diagramViewManager = viewManager.getDiagramViewManager();
    return diagramViewManager.getSelectedPresentations();
}

プレゼンテーションから別名を取得する

IPresentation#getProperty(java.lang.String)PresentationPropertyConstants#Key#ALIAS1 または PresentationPropertyConstants#Key#ALIAS2 を渡すと取得することができます。

public String getAlias1(IPresentation presentation) {
    return presentation.getProperty(Key.ALIAS1);
}