Skip to content

Commit 8d8077b

Browse files
committed
Multiple filters for interceptors fix #376
1 parent 151084e commit 8d8077b

4 files changed

Lines changed: 127 additions & 26 deletions

File tree

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
package org.jooby.issues;
2+
3+
import static org.junit.Assert.assertEquals;
4+
5+
import java.util.concurrent.atomic.AtomicInteger;
6+
7+
import org.jooby.Results;
8+
import org.jooby.test.ServerFeature;
9+
import org.junit.Test;
10+
11+
public class Issue376 extends ServerFeature {
12+
13+
{
14+
before("/before", (req, rsp) -> {
15+
req.set("counter", 1);
16+
}, (req, rsp) -> {
17+
int counter = req.get("counter");
18+
req.set("counter", counter + 1);
19+
}, (req, rsp) -> {
20+
int counter = req.get("counter");
21+
req.set("counter", counter + 1);
22+
});
23+
24+
after("/after", (req, rsp, result) -> {
25+
int counter = result.get();
26+
return Results.ok(counter + 1);
27+
}, (req, rsp, result) -> {
28+
int counter = result.get();
29+
return Results.ok(counter + 1);
30+
});
31+
32+
AtomicInteger completeCounter = new AtomicInteger(0);
33+
34+
complete("/complete", (req, rsp, cause) -> {
35+
completeCounter.incrementAndGet();
36+
}, (req, rsp, cause) -> {
37+
completeCounter.incrementAndGet();
38+
}, (req, rsp, cause) -> {
39+
completeCounter.incrementAndGet();
40+
});
41+
42+
get("/before", req -> req.get("counter"));
43+
44+
get("/after", req -> 1);
45+
46+
get("/complete", req -> 1);
47+
48+
onStop(() -> {
49+
assertEquals(3, completeCounter.get());
50+
});
51+
}
52+
53+
@Test
54+
public void multipleBeforeFilter() throws Exception {
55+
request()
56+
.get("/before")
57+
.expect("3");
58+
}
59+
60+
@Test
61+
public void multipleAfterFilter() throws Exception {
62+
request()
63+
.get("/after")
64+
.expect("3");
65+
}
66+
67+
@Test
68+
public void multipleCompleteFilter() throws Exception {
69+
request()
70+
.get("/complete")
71+
.expect("1");
72+
}
73+
74+
}

jooby/src/main/java/org/jooby/Jooby.java

Lines changed: 22 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1049,21 +1049,33 @@ public Jooby renderer(final Renderer renderer) {
10491049
}
10501050

