Skip to content

Commit a52a4f4

Browse files
committed
exposes mvc route props via use(Class) fix #350
1 parent ebf7c9f commit a52a4f4

File tree

3 files changed

+131
-17
lines changed

3 files changed

+131
-17
lines changed
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
package org.jooby.issues;
2+
3+
import org.jooby.Request;
4+
import org.jooby.Route;
5+
import org.jooby.mvc.GET;
6+
import org.jooby.mvc.Path;
7+
import org.jooby.test.ServerFeature;
8+
import org.junit.Test;
9+
10+
public class Issue350 extends ServerFeature {
11+
@Path("/mvc")
12+
public static class Resource {
13+
14+
@GET
15+
@Path("/a")
16+
public Object a(final Request req) {
17+
Route r = req.route();
18+
return r.name() + ";" + r.attributes().toString() + ";" + r.produces() + ";" + r.consumes()
19+
+ ";";
20+
}
21+
22+
}
23+
24+
{
25+
use(Resource.class)
26+
.attr("foo", "bar")
27+
.name("x")
28+
.produces("json")
29+
.consumes("json")
30+
.excludes("/something")
31+
.map(v -> "->" + v);
32+
}
33+
34+
@Test
35+
public void mvcSetup() throws Exception {
36+
request().get("/mvc/a")
37+
.expect("->/x;{foo=bar};[application/json];[application/json];");
38+
}
39+
40+
}

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

Lines changed: 90 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,7 @@
8686
import javax.net.ssl.SSLContext;
8787

8888
import org.jooby.Route.Definition;
89+
import org.jooby.Route.Mapper;
8990
import org.jooby.Session.Store;
9091
import org.jooby.handlers.AssetHandler;
9192
import org.jooby.internal.AppPrinter;
@@ -125,6 +126,7 @@
125126

126127
import com.google.common.base.Strings;
127128
import com.google.common.collect.ImmutableList;
129+
import com.google.common.collect.ImmutableMap;
128130
import com.google.common.collect.ImmutableSet;
129131
import com.google.inject.Binder;
130132
import com.google.inject.Guice;
@@ -457,15 +459,83 @@ default Config config() {
457459

458460
}
459461

