org.restlet.routing

## Class Router

- java.lang.Object
- - org.restlet.Restlet
  - - org.restlet.routing.Router

All Implemented Interfaces:
  Uniform

Direct Known Subclasses:
  ClientRouter, InternalRouter, ServerRouter, VirtualHost

    public class Router
    extends Restlet

Restlet routing calls to one of the attached routes. Each route can compute an affinity score for each call depending on various criteria. The attach() method allow the creation of routes based on URI patterns matching the beginning of a the resource reference's remaining part.
In addition, several routing modes are supported, implementing various algorithms:

- Best match
- First match (default)
- Last match
- Random match
- Round robin
- Custom

Note that for routes using URI patterns will update the resource reference's base reference during the routing if they are selected. It is also important to know that the routing is very strict about path separators in your URI patterns. Finally, you can modify the list of routes while handling incoming calls as the delegation code is ensured to be thread-safe.
Concurrency note: instances of this class or its subclasses can be invoked by several threads at the same time and therefore must be thread-safe. You should be especially careful when storing state in member variables.

Author:
  Jerome Louvel
See Also:
  User Guide - Routers and hierarchical URIs

### Field Summary

Fields
`static int` `BEST` Deprecated. Use `MODE_BEST_MATCH` instead.
`static int` `CUSTOM` Deprecated. Use `MODE_CUSTOM` instead.
`static int` `FIRST` Deprecated. Use `MODE_FIRST_MATCH` instead.
`static int` `LAST` Deprecated. Use `MODE_LAST_MATCH` instead.
`static int` `MODE_BEST_MATCH` Each call will be routed to the route with the best score, if the required score is reached.
`static int` `MODE_CUSTOM` Each call will be routed according to a custom mode.
`static int` `MODE_FIRST_MATCH` Each call is routed to the first route if the required score is reached.
`static int` `MODE_LAST_MATCH` Each call will be routed to the last route if the required score is reached.
`static int` `MODE_NEXT_MATCH` Each call is be routed to the next route target if the required score is reached.
`static int` `MODE_RANDOM_MATCH` Each call will be randomly routed to one of the routes that reached the required score.
`static int` `NEXT` Deprecated. Use `MODE_NEXT_MATCH` instead.
`static int` `RANDOM` Deprecated. Use `MODE_RANDOM_MATCH` instead.

### Constructor Summary

Constructors
Constructor and Description
`Router()` Constructor.
`Router(Context context)` Constructor.

### Method Summary

