1 /*******************************************************************************
2 * Copyright (c) 2016 Ecole Polytechnique de Montreal, Ericsson
4 * All rights reserved. This program and the accompanying materials are
5 * made available under the terms of the Eclipse Public License v1.0 which
6 * accompanies this distribution, and is available at
7 * http://www.eclipse.org/legal/epl-v10.html
8 ******************************************************************************/
9 package org
.eclipse
.tracecompass
.internal
.tmf
.analysis
.xml
.core
.model
;
11 import java
.util
.List
;
13 import org
.eclipse
.jdt
.annotation
.NonNull
;
14 import org
.eclipse
.jdt
.annotation
.Nullable
;
15 import org
.eclipse
.tracecompass
.internal
.tmf
.analysis
.xml
.core
.model
.TmfXmlScenarioHistoryBuilder
.ScenarioStatusType
;
16 import org
.eclipse
.tracecompass
.internal
.tmf
.analysis
.xml
.core
.module
.IXmlStateSystemContainer
;
17 import org
.eclipse
.tracecompass
.internal
.tmf
.analysis
.xml
.core
.pattern
.stateprovider
.XmlPatternStateProvider
;
18 import org
.eclipse
.tracecompass
.tmf
.core
.event
.ITmfEvent
;
21 * This Class implements a Scenario in the XML-defined state system
23 public class TmfXmlScenario
{
25 private final IXmlStateSystemContainer fContainer
;
26 private final TmfXmlFsm fFsm
;
27 private TmfXmlPatternEventHandler fPatternHandler
;
28 private TmfXmlScenarioInfo fScenarioInfo
;
29 TmfXmlScenarioHistoryBuilder fHistoryBuilder
;
35 * The event at which this scenario is created
36 * @param patternHandler
39 * the id of the fsm executed by this scenario
41 * The state system container this scenario belongs to
45 public TmfXmlScenario(@Nullable ITmfEvent event
, TmfXmlPatternEventHandler patternHandler
, String fsmId
, IXmlStateSystemContainer container
, ITmfXmlModelFactory modelFactory
) {
46 TmfXmlFsm fsm
= patternHandler
.getFsm(fsmId
);
48 throw new IllegalArgumentException(fsmId
+ "has not been declared."); //$NON-NLS-1$
51 fContainer
= container
;
52 fHistoryBuilder
= ((XmlPatternStateProvider
) container
).getHistoryBuilder();
53 fPatternHandler
= patternHandler
;
54 int quark
= fHistoryBuilder
.assignScenarioQuark(fContainer
, fsmId
);
55 int statusQuark
= fHistoryBuilder
.getScenarioStatusQuark(fContainer
, quark
);
56 fScenarioInfo
= new TmfXmlScenarioInfo(fFsm
.getInitialStateId(), ScenarioStatusType
.PENDING
, quark
, statusQuark
, fFsm
);
57 fHistoryBuilder
.update(fContainer
, fScenarioInfo
, event
);
61 * Get this scenario infos
63 * @return The scenario info
65 public TmfXmlScenarioInfo
getScenarioInfos() {
70 * Cancel the execution of this scenario
72 public void cancel() {
73 fScenarioInfo
.setStatus(ScenarioStatusType
.ABANDONED
);
74 if (fScenarioInfo
.getStatus() != ScenarioStatusType
.PENDING
) {
75 fHistoryBuilder
.completeScenario(fContainer
, fScenarioInfo
, null);
80 * Test if the scenario is active or not
82 * @return True if the scenario is active, false otherwise
84 public boolean isActive() {
85 return fScenarioInfo
.getStatus().equals(ScenarioStatusType
.PENDING
) || fScenarioInfo
.getStatus().equals(ScenarioStatusType
.IN_PROGRESS
);
89 * Handle the ongoing event
94 public void handleEvent(ITmfEvent event
) {
96 TmfXmlStateTransition out
= fFsm
.next(event
, fPatternHandler
.getTestMap(), fScenarioInfo
);
101 // Processing the actions in the transition
102 final List
<String
> actions
= out
.getAction();
103 for (String actionId
: actions
) {
104 ITmfXmlAction action
= fPatternHandler
.getActionMap().get(actionId
);
105 if (action
!= null) {
106 action
.execute(event
, fScenarioInfo
);
108 throw new IllegalStateException("Action " + actionId
+ " cannot be found."); //$NON-NLS-1$ //$NON-NLS-2$
112 // Change the activeState
113 final @NonNull String nextState
= out
.getTarget();
114 if (fScenarioInfo
.getStatus().equals(ScenarioStatusType
.PENDING
)) {
115 fScenarioInfo
.setStatus(ScenarioStatusType
.IN_PROGRESS
);
116 fHistoryBuilder
.startScenario(fContainer
, fScenarioInfo
, event
);
117 } else if (nextState
.equals(fFsm
.getAbandonStateId())) {
118 fScenarioInfo
.setStatus(ScenarioStatusType
.ABANDONED
);
119 fHistoryBuilder
.completeScenario(fContainer
, fScenarioInfo
, event
);
120 } else if (nextState
.equals(fFsm
.getFinalStateId())) {
121 fScenarioInfo
.setStatus(ScenarioStatusType
.MATCHED
);
122 fHistoryBuilder
.completeScenario(fContainer
, fScenarioInfo
, event
);
124 fScenarioInfo
.setActiveState(nextState
);
125 fHistoryBuilder
.update(fContainer
, fScenarioInfo
, event
);