Skip to content

Commit ba5934c

Browse files
committed
before/after interceptor fix jooby-project#315
1 parent 58f80cc commit ba5934c

28 files changed

Lines changed: 1510 additions & 65 deletions

File tree

Lines changed: 139 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,139 @@
1+
package org.jooby.issues;
2+
3+
import static org.junit.Assert.assertEquals;
4+
import static org.junit.Assert.assertTrue;
5+
6+
import java.util.concurrent.ExecutorService;
7+
import java.util.concurrent.Executors;
8+
import java.util.concurrent.atomic.AtomicInteger;
9+
10+
import org.jooby.test.ServerFeature;
11+
import org.junit.Test;
12+
13+
public class Issue315 extends ServerFeature {
14+
15+
{
16+
AtomicInteger inc = new AtomicInteger(1);
17+
18+
after("/err", (req, rsp, cause) -> {
19+
assertTrue(cause.isPresent());
20+
});
21+
22+
get("/err", () -> {
23+
throw new IllegalStateException();
24+
});
25+
26+
err((req, rsp, err) -> {
27+
rsp.send("err");
28+
});
29+
30+
get("direct-inc", () -> inc.get());
31+
32+
before("/rsp", (req, rsp) -> {
33+
rsp.send("before");
34+
});
35+
36+
StringBuilder buff = new StringBuilder();
37+
38+
get("/direct-buff", () -> buff);
39+
40+
before("/buff", (req, rsp) -> {
41+
buff.append("a");
42+
});
43+
44+
after("/buff", (req, rsp, cause) -> {
45+
buff.append("b");
46+
});
47+
get("/buff", () -> buff);
48+
49+
before("/chain", (req, rsp, result) -> {
50+
String v = result.get();
51+
result.set("<" + v + ">");
52+
return result;
53+
});
54+
55+
before("/chain", (req, rsp, result) -> {
56+
String v = result.get();
57+
result.set("-" + v + "-");
58+
return result;
59+
});
60+
61+
get("/chain", () -> "v");
62+
63+
after("/async", (req, rsp, cause) -> {
64+
assertEquals(false, cause.isPresent());
65+
});
66+
67+
ExecutorService executor = Executors.newSingleThreadExecutor();
68+
get("/async", promise(deferred -> {
69+
executor.execute(deferred.run(() -> "async"));
70+
}));
71+
72+
before((req, rsp) -> {
73+
inc.incrementAndGet();
74+
});
75+
76+
before((req, rsp, result) -> {
77+
Integer i = result.get();
78+
result.set(i + 2);
79+
return result;
80+
});
81+
82+
after((req, rsp, cause) -> {
83+
inc.incrementAndGet();
84+
});
85+
86+
get("/inc", () -> inc.get());
87+
}
88+
89+
@Test
90+
public void shouldInvokeBeforeAfterHandlers() throws Exception {
91+
request()
92+
.get("/inc")
93+
.expect("4");
94+
95+
request()
96+
.get("/direct-inc")
97+
.expect("3");
98+
}
99+
100+
@Test
101+
public void shouldGenerateAResponseFromBeforeSend() throws Exception {
102+
request()
103+
.get("/rsp")
104+
.expect("before");
105+
}
106+
107+
@Test
108+
public void beforeChain() throws Exception {
109+
request()
110+
.get("/chain")
111+
.expect("<-v->");
112+
}
113+
114+
@Test
115+
public void sendWithAfter() throws Exception {
116+
request()
117+
.get("/buff")
118+
.expect("a");
119+
120+
request()
121+
.get("/direct-buff")
122+
.expect("ab");
123+
}
124+
125+
@Test
126+
public void async() throws Exception {
127+
request()
128+
.get("/async")
129+
.expect("async");
130+
}
131+
132+
@Test
133+
public void afterWithErr() throws Exception {
134+
request()
135+
.get("/err")
136+
.expect("err");
137+
}
138+
139+
}

coverage-report/src/test/java/org/jooby/session/SessionConfigCookieFeature.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@
99
import java.util.Locale;
1010

1111
import org.jooby.Session;
12-
import org.jooby.mvc.Local;
1312
import org.jooby.test.ServerFeature;
1413
import org.junit.Test;
1514

coverage-report/src/test/java/org/jooby/ws/OnBadRequestErrFeature.java

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,10 @@
1010
import org.junit.Before;
1111
import org.junit.Test;
1212

13-
import com.ning.http.client.AsyncHttpClient;
14-
import com.ning.http.client.AsyncHttpClientConfig;
1513
import com.ning.http.client.AsyncHttpClient;
1614
import com.ning.http.client.AsyncHttpClientConfig;
1715
import com.ning.http.client.ws.WebSocket;
1816
import com.ning.http.client.ws.WebSocketListener;
19-
import com.ning.http.client.ws.WebSocketTextListener;
2017
import com.ning.http.client.ws.WebSocketUpgradeHandler;
2118

