* Ce service contient la logique de navigation d'un écran vers le suivant. Il contient également les méthodes permettants de déterminer si un item doit être affiché.
* Lors du calcul de l'écran suivant {@link #getNextScreen(String, ScreenDTO)}, une boucle infi peut se produire. Cette constante en est le seuil de détection.
* Pour charger l'écran suivant de l'écran courant.
...
...
@@ -60,43 +59,90 @@ public class ScreenNavigationService {
}
/**
* Récupère l'écran suivant en fonction des conditions d'affichage :
* <ul>
* <li>construit une {@link Expression} à partir des réponses de la session</li>
* <li>évalue les conditions d'affichage de l'écran suivant; s'il est affichable : l'affiche; sinon itère sur l'écran suivant</li>
* <li>filtre les items de l'écran suivant affichable</li>
* </ul>
* Détermine l'écran suivant et filtre les items qui ne doivent pas être affichés.
* L'écran suivant est calculé à partir de {@link Screen#getNextScreenExpressions()}, {@link Screen#getDefaultNextScreenReference()} et de {@link Screen#getNext()}.
* Chaque expression de {@link Screen#getNextScreenExpressions()} est évaluée : la première qui est vérifiée donne l'écran suivant.
* Si aucune n'est vérifiée, {@link Screen#getDefaultNextScreenReference()} est utilisé s'il est non vide
* {@link Screen#getNext()} est utilisé en dernier recours.
* @param sessionId une session de réponses (l'identifiant commun à toutes les réponses d'un utilisateur)
* @param screen l'écran courant de l'utilisateur
* @return
* @throws UnableToFindNextScreenException la méthode a été appelée avec un écran final ou l'expression du screen courant retourne un screen qui n'existe pas
// il ne faut pas appeler cette méthode lorsque l'écran courant est le dernier !
if(screen.getNextId()==null){
thrownewUnableToFindNextScreenException();
}
// initialisation d'une expression. Elle est utilisée pour evaluer les expressions permettant de déterminer les écrans suivants et pour filter les items affichés dans l'écran suivant.
* La méthode {@link #getNextScreen(String, ScreenDTO)} peut générer une boucle infinie : cette méhode jette une exception le cas échéant pour éviter de faire tomber le serveur.
* @param displayCurrentScreen
* @param iterationCount
* Deux écrans par défaut possibles :
* <ul>
* <li>{@link Screen#getDefaultNextScreenReference()}; utilisé si renseigné</li>
* <li>{@link Screen#getNext()}; champ obligatoire; utilisé pour définir l'ordre en back office et en dernier recours pour l'ordre en front.</li>