STAMP/STPA
ファセットへアクセスする
STAMP/STPAの全モデル、プレゼンテーションは、STAMP/STPAファセットを表すモデル(以下、ファセットモデル)の下に存在します。
STAMP/STPAファセットモデルは、ProjectAccessorからgetFacet(String symbolicName)を用いて取得します。
public IFacet getSTAMPFacet(ProjectAccessor projectAccessor) throws ProjectNotFoundException {
return projectAccessor.getFacet(IStampFacet.FACET_SYMBOLIC_NAME);
}
モデル / プレゼンテーションの参照
モデルの参照
コンポーネントのコントロールアクションを取得する
astah*上で下図のようなコントロールストラクチャー図があり、Component0から各コントロールアクションを取得するとします。
この場合、astah*のプロジェクト内のモデルは下図のようになります。
コンポーネントから直接取得することができないため、コントロールアクションを保持するコントロールリンクを取得してから関連するコンポーネントを判断する必要があることがわかります。
対応するastah* APIの構造は下図のようになります。
または、インスタンスは下図のようになります。
StpaAnalysisからコントロールリンク(IStpaAnalysis#getLinks()で取得できます。
コントロールリンクからコントロールアクションはIControlLink#getActions()で取得できます。
public List<IControlAction> getControlActions(IComponent component) throws ClassNotFoundException {
List<IControlAction> controlActions = new ArrayList<>();
= AstahAPI.getAstahAPI().getProjectAccessor().getFacet(IStampFacet.FACET_SYMBOLIC_NAME);
IFacet facet = facet.getRootElement(IStpaAnalysis.class);
IStpaAnalysis analysis List<ILink> links = analysis.getLinks();
for (ILink link : links) {
if (link instanceof IControlLink
&& (link.getSource() == component || link.getTarget() == component)) {
.addAll(((IControlLink) link).getActions());
controlActions}
}
return controlActions;
}
UCAのコントロールアクションの提供条件を取得する
IUnsafeControlAction.getControlActionからUCAのコントロールアクションを取得できます。IControlActionはISignalを継承しており、ISignal.getProvidingConditionから提供条件を取得できます。
public String getProvidingCondition(IUnsafeControlAction uca) {
return uca.getControlAction().getProvidingCondition();
}
図 / プレゼンテーションの参照
コントロールストラクチャー図を取得する
public List<IControlStructureDiagram> getControlStructureDiagrams(IFacet facet) {
= facet.getRootElement(IStpaAnalysis.class);
IStpaAnalysis analysis List<IControlStructureDiagram> controlStructureDiagrams = new ArrayList<>();
for (IDiagram diagram : analysis.getDiagrams()) {
if (diagram instanceof IControlStructureDiagram) {
.add((IControlStructureDiagram) diagram);
controlStructureDiagrams}
}
return controlStructureDiagrams;
}
コントロールストラクチャー図に同期するUCA表を取得する
StampDiagramEditorからコントロールストラクチャー図に同期するUCA表を取得し、存在しない場合は作成できます。
public IUCATable createOrGetUCATable(IControlStructureDiagram controlStructureDiagram, String ucaTableName)
throws ClassNotFoundException, InvalidUsingException, InvalidEditingException {
= AstahAPI.getAstahAPI().getProjectAccessor().getDiagramEditorFactory();
IDiagramEditorFactory diagramEditorFactory = diagramEditorFactory.getDiagramEditor(StampDiagramEditor.class);
StampDiagramEditor stampDiagramEditor return stampDiagramEditor.createOrGetUCATable(controlStructureDiagram, ucaTableName);
}
図上で選択しているコンポーネントにネストするコンポーネントプレゼンテーションを取得する
astah*上で下図のようなコントロールストラクチャー図があり、parent componentからネストコンポーネントのプレゼンテーションを取得するとします。
INodePresentation.getChildrenからコンポーネントプレゼンテーションにネストするコンポーネントプレゼンテーションを取得できます。
public INodePresentation[] getChildrenComponentPresentation(
) throws InvalidUsingException {
IControlStructureDiagram controlStructureDiagramfor (IPresentation presentation : controlStructureDiagram.getPresentations()) {
= presentation.getModel();
IElement model if (presentation instanceof INodePresentation && model instanceof IComponent
&& "parent component".equals(((IComponent) model).getName())) {
return ((INodePresentation) presentation).getChildren();
}
}
return new INodePresentation[0];
}
モデル / プレゼンテーションの編集
編集を行う場合は必ずトランザクション処理が必要となります。
なお、下記条件を満たしていない場合は例外が発生します。
- プロジェクトアクセサにプロジェクトを登録していること
- 編集APIが対応しているエディションであること
- 対象が編集可能であること
モデルの編集
モデルエディタ
STAMP/STPA関連モデルの編集はモデルエディタ(StampModelEditor)を使用して行います。 例えば、コントロールアクションやアクシデントの作成はStampModelEditorから作成できます。 モデルとプレゼンテーションが1:nで対応するモデルはモデルエディタから作成できます。
モデルエディタの種類 | 作成可能要素 |
---|---|
StampModelEditor | コンポーネント、コントロールアクション、コントロールリンク、フィードバックリンク、フィードバック、プロセスモデル、プロセス変数、プロセスバリュー、前提条件、アクシデント、ハザード、安全制約、UCA、非UCA、HazardCausalFactor、ハザードシナリオ |
アクシデントに安全制約を持つハザードを追加する
// 要トランザクション処理
public IHazard createHazard(IAccident accident, String hazardDescription) throws InvalidEditingException {
= projectAccessor.getModelEditorFactory();
IModelEditorFactory modelEditorFactory = modelEditorFactory.getModelEditor(StampModelEditor.class);
StampModelEditor stampModelEditor = projectAccessor.getFacet(IStampFacet.FACET_SYMBOLIC_NAME);
IFacet facet = facet.getRootElement(IStpaAnalysis.class);
IStpaAnalysis analysis
= stampModelEditor.createHazard(analysis,
IHazard hazard Collections.singletonList(accident), hazardDescription);
= stampModelEditor.createSafetyConstraint(analysis,
ISafetyConstraint safetyConstraint1 Collections.singletonList(hazard), "safetyConstraint1");
= stampModelEditor.createSafetyConstraint(analysis,
ISafetyConstraint safetyConstraint2 Collections.singletonList(hazard), "safetyConstraint2");
return hazard;
}
コントロールアクションにUCAを追加する
astah*上で下図のようなUCA表があり、コントロールストラクチャー図上のコントロールアクション(ControlAction)とNot Providing(ガイドワード)で指定したセルにUCA1を追加するとします。
この場合、astah*のプロジェクト内のモデルは下図のようになります。
// 要トランザクション処理
public IUnsafeControlAction createUCA(IStpaAnalysis analysis) throws ClassNotFoundException, InvalidEditingException {
final ITransactionManager transactionManager = projectAccessor.getTransactionManager();
= null;
IUnsafeControlAction uca try {
// コントロールストラクチャー図を作成
.beginTransaction();
transactionManager= AstahAPI.getAstahAPI().getProjectAccessor().getModelEditorFactory();
IModelEditorFactory modelEditorFactory = modelEditorFactory.getModelEditor(StampDiagramEditor.class);
StampDiagramEditor stampDiagramEditor = stampDiagramEditor.createControlStructureDiagram(analysis, "controlStructureDiagram");
IControlStructureDiagram controlStructureDiagram
= modelEditorFactory.getModelEditor(StampModelEditor.class);
StampModelEditor stampModelEditor = stampModelEditor.createComponent(analysis, "component1");
IComponent component1 = stampModelEditor.createComponent(analysis, "component2");
IComponent component2 = stampModelEditor.createControlLink(component1, component2);
IControlLink controlLink = stampModelEditor.createControlAction(controlLink, "controlAction");
IControlAction controlAction = stampDiagramEditor.createNodePresentation(component1, createPoint2D(100.0, 100.0));
INodePresentation component1Presentation = stampDiagramEditor.createNodePresentation(component2, createPoint2D(250.0, 250.0));
INodePresentation component2Presentation = stampDiagramEditor.createLinkPresentation(controlLink, component1Presentation, component2Presentation);
ILinkPresentation controlLinkPresentation .endTransaction();
transactionManager
// UCA表を作成
.beginTransaction();
transactionManager= stampDiagramEditor.createOrGetUCATable(controlStructureDiagram, "ucaTable");
IUCATable ucaTable = analysis.getUCAGuideWords().get(0);
INamedElement guideword0 = stampModelEditor.createUnsafeControlAction(controlAction, guideword0, "UCA1");
uca .setIdentifier("UCA1-N-1");
uca.endTransaction();
transactionManager
// UCA表のセルの設定
.beginTransaction();
transactionManager.setCell(controlAction, guideword0, Collections.singletonList(uca));
ucaTable.endTransaction();
transactionManager} catch (BadTransactionException e) {
.abortTransaction();
transactionManager}
return uca;
}
private Point2D createPoint2D(double x, double y) {
Point2D location = new Point2D.Double();
.setLocation(x, y);
locationreturn location;
}
図 / プレゼンテーションの編集
ダイアグラムエディタ
図、表、プレゼンテーションの作成や削除はStampDiagramEditorを使用して行います。
StampDiagramEditorを以下のように取得できます。
= AstahAPI.getAstahAPI().getProjectAccessor();
ProjectAccessor projectAccessor = projectAccessor.getDiagramEditorFactory();
IDiagramEditorFactory diagramEditorFactory = diagramEditorFactory.getDiagramEditor(StampDiagramEditor.class); StampDiagramEditor diagramEditor
コントロールループ図を作成する
// 要トランザクション処理
public IControlLoopDiagram createControlLoopDiagram(ILinkPresentation controlLinkPresentation)
throws ClassNotFoundException, InvalidUsingException, InvalidEditingException {
= AstahAPI.getAstahAPI().getProjectAccessor();
ProjectAccessor projectAccessor = projectAccessor.getDiagramEditorFactory();
IDiagramEditorFactory diagramEditorFactory = diagramEditorFactory.getDiagramEditor(StampDiagramEditor.class);
StampDiagramEditor diagramEditor = diagramEditor.createControlLoopDiagram(controlLinkPresentation, "test");
IControlLoopDiagram diagram return diagram;
}
ネストのコンポーネントプレゼンテーションを作成する
// 要トランザクション処理
public INodePresentation createNestedNodePresentation(StampDiagramEditor editor, IComponent parent, IComponent child,
Point2D location) throws InvalidEditingException {
= createNodePresentation(editor, parent, location);
INodePresentation parentNodePresentation return editor.createNodePresentation(child, parentNodePresentation, location);
}
// 要トランザクション処理
public INodePresentation createNodePresentation(StampDiagramEditor editor, IComponent model,
Point2D location) throws InvalidEditingException {
return editor.createNodePresentation(model, location);
}
ロスシナリオ表を作成する
// 要トランザクション処理
public ILossScenarioTable createLossScenarioTable(IUnsafeControlAction uca)
throws ClassNotFoundException, InvalidUsingException, InvalidEditingException {
= AstahAPI.getAstahAPI().getProjectAccessor();
ProjectAccessor projectAccessor = projectAccessor.getDiagramEditorFactory();
IDiagramEditorFactory diagramEditorFactory = diagramEditorFactory.getDiagramEditor(StampDiagramEditor.class);
StampDiagramEditor diagramEditor = diagramEditor.createOrGetLossScenarioTable(uca, "lossScenarioTable");
ILossScenarioTable table return table;
}
表を削除する
// 要トランザクション処理
public void deleteUCATable(IUnsafeControlAction uca, IControlStructureDiagram controlStructureDiagram)
throws ClassNotFoundException, InvalidUsingException, InvalidEditingException {
= AstahAPI.getAstahAPI().getProjectAccessor();
ProjectAccessor projectAccessor = projectAccessor.getDiagramEditorFactory();
IDiagramEditorFactory diagramEditorFactory = diagramEditorFactory.getDiagramEditor(StampDiagramEditor.class);
StampDiagramEditor diagramEditor = diagramEditor.createOrGetUCATable(controlStructureDiagram, "ucaTable0");
IUCATable ucatable if (ucatable != null) {
.delete(ucatable);
diagramEditor}
}
対応モデル / プレゼンテーション一覧
構造の詳細については、JavadocのSTAMP/STPA Overviewをご覧ください。
モデル対応の概要 (図単位)
STAMP/STPA各図のモデルに対する対応の概要です。
モデルへの参照・編集の可否についてはStampModelEditorをご覧ください。 各図の作成についてはStampDiagramEditorをご覧ください。
図 | 型 | 関連モデル構造 | 各モデルの参照 | 各モデルの編集 |
---|---|---|---|---|
コントロールループ図 | IControlLoopDiagram | コントロールループ図 | ○ | ○ |
コントロールストラクチャー図 | IControlStructureDiagram | コントロールストラクチャー図 | ○ | ○ |
前提条件表 | IPreconditionTable | 前提条件表 | ○ | ○ |
アクシデントハザード安全制約表 | IAccidentHazardSafetyConstraintTable | アクシデントハザード安全制約表 | ○ | ○ |
UCA表 | IUCATable | UCA表 | ○ | ○ |
ロスシナリオ表 | ILossScenarioTable | ロスシナリオ表 | ○ | ○ |
対策表 | ICountermeasureTable | 対策表 | ○ | ○ |
対応プレゼンテーションの概要 (図単位)
STAMP/STPA各図のモデルに対応するプレゼンテーションの概要です。
プレゼンテーションへの参照・編集の可否についてはStampDiagramEditorをご覧ください。
図 | 型 | DiagramEditor | INodePresentation | ILinkPresentation |
---|---|---|---|---|
コントロールループ図 | IControlLoopDiagram | StampDiagramEditor | ○ | ○ |
コントロールストラクチャー図 | IControlStructureDiagram | StampDiagramEditor | ○ | ○ |