Methods
`Route` `attach(Restlet target)` Attaches a target Restlet to this router with an empty URI pattern.
`Route` `attach(Restlet target, int matchingMode)` Attaches a target Restlet to this router with an empty URI pattern.
`Route` `attach(java.lang.String pathTemplate, java.lang.Class<?> targetClass)` Attaches a target Resource class to this router based on a given URI pattern.
`Route` `attach(java.lang.String pathTemplate, java.lang.Class<?> targetClass, int matchingMode)` Attaches a target Resource class to this router based on a given URI pattern.
`Route` `attach(java.lang.String pathTemplate, Restlet target)` Attaches a target Restlet to this router based on a given URI pattern.
`Route` `attach(java.lang.String pathTemplate, Restlet target, int matchingMode)` Attaches a target Restlet to this router based on a given URI pattern.
`Route` `attachDefault(java.lang.Class<?> defaultTargetClass)` Attaches a Resource class to this router as the default target to invoke when no route matches.
`Route` `attachDefault(Restlet defaultTarget)` Attaches a Restlet to this router as the default target to invoke when no route matches.
`Finder` `createFinder(java.lang.Class<?> targetClass)` Creates a new finder instance based on the "targetClass" property.
`protected Route` `createRoute(java.lang.String uriPattern, Restlet target)` Creates a new route for the given URI pattern and target.
`protected Route` `createRoute(java.lang.String uriPattern, Restlet target, int matchingMode)` Creates a new route for the given URI pattern, target and matching mode.
`void` `detach(java.lang.Class<?> targetClass)` Detaches the target from this router.
`void` `detach(Restlet target)` Detaches the target from this router.
`protected void` `doHandle(Restlet next, Request request, Response response)` Effectively handles the call using the selected next `Restlet`, typically the selected `Route`.
`protected Route` `getCustom(Request request, Response response)` Returns the matched route according to a custom algorithm.
`int` `getDefaultMatchingMode()` Returns the default matching mode to use when selecting routes based on URIs.
`boolean` `getDefaultMatchingQuery()` Returns the default setting for whether the routing should be done on URIs with or without taking into account query string.
`boolean` `getDefaultMatchQuery()` Deprecated. Use `getDefaultMatchingQuery()` instead.
`Route` `getDefaultRoute()` Returns the default route to test if no other one was available after retrying the maximum number of attempts.
`java.lang.Class<? extends Finder>` `getFinderClass()` Returns the finder class to instantiate.
`protected int` `getMatchingMode(Restlet target)` Returns the matching mode for the target Restlet.
`int` `getMaxAttempts()` Returns the maximum number of attempts if no attachment could be matched on the first attempt.
`Restlet` `getNext(Request request, Response response)` Returns the next Restlet if available.
`float` `getRequiredScore()` Returns the minimum score required to have a match.
`long` `getRetryDelay()` Returns the delay in milliseconds before a new attempt is made.
`RouteList` `getRoutes()` Returns the modifiable list of routes.
`int` `getRoutingMode()` Returns the routing mode.
`void` `handle(Request request, Response response)` Handles a call by invoking the next Restlet if it is available.
`protected void` `logRoute(Route route)` Logs the route selected.
`void` `setDefaultMatchingMode(int defaultMatchingMode)` Sets the default matching mode to use when selecting routes based on URIs.
`void` `setDefaultMatchingQuery(boolean defaultMatchingQuery)` Sets the default setting for whether the routing should be done on URIs with or without taking into account query string.
`void` `setDefaultMatchQuery(boolean defaultMatchingQuery)` Deprecated. Use `setDefaultMatchingQuery(boolean)` instead.
`void` `setDefaultRoute(Route defaultRoute)` Sets the default route tested if no other one was available.
`void` `setFinderClass(java.lang.Class<? extends Finder> finderClass)` Sets the finder class to instantiate.
`void` `setMaxAttempts(int maxAttempts)` Sets the maximum number of attempts if no attachment could be matched on the first attempt.
`void` `setRequiredScore(float score)` Sets the score required to have a match.
`void` `setRetryDelay(long retryDelay)` Sets the delay in milliseconds before a new attempt is made.
`void` `setRoutes(RouteList routes)` Sets the modifiable list of routes.
`void` `setRoutingMode(int routingMode)` Sets the routing mode.
`void` `start()` Starts the filter and the attached routes.
`void` `stop()` Stops the filter and the attached routes.

### Methods inherited from class org.restlet.Restlet

`finalize, getApplication, getAuthor, getContext, getDescription, getLogger, getName, getOwner, isStarted, isStopped, setAuthor, setContext, setDescription, setName, setOwner`

### Methods inherited from class java.lang.Object

`clone, equals, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait`

### Field Detail

#### BEST

    @Deprecated
    public static final int BEST

Deprecated. Use `MODE_BEST_MATCH` instead.
Each call will be routed to the route with the best score, if the required score is reached.

See Also:
  Constant Field Values

#### CUSTOM

    @Deprecated
    public static final int CUSTOM

Deprecated. Use `MODE_CUSTOM` instead.
Each call will be routed according to a custom mode.

See Also:
  Constant Field Values

#### FIRST

    @Deprecated
    public static final int FIRST

Deprecated. Use `MODE_FIRST_MATCH` instead.
Each call is routed to the first route if the required score is reached. If the required score is not reached, then the route is skipped and the next one is considered.

See Also:
  Constant Field Values

#### LAST

    @Deprecated
    public static final int LAST

Deprecated. Use `MODE_LAST_MATCH` instead.
Each call will be routed to the last route if the required score is reached. If the required score is not reached, then the route is skipped and the previous one is considered.

See Also:
  Constant Field Values

#### MODE_BEST_MATCH

    public static final int MODE_BEST_MATCH

Each call will be routed to the route with the best score, if the required score is reached.

See Also:
  Constant Field Values

#### MODE_CUSTOM

    public static final int MODE_CUSTOM

Each call will be routed according to a custom mode.

See Also:
  Constant Field Values

#### MODE_FIRST_MATCH

    public static final int MODE_FIRST_MATCH

Each call is routed to the first route if the required score is reached. If the required score is not reached, then the route is skipped and the next one is considered.

See Also:
  Constant Field Values

#### MODE_LAST_MATCH

    public static final int MODE_LAST_MATCH