2219
public class OnBadRequestErrFeature extends ServerFeature {

jooby-hbm/src/main/java/org/jooby/hbm/OpenSessionInView.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ public OpenSessionInView(final Provider<HibernateEntityManagerFactory> emf,
5454
}
5555

5656
@Override
57-
public void handle(final Request req, final Response rsp, final Chain chain) throws Exception {
57+
public void handle(final Request req, final Response rsp, final Chain chain) throws Throwable {
5858
HibernateEntityManagerFactory hemf = emf.get();
5959
SessionFactory sf = hemf.getSessionFactory();
6060

jooby-hbm/src/main/java/org/jooby/internal/hbm/TrxResponse.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,7 @@ private void trxSend(final Object result) throws Exception {
101101
readOnlyTrx.begin();
102102

103103
// send it!
104-
super.send(result);
104+
rsp.send(result);
105105

106106
log.debug(" [{}] commiting readonly transaction: {}", sessionId, readOnlyTrx);
107107
readOnlyTrx.commit();

jooby-metrics/src/main/java/org/jooby/metrics/InstrumentedHandler.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@
3838
public class InstrumentedHandler implements Route.Filter {
3939

4040
@Override
41-
public void handle(final Request req, final Response rsp, final Chain chain) throws Exception {
41+
public void handle(final Request req, final Response rsp, final Chain chain) throws Throwable {
4242
MetricRegistry registry = req.require(MetricRegistry.class);
4343
Counter counter = registry.counter("request.actives");
4444
Timer.Context timer = registry.timer("request").time();

jooby-pac4j/src/main/java/org/jooby/internal/pac4j/FormFilter.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ public FormFilter(final String loginUrl, final String callback) {
8080
}
8181

8282
@Override
83-
public void handle(final Request req, final Response rsp, final Chain chain) throws Exception {
83+
public void handle(final Request req, final Response rsp, final Chain chain) throws Throwable {
8484
String error = req.param("error").toOptional().orElse("");
8585
String username = req.param("username").toOptional().orElse("");
8686

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

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -950,6 +950,24 @@ public Jooby renderer(final Renderer renderer) {
950950
return this;
951951
}
952952

953+
@Override
954+
public Route.Definition before(final String method, final String pattern,
955+
final Route.Before handler) {
956+
return appendDefinition(new Route.Definition(method, pattern, handler));
957+
}
958+
959+
@Override
960+
public Route.Definition before(final String method, final String pattern,
961+
final Route.BeforeSend handler) {
962+
return appendDefinition(new Route.Definition(method, pattern, handler));
963+
}
964+
965+
@Override
966+
public Route.Definition after(final String method, final String pattern,
967+
final Route.After handler) {
968+
return appendDefinition(new Route.Definition(method, pattern, handler));
969+
}
970+
953971
/**
954972
* Append a new filter that matches any method under the given path.
955973
*
@@ -3579,7 +3597,7 @@ private Injector bootstrap(final Config args,
35793597
.in(RequestScoped.class);
35803598
/** server sent event */
35813599
binder.bind(Sse.class).toProvider(Providers.outOfScope(Sse.class))
3582-
.in(RequestScoped.class);
3600+
.in(RequestScoped.class);
35833601

35843602
binder.bind(Session.class).toProvider(Providers.outOfScope(Session.class))
35853603
.in(RequestScoped.class);

jooby/src/main/java/org/jooby/Response.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -166,7 +166,9 @@ public Response type(final String type) {
166166

167167
@Override
168168
public void send(final Object result) throws Exception {
169-
rsp.send(result);
169+
// Special case: let the default response to deal with Object refs.
170+
// once resolved it will call the Result version.
171+
Response.super.send(result);
170172
}
171173

172174
@Override

jooby/src/main/java/org/jooby/Result.java

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -203,7 +203,7 @@ public Optional<Object> ifGet() {
203203
*
204204
* @return Value or <code>null</code>
205205
*/
206-
public Object get() {
206+
public <T> T get() {
207207
return get(MediaType.ALL);
208208
}
209209

@@ -223,11 +223,12 @@ public Optional<Object> ifGet(final List<MediaType> types) {
223223
* @param types Accept header.
224224
* @return Result content or <code>null</code>.
225225
*/
226-
public Object get(final List<MediaType> types) {
226+
@SuppressWarnings("unchecked")
227+
public <T> T get(final List<MediaType> types) {
227228
requireNonNull(types, "Types are required.");
228229
int size = data.size();
229230
if (size == 1) {
230-
return first.get();
231+
return (T) first.get();
231232
}
232233
if (size == 0) {
233234
return null;
@@ -238,7 +239,7 @@ public Object get(final List<MediaType> types) {
238239
.map(it -> data.remove(it))
239240
.orElseThrow(
240241
() -> new Err(Status.NOT_ACCEPTABLE, Joiner.on(", ").join(types)));
241-
return provider.get();
242+
return (T) provider.get();
242243
}
243244

244245
/**

0 commit comments

Comments
 (0)