10511051
@Override
1052-
public Route.Definition before(final String method, final String pattern,
1053-
final Route.Before handler) {
1054-
return appendDefinition(new Route.Definition(method, pattern, handler));
1052+
public Route.Collection before(final String method, final String pattern,
1053+
final Route.Before handler, final Route.Before... chain) {
1054+
Route.Definition[] routes = javaslang.collection.List.of(handler)
1055+
.appendAll(Arrays.asList(chain))
1056+
.map(before -> appendDefinition(new Route.Definition(method, pattern, before)))
1057+
.toJavaArray(Route.Definition.class);
1058+
return new Route.Collection(routes);
10551059
}
10561060

10571061
@Override
1058-
public Route.Definition after(final String method, final String pattern,
1059-
final Route.After handler) {
1060-
return appendDefinition(new Route.Definition(method, pattern, handler));
1062+
public Route.Collection after(final String method, final String pattern,
1063+
final Route.After handler, final Route.After... chain) {
1064+
Route.Definition[] routes = javaslang.collection.List.of(handler)
1065+
.appendAll(Arrays.asList(chain))
1066+
.map(after -> appendDefinition(new Route.Definition(method, pattern, after)))
1067+
.toJavaArray(Route.Definition.class);
1068+
return new Route.Collection(routes);
10611069
}
10621070

10631071
@Override
1064-
public Route.Definition complete(final String method, final String pattern,
1065-
final Route.Complete handler) {
1066-
return appendDefinition(new Route.Definition(method, pattern, handler));
1072+
public Route.Collection complete(final String method, final String pattern,
1073+
final Route.Complete handler, final Route.Complete... chain) {
1074+
Route.Definition[] routes = javaslang.collection.List.of(handler)
1075+
.appendAll(Arrays.asList(chain))
1076+
.map(complete -> appendDefinition(new Route.Definition(method, pattern, complete)))
1077+
.toJavaArray(Route.Definition.class);
1078+
return new Route.Collection(routes);
10671079
}
10681080

10691081
/**
@@ -3180,6 +3192,7 @@ public Jooby use(final Config config) {
31803192
* @param err A route error handler.
31813193
* @return This jooby instance.
31823194
*/
3195+
@Override
31833196
public Jooby err(final Err.Handler err) {
31843197
this.bag.add(requireNonNull(err, "An err handler is required."));
31853198
return this;

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -801,7 +801,7 @@ private void newRoute(final Route.Definition route) {
801801
class Collection implements Props<Collection> {
802802

803803
/** List of definitions. */
804-
private Route.Props[] routes;
804+
private final Route.Props[] routes;
805805

806806
/**
807807
* Creates a new collection of route definitions.

jooby/src/main/java/org/jooby/Routes.java

Lines changed: 30 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1734,10 +1734,11 @@ Route.Definition connect(String path,
17341734
* </p>
17351735
*
17361736
* @param handler Before handler.
1737+
* @param chain Chain of before handler.
17371738
* @return A new route definition.
17381739
*/
1739-
default Route.Definition before(final Route.Before handler) {
1740-
return before("*", handler);
1740+
default Route.Collection before(final Route.Before handler, final Route.Before... chain) {
1741+
return before("*", handler, chain);
17411742
}
17421743

17431744
/**
@@ -1792,10 +1793,12 @@ default Route.Definition before(final Route.Before handler) {
17921793
*
17931794
* @param pattern Pattern to intercept.
17941795
* @param handler Before handler.
1796+
* @param chain Chain of before handler.
17951797
* @return A new route definition.
17961798
*/
1797-
default Route.Definition before(final String pattern, final Route.Before handler) {
1798-
return before("*", pattern, handler);
1799+
default Route.Collection before(final String pattern, final Route.Before handler,
1800+
final Route.Before... chain) {
1801+
return before("*", pattern, handler, chain);
17991802
}
18001803

18011804
/**
@@ -1851,9 +1854,11 @@ default Route.Definition before(final String pattern, final Route.Before handler
18511854
* @param method HTTP method to intercept.
18521855
* @param pattern Pattern to intercept.
18531856
* @param handler Before handler.
1857+
* @param chain Chain of before handler.
18541858
* @return A new route definition.
18551859
*/
1856-
Route.Definition before(String method, String pattern, Route.Before handler);
1860+
Route.Collection before(String method, String pattern, Route.Before handler,
1861+
Route.Before... chain);
18571862

18581863
/**
18591864
* <h2>after</h2>
@@ -1915,10 +1920,11 @@ default Route.Definition before(final String pattern, final Route.Before handler
19151920
* </p>
19161921
*
19171922
* @param handler After handler.
1923+
* @param chain After chain.
19181924
* @return A new route definition.
19191925
*/
1920-
default Route.Definition after(final Route.After handler) {
1921-
return after("*", handler);
1926+
default Route.Collection after(final Route.After handler, final Route.After... chain) {
1927+
return after("*", handler, chain);
19221928
}
19231929

19241930
/**
@@ -1980,10 +1986,12 @@ default Route.Definition after(final Route.After handler) {
19801986
*
19811987
* @param pattern Pattern to intercept.
19821988
* @param handler After handler.
1989+
* @param chain After chain.
19831990
* @return A new route definition.
19841991
*/
1985-
default Route.Definition after(final String pattern, final Route.After handler) {
1986-
return after("*", pattern, handler);
1992+
default Route.Collection after(final String pattern, final Route.After handler,
1993+
final Route.After... chain) {
1994+
return after("*", pattern, handler, chain);
19871995
}
19881996

19891997
/**
@@ -2047,9 +2055,10 @@ default Route.Definition after(final String pattern, final Route.After handler)
20472055
* @param method HTTP method to intercept.
20482056
* @param pattern Pattern to intercept.
20492057
* @param handler After handler.
2058+
* @param chain After chain.
20502059
* @return A new route definition.
20512060
*/
2052-
Route.Definition after(String method, String pattern, Route.After handler);
2061+
Route.Collection after(String method, String pattern, Route.After handler, Route.After... chain);
20532062

20542063
/**
20552064
* <h2>complete</h2>
@@ -2151,10 +2160,11 @@ default Route.Definition after(final String pattern, final Route.After handler)
21512160
* }</pre>
21522161
*
21532162
* @param handler Complete handler.
2163+
* @param chain Complete chain.
21542164
* @return A new route definition.
21552165
*/
2156-
default Route.Definition complete(final Route.Complete handler) {
2157-
return complete("*", handler);
2166+
default Route.Collection complete(final Route.Complete handler, final Route.Complete... chain) {
2167+
return complete("*", handler, chain);
21582168
}
21592169

21602170
/**
@@ -2257,11 +2267,13 @@ default Route.Definition complete(final Route.Complete handler) {
22572267
* }</pre>
22582268
*
22592269
* @param pattern Pattern to intercept.
2260-
* @param handler Before handler.
2270+
* @param handler Complete handler.
2271+
* @param chain Complete chain.
22612272
* @return A new route definition.
22622273
*/
2263-
default Route.Definition complete(final String pattern, final Route.Complete handler) {
2264-
return complete("*", pattern, handler);
2274+
default Route.Collection complete(final String pattern, final Route.Complete handler,
2275+
final Route.Complete... chain) {
2276+
return complete("*", pattern, handler, chain);
22652277
}
22662278

22672279
/**
@@ -2365,9 +2377,11 @@ default Route.Definition complete(final String pattern, final Route.Complete han
23652377
* @param method HTTP method to intercept.
23662378
* @param pattern Pattern to intercept.
23672379
* @param handler Complete handler.
2380+
* @param chain Complete chain.
23682381
* @return A new route definition.
23692382
*/
2370-
Route.Definition complete(String method, String pattern, Route.Complete handler);
2383+
Route.Collection complete(String method, String pattern, Route.Complete handler,
2384+
Route.Complete... chain);
23712385

23722386
/**
23732387
* Append a new WebSocket handler under the given path.

0 commit comments

Comments
 (0)