/routd

A small and simple URL routing library for Java

Primary LanguageJavaApache License 2.0Apache-2.0

Routd


Routd is a small and simple URL routing library for Java. It is currently not trie-based, and may not be as performant as trie-based implementations. However, it does contain a tree-based implementation, which should be sufficient for most cases.

Getting Started


Download the latest .jar. Or, add the following dependency to your pom.xml:

<dependency>
    <groupId>org.bigtesting</groupId>
    <artifactId>routd</artifactId>
    <version>1.0.7</version>
</dependency>

Or, if you are using Gradle:

dependencies {
	compile "org.bigtesting:routd:1.0.7"
}

Usage


There are two classes of interest in the Routd library: Route and Router.

First, you create Routes:

Route r1 = new Route("/");
Route r2 = new Route("/client/:name");
Route r3 = new Route("/customer/:id<[0-9]+>");
Route r4 = new Route("/user/*/account");

...and add them to a Router:

Router router = new TreeRouter();
router.add(r1);
router.add(r2);
router.add(r3);
router.add(r4);

Then you can retrieve the routes:

assertEquals(r1, router.route("/"));
assertEquals(r2, router.route("/client/Tim"));
assertEquals(r3, router.route("/customer/123"));
assertEquals(r4, router.route("/user/john/account"));

With the routes, you can get the parameter values from a path:

Route route = new Route("/customer/:id/named/:name/*");
String path = "/customer/1/named/John/Doe";

assertEquals("1", route.getNamedParameter("id", path));
assertEquals("John", route.getNamedParameter("name", path));
assertNull(route.getNamedParameter("blah", path));
assertEquals("Doe", route.splat(path)[0]);

...and you can also get the path parameter elements directly:

Route route = new Route("/customer/:id<[0-9]+>/named/:name/*");

List<PathElement> elements = route.getPathElements();
assertEquals(5, elements.size());

StaticPathElement firstStaticElement = (StaticPathElement)elements.get(0);
assertEquals("customer", firstStaticElement.name());
assertEquals(0, firstStaticElement.index());

NamedParameterElement firstNamedElement = (NamedParameterElement)elements.get(1);
assertEquals("id", firstNamedElement.name());
assertEquals(1, firstNamedElement.index());
assertEquals("[0-9]+", firstNamedElement.regex());

NamedParameterElement secondNamedElement = (NamedParameterElement)elements.get(3);
assertEquals("name", secondNamedElement.name());
assertEquals(3, secondNamedElement.index());
assertNull(secondNamedElement.regex());

SplatParameterElement splatElement = (SplatParameterElement)elements.get(4);
assertEquals(4, splatElement.index());

Notes


Routers currently expect URL paths to be undecoded. That is, paths should retain any URL encodings. The router will handle any URL decoding required.