Skip to content

Commit f9fa77e

Browse files
committed
Introduce RouteInterceptor and RequestModule
* get back JDBC & Hibernate modules
1 parent 351fc2d commit f9fa77e

20 files changed

Lines changed: 235 additions & 75 deletions

File tree

examples/pom.xml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,12 @@
3434
<version>${project.version}</version>
3535
</dependency>
3636

37+
<dependency>
38+
<groupId>com.github.jknack</groupId>
39+
<artifactId>jooby-hibernate</artifactId>
40+
<version>${project.version}</version>
41+
</dependency>
42+
3743
<!-- Test dependencies -->
3844
<dependency>
3945
<groupId>ch.qos.logback</groupId>

examples/src/main/java/jooby/MyApp.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -212,6 +212,7 @@ public class MyApp extends Jooby {
212212
{
213213
{
214214
use(new Jetty());
215+
use(new HibernatePersistence(User.class));
215216
use(new Jackson());
216217
use(new Hbs());
217218

examples/src/main/java/jooby/Resource.java

Lines changed: 25 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,17 @@
11
package jooby;
22

3+
import static java.util.Objects.requireNonNull;
4+
35
import java.util.Arrays;
46
import java.util.List;
57
import java.util.Optional;
68

9+
import javax.inject.Inject;
710
import javax.inject.Named;
11+
import javax.persistence.EntityManager;
812

913
import jooby.mvc.Body;
1014
import jooby.mvc.GET;
11-
import jooby.mvc.Header;
1215
import jooby.mvc.POST;
1316
import jooby.mvc.Path;
1417

@@ -17,29 +20,37 @@
1720
@Path("/resource")
1821
public class Resource {
1922

23+
private EntityManager em;
24+
25+
@Inject
26+
public Resource(final EntityManager em) {
27+
this.em = requireNonNull(em, "The em is required.");
28+
}
29+
2030
@GET
21-
@Path("/optional")
22-
public Object index(final Optional<String> value, @Named("JSESSIONID") final Cookie sessionId) {
23-
return ImmutableMap.builder()
24-
.put("value", value)
25-
.put("JSESSIONID", sessionId)
26-
.build();
31+
@Path("/save")
32+
public Object index(final String id, final String firstName, final String lastName) {
33+
User user = new User();
34+
user.setId(id);
35+
user.setFirstName(firstName);
36+
user.setLastName(lastName);
37+
em.persist(user);
38+
return user;
2739
}
2840

2941
@GET
30-
@Path("/vars/{id}")
42+
@Path("/user")
3143
public Object index(final String id) {
32-
return ImmutableMap.builder()
33-
.put("value", id)
34-
.build();
44+
User user = em.find(User.class, id);
45+
return user;
3546
}
3647

3748
@GET
38-
@Path("/string")
39-
public Object index(final String value, @Header("user-agent") final String userAgent) {
49+
@Path("/optional")
50+
public Object index(final Optional<String> value, @Named("JSESSIONID") final Cookie sessionId) {
4051
return ImmutableMap.builder()
4152
.put("value", value)
42-
.put("userAgent", userAgent)
53+
.put("JSESSIONID", sessionId)
4354
.build();
4455
}
4556

examples/src/main/java/jooby/User.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,26 @@
11
package jooby;
22

3+
import javax.persistence.Entity;
4+
import javax.persistence.Id;
5+
6+
@Entity
37
public class User {
48

9+
@Id
10+
private String id;
11+
512
private String firstName;
613

714
private String lastName;
815

16+
public String getId() {
17+
return id;
18+
}
19+
20+
public void setId(final String id) {
21+
this.id = id;
22+
}
23+
924
public String getFirstName() {
1025
return firstName;
1126
}
Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,3 @@
1-
db {
2-
type = mysql
3-
databaseName = test
4-
user = root
5-
}
1+
db=mem
62

73
hikari.maximumPoolSize = 10

examples/src/main/resources/index.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
<title>Hola</title>
44
</head>
55
<body>
6-
{{value}}
6+
{{this}}
77
{{userAgent}}
88
{{JSESSIONID}}
99
</body>

jooby-core/src/main/java/jooby/Jooby.java

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,12 @@ public void configure(final Binder binder) {
9999
Multibinder<RouteDefinition> definitions = Multibinder
100100
.newSetBinder(binder, RouteDefinition.class);
101101

102+
// Request Modules
103+
Multibinder.newSetBinder(binder, RequestModule.class);
104+
105+
// Route Interceptors
106+
Multibinder.newSetBinder(binder, RouteInterceptor.class);
107+
102108
// work dir
103109
binder.bind(File.class).annotatedWith(Names.named("jooby.workDir"))
104110
.toInstance(new File(config.getString("jooby.workDir")));
@@ -113,9 +119,9 @@ public void configure(final Binder binder) {
113119
if (route instanceof RouteDefinition) {
114120
definitions.addBinding().toInstance((RouteDefinition) route);
115121
} else {
116-
Routes.route(mode, (Class<?>) route)
117-
.forEach(mvcRoute -> definitions.addBinding().toInstance(mvcRoute)
118-
);
122+
Class<?> routeClass = (Class<?>) route;
123+
Routes.route(mode, routeClass)
124+
.forEach(mvcRoute -> definitions.addBinding().toInstance(mvcRoute));
119125
}
120126
});
121127

jooby-core/src/main/java/jooby/Request.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414

1515
import com.google.common.collect.ListMultimap;
1616
import com.google.inject.Injector;
17+
import com.google.inject.Key;
1718

1819
public abstract class Request {
1920

@@ -117,6 +118,10 @@ public <T> T get(final Class<T> type) {
117118
return injector.getInstance(type);
118119
}
119120

121+
public <T> T get(final Key<T> key) {
122+
return injector.getInstance(key);
123+
}
124+
120125
public void destroy() {
121126
this.selector = null;
122127
this.contentType = null;
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package jooby;
2+
3+
import java.util.Set;
4+
5+
import com.google.inject.Binder;
6+
import com.google.inject.Key;
7+
import com.google.inject.Module;
8+
import com.google.inject.TypeLiteral;
9+
10+
public interface RequestModule extends Module {
11+
12+
Key<Set<RequestModule>> KEY = Key.get(new TypeLiteral<Set<RequestModule>>() {});
13+
14+
@Override
15+
void configure(Binder binder);
16+
17+
}

jooby-core/src/main/java/jooby/Response.java

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import java.util.LinkedHashMap;
99
import java.util.List;
1010
import java.util.Map;
11+
import java.util.Set;
1112
import java.util.TreeMap;
1213

1314
import jooby.internal.BodyWriterImpl;
@@ -38,8 +39,12 @@ default void send() throws Exception {
3839
void send(Fn otherwise) throws Exception;
3940
}
4041

42+
private Request request;
43+
4144
private BodyConverterSelector selector;
4245

46+
private Set<RouteInterceptor> interceptors;
47+
4348
private Charset charset;
4449

4550
private List<MediaType> produces;
@@ -51,11 +56,15 @@ default void send() throws Exception {
5156
private Multimap<String, String> headers = Multimaps.newListMultimap(new TreeMap<>(
5257
String.CASE_INSENSITIVE_ORDER), ArrayList::new);
5358

54-
public Response(final BodyConverterSelector selector,
59+
public Response(final Request request,
60+
final BodyConverterSelector selector,
61+
final Set<RouteInterceptor> interceptors,
5562
final Charset charset,
5663
final List<MediaType> produces,
5764
final ThrowingSupplier<OutputStream> stream) {
65+
this.request = requireNonNull(request, "A request is required.");
5866
this.selector = requireNonNull(selector, "A message converter selector is required.");
67+
this.interceptors = requireNonNull(interceptors, "Interceptors are required.");
5968
this.charset = requireNonNull(charset, "A charset is required.");
6069
this.produces = requireNonNull(produces, "Produces are required.");
6170
this.stream = requireNonNull(stream, "A stream is required.");
@@ -83,6 +92,11 @@ public void send(final Object message, final BodyConverter converter)
8392
}
8493
requireNonNull(converter, "A converter is required.");
8594

95+
// fire before send
96+
for(RouteInterceptor interceptor: interceptors) {
97+
interceptor.beforeSend(request, this);
98+
}
99+
86100
// dump headers
87101
headers.entries().stream()
88102
.filter(it -> !it.getKey().startsWith("@"))

0 commit comments

Comments
 (0)