メッセージシーケンスを調べる
特定のメッセージからの流れを出力する例です。
public void GetSendMessages(ICommandContext c, ICommandParams p)
{
ISequenceDiagram sequenceDiagram = c.App.Workspace.CurrentEditor as ISequenceDiagram;
if (sequenceDiagram == null) return;
// 起点となるメッセージを取得します
var message = sequenceDiagram.GetSelectedShapes().FirstOrDefault() as IMessageShape;
// 起点となるメッセージが、応答メッセージの場合は処理を終了します
if (message.GetMessageKind() == "reply") return;
// メッセージ情報を出力します
OutputMessageInfo(message, c);
}
// 対象メッセージを起点とするメッセージ情報を出力します
private void OutputMessageInfo(IMessageShape message, ICommandContext c)
{
OutputLog(message, c);
var receivePort = message.ReceivePort;
// メッセージの受信先が実行仕様の場合、次のメッセージを辿ります
if (receivePort is IExecutionSpecificationShape executionSpecification)
{
foreach (IMessageShape sendMessage in executionSpecification.SendMessages)
{
if (sendMessage.GetMessageKind() == "reply") continue;
OutputMessageInfo(sendMessage, c);
}
}
}
// メッセージ情報を出力します
private void OutputLog(IMessageShape message, ICommandContext c)
{
// メッセージ情報(送信元・受信先を含む)を出力します
c.App.Output.WriteLine("sample", $"{message.GetSendPortText()} -> {message.GetReceivePortText()} : {message.Text}");
}
public static class IMessageShapeExtension
{
// メッセージの種類を取得します
public static string GetMessageKind(this IMessageShape self)
{
return ((IMessage) self.Model).Kind;
}
// 送信元ポートのテキストを取得します
public static string GetSendPortText(this IMessageShape self)
{
return GetMessagePortText(self.SendPort);
}
// 受信先ポートのテキストを取得します
public static string GetReceivePortText(this IMessageShape self)
{
return GetMessagePortText(self.ReceivePort);
}
// メッセージ端点のテキストを取得します
private static string GetMessagePortText(IMessagePortShape messagePort)
{
// メッセージ端の種類により、出力するテキストを取得します
switch (messagePort)
{
case IFrameShape frame:
return frame.Text;
case IExecutionSpecificationShape executionSpecification:
return executionSpecification.Lifeline.Text;
case IMessageEndShape messageEnd:
return "メッセージ端";
}
return string.Empty;
}
}