Commons SCXML - Forza salto per un determinato stato
-
29-09-2019 - |
Domanda
Apache Commons SCXML , e vorrei sapere se è possibile dire la macchina a stati (SCXMLExecutor) per passare a un determinato stato.
Non è possibile utilizzare l'attributo initialstate
, perché voglio la macchina dello stato per recuperare (vale a dire da interruzioni di corrente), e l'unica cosa che ho è l'ultimo stato. Ecco perché ho pensato di raccontare la macchina dello Stato per fare un salto diretto ad esso.
Soluzione
Nel caso generale si tratta di una pessima idea per passare a uno stato senza lo stato della macchina di essere "consapevole" di essa, perché ci potrebbero essere i presupposti per l'esecuzione di un particolare stato che non sono soddisfatti (che sarebbe, se hai raggiunto lo stato del) modo "normale". Un'idea migliore è quella di progettare la macchina a stati di una capacità "restart", realizzate come un evento di input "restart" e gli stati e le transizioni necessarie per gestirlo.
Altri suggerimenti
Questa è una vecchia questione, ma ho appena colpito questo e aveva bisogno di una risposta ad esso come bene e ho pensato che potrebbe aiutare gli altri a rispondere. Sto usando questo come parte di unit testing, dove è estremamente utile per ottenere solo a un particolare stato (io voglio essere sicuro che se in stato di A, se una sequenza di eventi accade, va a stato B - ed ancora va lì dopo ho armeggiare con il codice XML macchina a stati!)
Finalmente ho trovato questo codice in SCXMLTestHelper e ha funzionato. Basta chiamare con l'esecutore e lo Stato di destinazione.
public static void setCurrentState(SCXMLExecutor exec, final String id) throws IllegalArgumentException{
try {
exec.reset();
} catch (ModelException me) {
throw new IllegalArgumentException("Provided SCXMLExecutor "
+ "instance cannot be reset.");
}
TransitionTarget active = (TransitionTarget) exec.getStateMachine().
getTargets().get(id);
if (active == null) {
throw new IllegalArgumentException("No target with id '" + id
+ "' present in state machine.");
}
Set current = exec.getCurrentStatus().getStates();
current.clear();
current.add(active);
}