Each call will be routed to the last route if the required score is reached. If the required score is not reached, then the route is skipped and the previous one is considered.

See Also:
  Constant Field Values

#### MODE_NEXT_MATCH

    public static final int MODE_NEXT_MATCH

Each call is be routed to the next route target if the required score is reached. The next route is relative to the previous call routed (round robin mode). If the required score is not reached, then the route is skipped and the next one is considered. If the last route is reached, the first route will be considered.

See Also:
  Constant Field Values

#### MODE_RANDOM_MATCH

    public static final int MODE_RANDOM_MATCH

Each call will be randomly routed to one of the routes that reached the required score. If the random route selected is not a match then the immediate next route is evaluated until one matching route is found. If we get back to the initial random route selected with no match, then we return null.

See Also:
  Constant Field Values

#### NEXT

    @Deprecated
    public static final int NEXT

Deprecated. Use `MODE_NEXT_MATCH` instead.
Each call is be routed to the next route target if the required score is reached. The next route is relative to the previous call routed (round robin mode). If the required score is not reached, then the route is skipped and the next one is considered. If the last route is reached, the first route will be considered.

See Also:
  Constant Field Values

#### RANDOM

    @Deprecated
    public static final int RANDOM

Deprecated. Use `MODE_RANDOM_MATCH` instead.
Each call will be randomly routed to one of the routes that reached the required score. If the random route selected is not a match then the immediate next route is evaluated until one matching route is found. If we get back to the initial random route selected with no match, then we return null.

See Also:
  Constant Field Values

### Constructor Detail

#### Router

    public Router()

Constructor. Note that usage of this constructor is not recommended as the Router won't have a proper context set. In general you will prefer to use the other constructor and pass it the parent application's context or eventually the parent component's context if you don't use applications.

#### Router

    public Router(Context context)

Constructor.

Parameters:
  `context` - The context.

### Method Detail

#### attach

    public Route attach(Restlet target)

Attaches a target Restlet to this router with an empty URI pattern. A new route using the matching mode returned by `getMatchingMode(Restlet)` will be added routing to the target when any call is received.

Parameters:
  `target` - The target Restlet to attach.
Returns:
  The created route.

#### attach

    public Route attach(Restlet target,
               int matchingMode)

Attaches a target Restlet to this router with an empty URI pattern. A new route will be added routing to the target when any call is received.

Parameters:
  `target` - The target Restlet to attach.
  `matchingMode` - The matching mode.
Returns:
  The created route.

#### attach

    public Route attach(java.lang.String pathTemplate,
               java.lang.Class<?> targetClass)

Attaches a target Resource class to this router based on a given URI pattern. A new route using the matching mode returned by `getMatchingMode(Restlet)` will be added routing to the target when calls with a URI matching the pattern will be received.

Parameters:
  `pathTemplate` - The URI path template that must match the relative part of the resource URI.
  `targetClass` - The target Resource class to attach.
Returns:
  The created route.

#### attach

    public Route attach(java.lang.String pathTemplate,
               java.lang.Class<?> targetClass,
               int matchingMode)

Attaches a target Resource class to this router based on a given URI pattern. A new route will be added routing to the target when calls with a URI matching the pattern will be received.

Parameters:
  `pathTemplate` - The URI path template that must match the relative part of the resource URI.
  `targetClass` - The target Resource class to attach.
  `matchingMode` - The matching mode.
Returns:
  The created route.

#### attach

    public Route attach(java.lang.String pathTemplate,
               Restlet target)

Attaches a target Restlet to this router based on a given URI pattern. A new route using the matching mode returned by `getMatchingMode(Restlet)` will be added routing to the target when calls with a URI matching the pattern will be received.

Parameters:
  `pathTemplate` - The URI path template that must match the relative part of the resource URI.
  `target` - The target Restlet to attach.
Returns:
  The created route.

#### attach

    public Route attach(java.lang.String pathTemplate,
               Restlet target,
               int matchingMode)

Attaches a target Restlet to this router based on a given URI pattern. A new route will be added routing to the target when calls with a URI matching the pattern will be received.

Parameters:
  `pathTemplate` - The URI path template that must match the relative part of the resource URI.
  `target` - The target Restlet to attach.
  `matchingMode` - The matching mode.
Returns:
  The created route.

#### attachDefault

    public Route attachDefault(java.lang.Class<?> defaultTargetClass)

Attaches a Resource class to this router as the default target to invoke when no route matches. It actually sets a default route that scores all calls to 1.0.

