Skip to content

Commit 1dcca6c

Browse files
authored
Merge pull request #787 from jooby-project/786
Add routes method to chain object fix #786
2 parents 086ebfd + 8d3c1b0 commit 1dcca6c

File tree

5 files changed

+138
-1
lines changed

5 files changed

+138
-1
lines changed
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
package org.jooby.issues;
2+
3+
import static org.junit.Assert.assertEquals;
4+
5+
import java.util.List;
6+
7+
import org.jooby.Route;
8+
import org.jooby.test.ServerFeature;
9+
import org.junit.Test;
10+
11+
public class Issue786 extends ServerFeature {
12+
13+
{
14+
use("*", (req, rsp, chain) -> {
15+
List<Route> routes = chain.routes();
16+
assertEquals(2, routes.size());
17+
assertEquals("/r2", routes.get(0).name());
18+
assertEquals("/r3", routes.get(1).name());
19+
assertEquals("/786/:id", routes.get(routes.size() - 1).pattern());
20+
chain.next(req, rsp);
21+
}).name("r1");
22+
23+
use("/786/**", (req, rsp, chain) -> {
24+
List<Route> routes = chain.routes();
25+
assertEquals(1, routes.size());
26+
assertEquals("/r3", routes.get(0).name());
27+
assertEquals("/786/:id", routes.get(routes.size() - 1).pattern());
28+
chain.next(req, rsp);
29+
}).name("r2");
30+
31+
get("/786/:id", req -> {
32+
return req.param("id").value();
33+
}).name("r3");
34+
}
35+
36+
@Test
37+
public void shouldHaveAccessToRoutePipeline() throws Exception {
38+
request()
39+
.get("/786/123")
40+
.expect("123");
41+
}
42+
43+
}
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
package org.jooby.issues;
2+
3+
import static org.junit.Assert.assertEquals;
4+
5+
import java.util.List;
6+
7+
import org.jooby.Route;
8+
import org.jooby.test.ServerFeature;
9+
import org.junit.Test;
10+
11+
public class Issue786b extends ServerFeature {
12+
13+
{
14+
use("*", (req, rsp, chain) -> {
15+
List<Route> routes = chain.routes();
16+
assertEquals(2, routes.size());
17+
assertEquals("/r2", routes.get(0).name());
18+
assertEquals("/r3", routes.get(1).name());
19+
assertEquals("/786/:id", routes.get(routes.size() - 1).pattern());
20+
chain.next(req, rsp);
21+
}).name("r1");
22+
23+
use("/786/**", (req, rsp, chain) -> {
24+
List<Route> routes = chain.routes();
25+
assertEquals(1, routes.size());
26+
assertEquals("/r3", routes.get(0).name());
27+
assertEquals("/786/:id", routes.get(routes.size() - 1).pattern());
28+
chain.next(req, rsp);
29+
}).name("r2");
30+
31+
use("/786/:id", (req, rsp, chain) -> {
32+
List<Route> routes = chain.routes();
33+
assertEquals(0, routes.size());
34+
35+
rsp.send(req.param("id").value());
36+
}).name("r3");
37+
}
38+
39+
@Test
40+
public void shouldHaveAccessToRoutePipeline() throws Exception {
41+
request()
42+
.get("/786/123")
43+
.expect("123");
44+
}
45+
46+
}

jooby/src/main/java/org/jooby/Route.java

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2159,6 +2159,37 @@ interface Chain {
21592159
default void next(final Request req, final Response rsp) throws Throwable {
21602160
next(null, req, rsp);
21612161
}
2162+
2163+
/**
2164+
* All the pending/next routes from pipeline. Example:
2165+
*
2166+
* <pre>{@code
2167+
* use("*", (req, rsp, chain) -> {
2168+
* List<Route> routes = chain.routes();
2169+
* assertEquals(2, routes.size());
2170+
* assertEquals("/r2", routes.get(0).name());
2171+
* assertEquals("/r3", routes.get(1).name());
2172+
* assertEquals("/786/:id", routes.get(routes.size() - 1).pattern());
2173+
*
2174+
* chain.next(req, rsp);
2175+
* }).name("r1");
2176+
*
2177+
* use("/786/**", (req, rsp, chain) -> {
2178+
* List<Route> routes = chain.routes();
2179+
* assertEquals(1, routes.size());
2180+
* assertEquals("/r3", routes.get(0).name());
2181+
* assertEquals("/786/:id", routes.get(routes.size() - 1).pattern());
2182+
* chain.next(req, rsp);
2183+
* }).name("r2");
2184+
*
2185+
* get("/786/:id", req -> {
2186+
* return req.param("id").value();
2187+
* }).name("r3");
2188+
* }</pre>
2189+
*
2190+
* @return Next routes in the pipeline or empty list.
2191+
*/
2192+
List<Route> routes();
21622193
}
21632194

21642195
/** Route key. */

jooby/src/main/java/org/jooby/internal/RouteChain.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,9 @@
1818
*/
1919
package org.jooby.internal;
2020

21+
import java.util.Arrays;
2122
import java.util.HashMap;
23+
import java.util.List;
2224
import java.util.Map;
2325

2426
import org.jooby.Request;
@@ -86,6 +88,11 @@ private Route next(final String prefix) {
8688
return route;
8789
}
8890

91+
@Override
92+
public List<Route> routes() {
93+
return Arrays.asList(routes).subList(i, routes.length - 1);
94+
}
95+
8996
private RouteWithFilter get(final Route next) {
9097
return (RouteWithFilter) Route.Forwarding.unwrap(next);
9198
}

jooby/src/main/java/org/jooby/test/MockRouter.java

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@
4343
import org.jooby.Route.Filter;
4444
import org.jooby.Status;
4545

46+
import com.google.common.collect.ImmutableList;
4647
import com.google.common.collect.Lists;
4748
import com.google.common.reflect.Reflection;
4849
import com.google.inject.Injector;
@@ -251,7 +252,16 @@
251252
*/
252253
public class MockRouter {
253254

254-
private static final Route.Chain NOOP_CHAIN = (req, rsp, next) -> {
255+
private static final Route.Chain NOOP_CHAIN = new Route.Chain() {
256+
257+
@Override
258+
public List<Route> routes() {
259+
return ImmutableList.of();
260+
}
261+
262+
@Override
263+
public void next(final String prefix, final Request req, final Response rsp) throws Throwable {
264+
}
255265
};
256266

257267
private static class MockResponse extends Response.Forwarding {

0 commit comments

Comments
 (0)