Les routes peuvent être combinées à l'aide de types de routes "agrégés" (voir le tableau 5.2). Les types de routes agrégés permettent de définir des règles de mappage d'URL complexes.
Type de route | Description |
---|---|
SimpleRouteStack | Agrège différents types d'itinéraires dans une liste avec des priorités. |
TreeRouteStack | Agrège différents types de route dans une structure arborescente. |
Part | Agrège différents types de route dans un sous-arbre. |
Chain | Agrège différents types de route dans une chaîne (sous-arbre dégénéré). |
Les TreeRouteStack
et SimpleRouteStack
sont utilisés comme les types de route «de premier niveau».
La SimpleRouteStack permet d'organiser différentes routes dans une liste priorisée.
Le TreeRouteStack permet d'imbriquer différentes routes dans un "arbre" (arborescence).
La Figure 5.2 montre le diagramme d'héritage de la classe route.
Comme vous pouvez le voir à partir de l'image, toutes les classes de route sont héritées de l'interface
RouteInterface
(nous verrons cette interface en détails dans la section
Écrire son propre type de route plus loin dans ce chapitre).
SimpleRouteStack
est une classe parente de la classe
TreeRouteStack
, qui hérite du comportement de la pile de route simple
(permet d'organiser les routes dans une liste priorisée) et l'étend (permet d'organiser les routes dans des
sous-arbres). Les classes Part
et Chain
sont dérivées
de la classe TreeRouteStack
et sont utilisées en interne par
TreeRouteStack
pour créer des sous-arbres et des routes enfants.
La SimpleRouteStack
permet de combiner différentes routes dans une liste priorisée.
Pour un exemple de ce type de liste, regardez la pile de route dans la partie gauche de la figure 5.3.
La liste d'exemples contient plusieurs routes littérales et quelques routes segment.
Lors de la comparaison avec la requête HTTP, SimpleRouteStack
parcourt la liste des routes et essaie de faire correspondre chaque route à tour de rôle.
Chaque route de la liste a une priorité; les routes avec la priorité la plus élevée sont visitées en premier.
La recherche est terminée une fois qu'une route correspond à la requête HTTP. Si aucune route ne correspond,
l'erreur "not found" est déclenchée.
La classe TreeRouteStack
étend la classe SimpleRouteStack
,
ce qui signifie qu'elle peut organiser des routes en liste priorisée, et qu'elle permet d'imbriquer des
routes dans des sous-arbres et des chaînes. Un exemple de pile de routage arborescent est présenté dans la
partie droite de la figure 5.3. La liste contient une route Literal
,
une chaîne de routes Literal
et Segment
, et une sous-arborescence composée
de deux branches : une branche contenant une route Segment
unique et une branche constituée de routes
Scheme
, Hostname
et Segment
.
Le tree route stack (pile de route en arborescence) effectue une correspondance de requête de la manière
suivante. Il parcourt les éléments de sa liste priorisée (indiqués par des pointillés dans la figure 5.3)
en commençant par les itinéraires priorisé. Si une certaine partie est une route de Chain
ou une partie (Part
) de route, il traite cet itinéraire imbriqué de son
itinéraire parent vers les enfants. Si la route parent correspond, les enfants (indiqués par des traits
pleins) sont alors analysés. L'itinéraire imbriqué est considéré comme correspondant si au moins une
route correspond à chaque niveau d'arbre (ou de chaîne).
Chaque route dans un arbre (ou une chaîne) consomme une partie de l'URL (figure 5.4). La route parent est comparée à la première partie de l'URL, son enfant est à nouveau mis en correspondance avec la partie suivante, et ainsi de suite jusqu'à ce que la fin de la chaîne d'URL soit atteinte.