Parameters:
  `defaultTargetClass` - The target Resource class to attach.
Returns:
  The created route.

#### attachDefault

    public Route attachDefault(Restlet defaultTarget)

Attaches a Restlet to this router as the default target to invoke when no route matches. It actually sets a default route that scores all calls to 1.0.

Parameters:
  `defaultTarget` - The Restlet to use as the default target.
Returns:
  The created route.

#### createFinder

    public Finder createFinder(java.lang.Class<?> targetClass)

Creates a new finder instance based on the "targetClass" property.

Parameters:
  `targetClass` - The target Resource class to attach.
Returns:
  The new finder instance.

#### createRoute

    protected Route createRoute(java.lang.String uriPattern,
                    Restlet target)

Creates a new route for the given URI pattern and target. The route will match the URI query string depending on the result of `getDefaultMatchingQuery()` and the matching mode will be given by `getMatchingMode(Restlet)`.

Parameters:
  `uriPattern` - The URI pattern that must match the relative part of the resource URI.
  `target` - The target Restlet to attach.
Returns:
  The created route.

#### createRoute

    protected Route createRoute(java.lang.String uriPattern,
                    Restlet target,
                    int matchingMode)

Creates a new route for the given URI pattern, target and matching mode. The route will match the URI query string depending on the result of `getDefaultMatchingQuery()`.

Parameters:
  `uriPattern` - The URI pattern that must match the relative part of the resource URI.
  `target` - The target Restlet to attach.
  `matchingMode` - The matching mode.
Returns:
  The created route.

#### detach

    public void detach(java.lang.Class<?> targetClass)

Detaches the target from this router. All routes routing to this target Restlet are removed from the list of routes and the default route is set to null.

Parameters:
  `targetClass` - The target class to detach.

#### detach

    public void detach(Restlet target)

Detaches the target from this router. All routes routing to this target Restlet are removed from the list of routes and the default route is set to null.

Parameters:
  `target` - The target Restlet to detach.

#### doHandle

    protected void doHandle(Restlet next,
                Request request,
                Response response)

Effectively handles the call using the selected next `Restlet`, typically the selected `Route`. By default, it just invokes the next Restlet.

Parameters:
  `next` - The next Restlet to invoke.
  `request` - The request.
  `response` - The response.

#### getCustom

    protected Route getCustom(Request request,
                  Response response)

Returns the matched route according to a custom algorithm. To use in combination of the `MODE_CUSTOM` option. The default implementation (to be overridden), returns null.

Parameters:
  `request` - The request to handle.
  `response` - The response to update.
Returns:
  The matched route if available or null.

#### getDefaultMatchingMode

    public int getDefaultMatchingMode()

Returns the default matching mode to use when selecting routes based on URIs. By default it returns `Template.MODE_EQUALS`.

Returns:
  The default matching mode.

#### getDefaultMatchingQuery

    public boolean getDefaultMatchingQuery()

Returns the default setting for whether the routing should be done on URIs with or without taking into account query string. By default, it returns false.

Returns:
  the default setting for whether the routing should be done on URIs with or without taking into account query string.

#### getDefaultMatchQuery

    @Deprecated
    public boolean getDefaultMatchQuery()

Deprecated. Use `getDefaultMatchingQuery()` instead.
Returns the default setting for whether the routing should be done on URIs with or without taking into account query string. By default, it returns false.

Returns:
  the default setting for whether the routing should be done on URIs with or without taking into account query string.

#### getDefaultRoute

    public Route getDefaultRoute()

Returns the default route to test if no other one was available after retrying the maximum number of attempts.

Returns:
  The default route tested if no other one was available.

#### getFinderClass

    public java.lang.Class<? extends Finder> getFinderClass()

Returns the finder class to instantiate.

Returns:
  the finder class to instantiate.

#### getMatchingMode

    protected int getMatchingMode(Restlet target)

Returns the matching mode for the target Restlet. By default it returns `getDefaultMatchingMode()`. If the target is an instance of `Directory` or `Router` then the mode returned is `Template.MODE_STARTS_WITH` to allow further routing by those objects. If the target is an instance of `Filter`, then it returns the matching mode for the `Filter.getNext()` Restlet recursively.

Parameters:
  `target` - The target Restlet.
Returns:
  The preferred matching mode.

#### getMaxAttempts

    public int getMaxAttempts()