460-
private static class RouteClass {
462+
private static class MvcClass implements Route.Props<MvcClass> {
461463
Class<?> routeClass;
462464

463465
String path;
464466

465-
public RouteClass(final Class<?> routeClass, final String path) {
467+
ImmutableMap.Builder<String, Object> attrs = ImmutableMap.builder();
468+
469+
private List<MediaType> consumes;
470+
471+
private String name;
472+
473+
private List<MediaType> produces;
474+
475+
private List<String> excludes;
476+
477+
private Mapper<?> mapper;
478+
479+
public MvcClass(final Class<?> routeClass, final String path) {
466480
this.routeClass = routeClass;
467481
this.path = path;
468482
}
483+
484+
@Override
485+
public MvcClass attr(final String name, final Object value) {
486+
attrs.put(name, value);
487+
return this;
488+
}
489+
490+
@Override
491+
public MvcClass name(final String name) {
492+
this.name = name;
493+
return this;
494+
}
495+
496+
@Override
497+
public MvcClass consumes(final List<MediaType> consumes) {
498+
this.consumes = consumes;
499+
return this;
500+
}
501+
502+
@Override
503+
public MvcClass produces(final List<MediaType> produces) {
504+
this.produces = produces;
505+
return this;
506+
}
507+
508+
@Override
509+
public MvcClass excludes(final List<String> excludes) {
510+
this.excludes = excludes;
511+
return this;
512+
}
513+
514+
@Override
515+
public MvcClass map(final Mapper<?> mapper) {
516+
this.mapper = mapper;
517+
return this;
518+
}
519+
520+
public Route.Definition apply(final Route.Definition route) {
521+
attrs.build().forEach(route::attr);
522+
if (name != null) {
523+
route.name(name);
524+
}
525+
if (consumes != null) {
526+
route.consumes(consumes);
527+
}
528+
if (produces != null) {
529+
route.produces(produces);
530+
}
531+
if (excludes != null) {
532+
route.excludes(excludes);
533+
}
534+
if (mapper != null) {
535+
route.map(mapper);
536+
}
537+
return route;
538+
}
469539
}
470540

471541
private static class EnvDep {
@@ -585,8 +655,8 @@ private Jooby use(final Optional<String> path, final Jooby app) {
585655
this.bag.add(rewrite.apply((Definition) it));
586656
} else if (it instanceof Route.Group) {
587657
((Route.Group) it).routes().forEach(r -> this.bag.add(rewrite.apply(r)));
588-
} else if (it instanceof RouteClass) {
589-
Object routes = path.<Object> map(p -> new RouteClass(((RouteClass) it).routeClass, p))
658+
} else if (it instanceof MvcClass) {
659+
Object routes = path.<Object> map(p -> new MvcClass(((MvcClass) it).routeClass, p))
590660
.orElse(it);
591661
this.bag.add(routes);
592662
} else if (it instanceof EnvDep) {
@@ -3031,10 +3101,11 @@ public Route.Definition assets(final String path, final AssetHandler handler) {
30313101
* @return This jooby instance.
30323102
*/
30333103
@Override
3034-
public Jooby use(final Class<?> routeClass) {
3104+
public Route.Collection use(final Class<?> routeClass) {
30353105
requireNonNull(routeClass, "Route class is required.");
3036-
bag.add(new RouteClass(routeClass, ""));
3037-
return this;
3106+
MvcClass mvc = new MvcClass(routeClass, "");
3107+
bag.add(mvc);
3108+
return new Route.Collection(mvc);
30383109
}
30393110

30403111
/**
@@ -3125,18 +3196,19 @@ public Route.Definition sse(final String path, final Sse.Handler1 handler) {
31253196
return appendDefinition(new Route.Definition("GET", path, handler)).consumes(MediaType.sse);
31263197
}
31273198

3199+
@SuppressWarnings("rawtypes")
31283200
@Override
31293201
public Route.Collection with(final Runnable callback) {
31303202
// hacky way of doing what we want... but we do simplify developer life
31313203
int size = this.bag.size();
31323204
callback.run();
3133-
// collect latest routes and apply collection attr
3134-
List<Route.Definition> local = this.bag.stream()
3205+
// collect latest routes and apply route props
3206+
List<Route.Props> local = this.bag.stream()
31353207
.skip(size)
3136-
.filter(Predicates.instanceOf(Route.Definition.class))
3137-
.map(r -> (Route.Definition) r)
3208+
.filter(Predicates.instanceOf(Route.Props.class))
3209+
.map(r -> (Route.Props) r)
31383210
.collect(Collectors.toList());
3139-
return new Route.Collection(local.toArray(new Route.Definition[local.size()]));
3211+
return new Route.Collection(local.toArray(new Route.Props[local.size()]));
31403212
}
31413213

31423214
/**
@@ -3385,10 +3457,12 @@ private static List<Object> normalize(final List<Object> services, final Env env
33853457
} else if (candidate instanceof Route.Group) {
33863458
((Route.Group) candidate).routes()
33873459
.forEach(r -> result.add(r));
3388-
} else if (candidate instanceof RouteClass) {
3389-
Class<?> routeClass = ((RouteClass) candidate).routeClass;
3390-
String path = ((RouteClass) candidate).path;
3391-
MvcRoutes.routes(env, classInfo, path, routeClass).forEach(route -> {
3460+
} else if (candidate instanceof MvcClass) {
3461+
MvcClass mvcRoute = ((MvcClass) candidate);
3462+
Class<?> mvcClass = mvcRoute.routeClass;
3463+
String path = ((MvcClass) candidate).path;
3464+
MvcRoutes.routes(env, classInfo, path, mvcClass).forEach(route -> {
3465+
mvcRoute.apply(route);
33923466
if (prefix != null) {
33933467
route.name(prefix + "/" + route.name());
33943468
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1679,7 +1679,7 @@ Route.Definition connect(String path,
16791679
* @param routeClass A route(s) class.
16801680
* @return This jooby instance.
16811681
*/
1682-
Jooby use(Class<?> routeClass);
1682+
Route.Collection use(Class<?> routeClass);
16831683

16841684
/**
16851685
* <h2>before</h2>

0 commit comments

Comments
 (0)