ログイン
検索
メインメニュー
開発者ブログ
ChangeVisionメンバーズ分布マップ
フォーラム一覧   -   トピック一覧
   astah*の使い方
     Astah-APIにおけるシーケンス図内のメッセージに割り当てられた操作の取得について
投稿するにはまず登録を

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 トピック
eiten
投稿日時: 2016-1-4 15:16
新米
登録日: 2016-1-4
居住地:
投稿: 4
Astah-APIにおけるシーケンス図内のメッセージに割り当てられた操作の取得について
初めて質問をさせていただきます。
Astah-APIを利用してシーケンス図内に存在するメッセージとそれに割り当てられた操作の名称・引数・返り値を取得したいと思い、以下のようなコードを作成したのですが、メッセージを取得することはできるものの、割り当てられた操作を取得することがうまくできていません。
具体的には変数iOperationの値がnullとなっていて、その操作内の引数を取得することができません。
シーケンス図内のメッセージに割り当てられた操作を取得することは不可能なのでしょうか。
可能な場合は、どのようにすれば良いのでしょうか。

以下のソースコードはメッセージ内の操作を取得しようとしたメソッドです(一部抜粋)


private ArrayList<String> searchExistingSequenceDiagramNameList(String className, String operationFullName, AstahProject project){
ArrayList<String> existingSequenceDiagramList = new ArrayList<String>();
try{
for(AstahSequenceDiagram sequenceDiagram : project.getSequenceDiagramList()){
try{
int lifelineNum = 0;
for (lifelineNum = 0; lifelineNum < sequenceDiagram.getISequenceDiagram().getInteraction().getLifelines().length; lifelineNum++){
if(sequenceDiagram.getISequenceDiagram().getInteraction().getLifelines()[lifelineNum].getBase().getName().equals(className) ){
try{
int messageNum = 0;
for (messageNum = 0; messageNum < sequenceDiagram.getISequenceDiagram().getInteraction().getLifelines()[lifelineNum].getFragments().length; messageNum++){
try{
if (sequenceDiagram.getISequenceDiagram().getInteraction().getLifelines()[lifelineNum].getFragments()[messageNum] instanceof IMessage){
IMessage iMessage = (IMessage)sequenceDiagram.getISequenceDiagram().getInteraction().getLifelines()[lifelineNum].getFragments()[messageNum];
IOperation iOperation = iMessage.getOperation();
//この値がnullとなっていて、うまく割り当てられた操作を取得できません
if (iOperation != null){
if (getOperationFullName(iOperation).equals(operationFullName)){
existingSequenceDiagramList.add(sequenceDiagram.getISequenceDiagram().getName());
}
}
}
}catch(NullPointerException e){
e.printStackTrace();
}
}
}catch(NullPointerException e){
e.printStackTrace();
}
}
}
}catch(NullPointerException e){
e.printStackTrace();
}
}
}catch(NullPointerException e){
e.printStackTrace();
}
return existingSequenceDiagramList;
}

//こちらのメソッドはiOperationが正しく取得できていれば正しく動くことを確認済みです
private String getOperationFullName(IOperation iOperation){
String operationFullName = iOperation.getName() + "(";
for (int i = 0; i < iOperation.getParameters().length; i++){
if (i != 0){
operationFullName += ", ";
}
operationFullName += iOperation.getParameters()[i].getName() + " : " + iOperation.getParameters()[i].getType().getName();
}
operationFullName += ") : " + iOperation.getReturnType().getName();
return operationFullName;
}
midori
投稿日時: 2016-1-5 13:55
開発者
登録日: 2006-5-8
居住地: 福井
投稿: 312
Re: Astah-APIにおけるシーケンス図内のメッセージに割り当てられた操作の取得について
astahのご利用ありがとうございます。

メッセージの操作は、Astah APIのiMessage.getOperation() で取得できます。

メッセージに操作が割り当てられていない場合はnullが返ります。お手数ですが、プロジェクトファイルを開き、メッセージに操作が正しく割り当てられているかどうか、ご確認ください。

メッセージに操作が割り当てられている場合、メッセージのプロパティビューのベースタブで、操作欄に、メッセージのターゲットとなるライフラインのベースクラスの操作が表示されます。

eiten
投稿日時: 2016-1-6 0:07
新米
登録日: 2016-1-4
居住地:
投稿: 4
Re: Astah-APIにおけるシーケンス図内のメッセージに割り当てられた操作の取得について
ご返信ありがとうございました。
ご指摘いただいたとおり、メッセージに操作が割り当てられていたかどうか確認したところ操作はきちんと割り当てられていました。
また、ラベルを取得すると「操作0():void」となり、やはり操作がきちんと割り当てられていたことが分かりました。
しかし、それでも「iMessage.getOperation()」の結果がnullとなってしまいます。

現在私はメッセージの取得を、
iMessage = (IMessage)iSequenceDiagram.getInteraction().getLifelines()[lifelineNum].getFragments()[messageNum];