Returns the maximum number of attempts if no attachment could be matched on the first attempt. This is useful when the attachment scoring is dynamic and therefore could change on a retry. The default value is set to 1.

Returns:
  The maximum number of attempts if no attachment could be matched on the first attempt.

#### getNext

    public Restlet getNext(Request request,
                  Response response)

Returns the next Restlet if available.

Parameters:
  `request` - The request to handle.
  `response` - The response to update.
Returns:
  The next Restlet if available or null.

#### getRequiredScore

    public float getRequiredScore()

Returns the minimum score required to have a match. By default, it returns `0.5`.

Returns:
  The minimum score required to have a match.

#### getRetryDelay

    public long getRetryDelay()

Returns the delay in milliseconds before a new attempt is made. The default value is `500`.

Returns:
  The delay in milliseconds before a new attempt is made.

#### getRoutes

    public RouteList getRoutes()

Returns the modifiable list of routes. Creates a new instance if no one has been set.

Returns:
  The modifiable list of routes.

#### getRoutingMode

    public int getRoutingMode()

Returns the routing mode. By default, it returns the `MODE_FIRST_MATCH` mode.

Returns:
  The routing mode.

#### handle

    public void handle(Request request,
              Response response)

Handles a call by invoking the next Restlet if it is available.

Specified by:
  `handle` in interface `Uniform`
Overrides:
  `handle` in class `Restlet`
Parameters:
  `request` - The request to handle.
  `response` - The response to update.

#### logRoute

    protected void logRoute(Route route)

Logs the route selected.

Parameters:
  `route` - The route selected.

#### setDefaultMatchingMode

    public void setDefaultMatchingMode(int defaultMatchingMode)

Sets the default matching mode to use when selecting routes based on URIs. By default it is set to `Template.MODE_EQUALS`.

Parameters:
  `defaultMatchingMode` - The default matching mode.

#### setDefaultMatchingQuery

    public void setDefaultMatchingQuery(boolean defaultMatchingQuery)

Sets the default setting for whether the routing should be done on URIs with or without taking into account query string. By default, it is set to false.

Parameters:
  `defaultMatchingQuery` - The default setting for whether the routing should be done on URIs with or without taking into account query string.

#### setDefaultMatchQuery

    @Deprecated
    public void setDefaultMatchQuery(boolean defaultMatchingQuery)

Deprecated. Use `setDefaultMatchingQuery(boolean)` instead.
Sets the default setting for whether the routing should be done on URIs with or without taking into account query string. By default, it is set to false.

Parameters:
  `defaultMatchingQuery` - The default setting for whether the routing should be done on URIs with or without taking into account query string.

#### setDefaultRoute

    public void setDefaultRoute(Route defaultRoute)

Sets the default route tested if no other one was available.

Parameters:
  `defaultRoute` - The default route tested if no other one was available.

#### setFinderClass

    public void setFinderClass(java.lang.Class<? extends Finder> finderClass)

Sets the finder class to instantiate.

Parameters:
  `finderClass` - The finder class to instantiate.

#### setMaxAttempts

    public void setMaxAttempts(int maxAttempts)

Sets the maximum number of attempts if no attachment could be matched on the first attempt. This is useful when the attachment scoring is dynamic and therefore could change on a retry.

Parameters:
  `maxAttempts` - The maximum number of attempts.

#### setRequiredScore

    public void setRequiredScore(float score)

Sets the score required to have a match. By default, it is set to `0.5`.

Parameters:
  `score` - The score required to have a match.

#### setRetryDelay

    public void setRetryDelay(long retryDelay)

Sets the delay in milliseconds before a new attempt is made. By default, it is set to `500`.

Parameters:
  `retryDelay` - The delay in milliseconds before a new attempt is made.

#### setRoutes

    public void setRoutes(RouteList routes)

Sets the modifiable list of routes.

Parameters:
  `routes` - The modifiable list of routes.

#### setRoutingMode

    public void setRoutingMode(int routingMode)

Sets the routing mode. By default, it is set to the `MODE_FIRST_MATCH` mode.

Parameters:
  `routingMode` - The routing mode.

#### start

    public void start()
               throws java.lang.Exception

Starts the filter and the attached routes.

Overrides:
  `start` in class `Restlet`
Throws:
  `java.lang.Exception`

#### stop

    public void stop()
              throws java.lang.Exception

Stops the filter and the attached routes.

Overrides:
  `stop` in class `Restlet`
Throws:
  `java.lang.Exception`