Las rutas se pueden combinar con la ayuda del tipo de ruta "aggregate" (ver tabla 5.2). Los tipos de ruta compuestos permiten definir arbitrariamente reglas complejas para la comparación de URL.
Tipo de Ruta | Descripción |
---|---|
SimpleRouteStack | Agregar diferentes tipos de rutas en una lista con prioridades. |
TreeRouteStack | Agregar diferentes tipos de rutas en una estructura tipo árbol. |
Part | Agregar diferentes tipos de rutas a un sub árbol. |
Chain | Agregar diferentes tipos de rutas a una cadena (sub árbol degenerativo). |
Los tipos de ruta TreeRouteStack
y SimpleRouteStack
se usan como los tipos de
ruta de primer nivel. El tipo de ruta SimpleRouteStack permite organizar diferentes
rutas en una lista con prioridades. TreeRouteStack permite anidar diferentes
rutas formando un árbol.
La figura 5.2 muestra el diagrama de herencia de la clase route.
Como podemos ver en la imagen, todas las clases de ruta heredan de la interface RouteInterface
(revisaremos más detalladamente esta interface en la sección Escribir un Tipo de Ruta Propia
que está más adelante en esta sección). SimpleRouteStack
es la clase padre de la
clase TreeRouteStack
, esta hereda su comportamiento de la clase padre (permitiendo
organizar las rutas en un lista con prioridades) y lo extiende (permitiendo organizar
rutas en sub árboles). Las clases Part
y Chain
se derivan de la clase TreeRouteStack
que las usa internamente para construir sub árboles y cadenas de rutas hijas.
El SimpleRouteStack
permite combinar diferentes rutas en una lista con prioridades.
Un ejemplo de una lista como esta se puede ver en la pila de rutas de la parte
izquierda de la figura 5.3. La lista de ejemplo contiene varias rutas Literal y
varias rutas Segment.
Cuando se prueba la coincidencia con la petición HTTP, SimpleRouteStack
recorre
la lista de rutas e intenta hacer coincidir cada ruta. Cada ruta de la lista tiene
una prioridad; la ruta con la mayor prioridad se visita primero. La búsqueda termina
una vez que alguna ruta coincide con la petición HTTP. Si ninguna ruta coincide el
error "not fount" se lanza.
La clase TreeRouteStack
extiende de la clase SimpleRouteStack
lo que significa
que esta se puede organizar en una lista de prioridades, además, provee la capacidad
de anidar rutas en subárboles y cadenas. Una ejemplo de una pila de rutas en árbol se
presenta en la parte derecha de la figura 5.3. La lista contiene una ruta Literal
,
una cadena de rutas Literal
y Segment
, y un subárbol con dos ramas: una rama
contiene una ruta única Segment
y otra rama contiene rutas Scheme
, Hostname
y
Segment
.
La pila de rutas en árbol ejecuta la comparación con la petición de la siguiente
manera. Esta recorre los elementos de la lista de prioridades (con líneas punteadas en la figura 5.3),
comenzando con las rutas de más alta prioridad. Si un elemento determinado es una ruta Chain
o una ruta Part
, se procesa cada ruta anidada desde su ruta padre al hijo. Si la
ruta padre coincide, los hijos (en líneas solidas) se analizan. La ruta anidada
se considera coincidente si al menos una ruta coincide en algún nivel del árbol
(o cadena).
Cada ruta en el árbol (o cadena) consume una parte de la URL (figura 5.4). La ruta padre se compara contra la primera parte de la URL, el hijo se compara con la segunda parte y así sucesivamente hasta el final de la cadena URL.