としているのですが、取得の仕方が間違っているのでしょうか。
ご指導よろしくお願いいたします。
midori
投稿日時: 2016-1-6 11:38
開発者
登録日: 2006-5-8
居住地: 福井
投稿: 312
Re: Astah-APIにおけるシーケンス図内のメッセージに割り当てられた操作の取得について
メッセージに操作が割り当てられていることをご確認いただきまして、ありがとうございます。

メッセージは、提示いただいたコードで取得可能です。

iMessage = (IMessage)iSequenceDiagram.getInteraction().getLifelines()[lifelineNum].getFragments()[messageNum];


ただし、ライフラインに接続されているメッセージを取得するため、forループで回す場合、上記の図の例では、ライフライン0とライフライン1に接続されているメッセージとして、操作0が2回取得されます。

また、最初に提示いただいたメソッドは、for ループで回しているため、例えば、プロジェクト内にベースクラスを持たないライフラインがある場合に途中でNullPointerExceptionが発生します。

メソッドの途中でエラーが発生していないかどうか、「iMessage.getOperation()」実行時に対象のiMessageを取得できているかどうか、今一度ご確認いただけないでしょうか?
eiten
投稿日時: 2016-1-7 16:20
新米
登録日: 2016-1-4
居住地:
投稿: 4
Re: Astah-APIにおけるシーケンス図内のメッセージに割り当てられた操作の取得について
ご返信ありがとうございました。
ご指摘いただいた通り、iMessageが取得できているかどうか再確認いたしました。
その結果、やはり取得自体は出来ていると思います。
理由としては下記のコードを実行した結果「iMessage.getTarget()」「iMessage.getSource()」「iMessage.getArgument()」が取得できており、「iMessage.getPresentations()[0].getLabel()」の返り値も、
「操作名(引数):返り値の型」と取得できていたためです。
try {
	String message = iMessage.getPresentations()[0].getLabel();
	INamedElement target = iMessage.getTarget();
	String targetName = target.getName();
	INamedElement source = iMessage.getSource();
	String sourceName = source.getName();
	String argument = iMessage.getArgument();
	IOperation iOperation = iMessage.getOperation();//この行でNullPointerExceptionが発生
} catch (Exception e) {
	e.printStackTrace();
}

ただ、なぜか最初の質問のときと動作が変わってしまっていて、「IOperation iOperation = iMessage.getOperation()」としたとき、iOperationの値がnullになるのではなく、この行でNullPointerExceptionが発生してしまいました。
「String message = iMessage.getPresentations()[0].getLabel();」が通った上で「IOperation iOperation = iMessage.getOperation();」でNullPointerExceptionが発生することはありえるのでしょうか。
また、labelを取得して、上記のように返り値の型まで書かれていて尚、メッセージに割り当てられたメソッドが取得できないということはあるのでしょうか。
midori
投稿日時: 2016-1-8 12:03
開発者
登録日: 2006-5-8
居住地: 福井
投稿: 312
Re: Astah-APIにおけるシーケンス図内のメッセージに割り当てられた操作の取得について
iMessageの取得を再確認いただきまして、ありがとうございます。

「iMessage.getPresentations()[0].getLabel()」と 「iMessage.getOperation();」は、同じモデル(iMessageのActionが持つOperation)を参照します。そのため、「String message = iMessage.getPresentations()[0].getLabel();」が通った上で「IOperation iOperation = iMessage.getOperation();」でNullPointerExceptionが発生することは、通常ありえません。

labelを取得して、返り値の型が表示されていれば、iMessage.getOperation()で操作が取得できるはずです。

ご提示いただいたコードの中で、プロジェクト中に出現メッセージや消失メッセージがある場合は、targetやsourceが取得できずにNullPointerExceptionが発生します。iMessage.getOperation()ではなく、別の場所でNullPointerExceptionが発生していることはありませんか?

[出現メッセージ、消失メッセージの例]




















[サンプルプロジェクト]

よろしければ、以下のようなシンプルなプロジェクトで、iMessage.getOperation()によりOperationを取得できるかどうかご確認ください。

メッセージの操作に、クラス1の操作0を指定しています。

eiten
投稿日時: 2016-1-9 13:56
新米
登録日: 2016-1-4
居住地:
投稿: 4
Re: Astah-APIにおけるシーケンス図内のメッセージに割り当てられた操作の取得について
ご返信ありがとうございました。
今までご指導頂いたことを参考に、思考錯誤致しました。
その結果、iSequenceDiagramの取得の方法を変更することで操作を入手することができました。
操作を取得することができなかった原因は判明しませんでしたが、操作を取得できたので次へ進めそうです。
複数回のご指導ありがとうございました。
midori
投稿日時: 2016-1-12 9:56
開発者
登録日: 2006-5-8
居住地: 福井
投稿: 312
Re: Astah-APIにおけるシーケンス図内のメッセージに割り当てられた操作の取得について
eiten様

無事、操作を取得できたとのこと、ご連絡いただきましてありがとうございます。astah APIについて、シーケンス図は複雑な点も多いと思います。その他ご不明な点がございましたら、こちらのフォーラムにお気軽にお問い合わせくださいませ。
スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ

投稿するにはまず登録を