Skip to content

Commit ded9a21

Browse files
committed
remove: MvcFactory
- update and code cleanup for generated controller - add new constructor which fit better for beanScope - ref #3705
1 parent 0793992 commit ded9a21

File tree

11 files changed

+193
-24
lines changed

11 files changed

+193
-24
lines changed

modules/jooby-apt/src/main/java/io/jooby/internal/apt/MvcRoute.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -158,7 +158,7 @@ public List<String> generateMapping(boolean kt) {
158158
".setMvcMethod(",
159159
kt ? "" : "new ",
160160
"io.jooby.Route.MvcMethod(",
161-
router.getTargetType().getQualifiedName().toString(),
161+
router.getTargetType().getSimpleName().toString(),
162162
clazz(kt),
163163
", ",
164164
string(getMethodName()),

modules/jooby-apt/src/main/java/io/jooby/internal/apt/MvcRouter.java

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -205,6 +205,7 @@ private StringBuilder constructors(String generatedName, boolean kt) {
205205
constructor(
206206
generatedName,
207207
kt,
208+
kt ? ":" : null,
208209
buffer,
209210
List.of(),
210211
(output, params) -> {
@@ -221,6 +222,7 @@ private StringBuilder constructors(String generatedName, boolean kt) {
221222
constructor(
222223
generatedName,
223224
kt,
225+
kt ? ":" : null,
224226
buffer,
225227
List.of(),
226228
(output, params) -> {
@@ -243,6 +245,7 @@ private StringBuilder constructors(String generatedName, boolean kt) {
243245
constructor(
244246
generatedName,
245247
kt,
248+
kt ? ":" : null,
246249
buffer,
247250
constructor.getParameters().stream()
248251
.map(it -> Map.<Object, String>entry(it.asType(), it.getSimpleName().toString()))
@@ -262,30 +265,27 @@ private StringBuilder constructors(String generatedName, boolean kt) {
262265
constructor(
263266
generatedName,
264267
true,
268+
"{",
265269
buffer,
266270
List.of(Map.entry("kotlin.reflect.KClass<" + targetType + ">", "type")),
267271
(output, params) -> {
268-
// this(java.util.function.Function<io.jooby.Context, ${className}> { ctx:
269-
// io.jooby.Context -> ctx.require<${className}>(type.java) })
270272
output
271-
.append("this(java.util.function.Function<io.jooby.Context, ")
272-
.append(targetType)
273-
.append("> { ctx: io.jooby.Context -> ")
274-
.append("ctx.require<")
273+
.append("setup { ctx -> ctx.require<")
275274
.append(targetType)
276275
.append(">(type.java)")
277-
.append(" })")
276+
.append(" }")
278277
.append(System.lineSeparator());
279278
});
280279
} else {
281280
constructor(
282281
generatedName,
283282
false,
283+
null,
284284
buffer,
285285
List.of(Map.entry("Class<" + targetType + ">", "type")),
286286
(output, params) -> {
287287
output
288-
.append("this(")
288+
.append("setup(")
289289
.append("ctx -> ctx.require(type)")
290290
.append(")")
291291
.append(";")
@@ -308,6 +308,7 @@ private static Predicate<Element> hasInjectAnnotation() {
308308
private void constructor(
309309
String generatedName,
310310
boolean kt,
311+
String ktBody,
311312
StringBuilder buffer,
312313
List<Map.Entry<Object, String>> parameters,
313314
BiConsumer<StringBuilder, List<Map.Entry<Object, String>>> body) {
@@ -334,10 +335,10 @@ private void constructor(
334335
buffer.append(" {").append(System.lineSeparator());
335336
buffer.append(indent(6));
336337
} else {
337-
buffer.append(" : ");
338+
buffer.append(" ").append(ktBody).append(" ");
338339
}
339340
body.accept(buffer, parameters);
340-
if (!kt) {
341+
if (!kt || "{".equals(ktBody)) {
341342
buffer.append(indent(4)).append("}");
342343
}
343344
buffer.append(System.lineSeparator()).append(System.lineSeparator());

modules/jooby-apt/src/main/resources/io/jooby/internal/apt/Source.java

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,17 +2,21 @@
22
${imports}
33
@io.jooby.annotation.Generated(${className}.class)
44
public class ${generatedClassName} implements io.jooby.MvcExtension {
5-
protected final java.util.function.Function<io.jooby.Context, ${className}> factory;
5+
protected java.util.function.Function<io.jooby.Context, ${className}> factory;
66
${constructors}
77
public ${generatedClassName}(${className} instance) {
8-
this(ctx -> instance);
8+
setup(ctx -> instance);
99
}
1010

11-
public ${generatedClassName}(java.util.function.Supplier<${className}> provider) {
12-
this(ctx -> provider.get());
11+
public ${generatedClassName}(io.jooby.SneakyThrows.Supplier<${className}> provider) {
12+
setup(ctx -> provider.get());
1313
}
1414

15-
public ${generatedClassName}(java.util.function.Function<io.jooby.Context, ${className}> factory) {
15+
public ${generatedClassName}(io.jooby.SneakyThrows.Function<Class<${className}>, ${className}> provider) {
16+
setup(ctx -> provider.apply(${className}.class));
17+
}
18+
19+
private void setup(java.util.function.Function<io.jooby.Context, ${className}> factory) {
1620
this.factory = factory;
1721
}
1822

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,20 @@
11
package ${packageName}
22
${imports}
33
@io.jooby.annotation.Generated(${className}::class)
4-
open class ${generatedClassName}(protected val factory: java.util.function.Function<io.jooby.Context, ${className}>) : io.jooby.MvcExtension {
4+
open class ${generatedClassName} : io.jooby.MvcExtension {
5+
private lateinit var factory: java.util.function.Function<io.jooby.Context, ${className}>
6+
57
${constructors}
6-
constructor(instance: ${className}) : this(java.util.function.Function<io.jooby.Context, ${className}> { instance })
8+
constructor(instance: ${className}) { setup { instance } }
9+
10+
constructor(provider: io.jooby.SneakyThrows.Supplier<${className}>) { setup { provider.get() } }
11+
12+
constructor(provider: (Class<${className}>) -> ${className}) { setup { provider(${className}::class.java) } }
713

8-
constructor(provider: java.util.function.Supplier<${className}?>) : this(java.util.function.Function<io.jooby.Context, ${className}> { provider.get()!! })
14+
constructor(provider: io.jooby.SneakyThrows.Function<Class<${className}>, ${className}>) { setup { provider.apply(${className}::class.java) } }
915

16+
private fun setup(factory: java.util.function.Function<io.jooby.Context, ${className}>) {
17+
this.factory = factory
18+
}
1019
${methods}
1120
}

modules/jooby-apt/src/test/java/tests/i3460/Issue3460.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ public void shouldNotUseJakartaProvider() throws Exception {
1818
new ProcessorRunner(new C3460())
1919
.withRouter(
2020
(app, source) -> {
21-
assertTrue(source.toString().contains("C3460_(java.util.function.Supplier<"));
21+
assertTrue(source.toString().contains("C3460_(io.jooby.SneakyThrows.Supplier<"));
2222
});
2323
}
2424
}

modules/jooby-apt/src/test/java/tests/i3567/Issue3567.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ public void shouldSupportGoogleInjectAnnotation() throws Exception {
2424
source -> {
2525
assertTrue(source.contains("this(C3567.class);"));
2626
assertTrue(source.contains("public C3567_(Class<C3567> type) {"));
27-
assertTrue(source.contains("this(ctx -> ctx.require(type));"));
27+
assertTrue(source.contains("setup(ctx -> ctx.require(type));"));
2828
});
2929
}
3030
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
/*
2+
* Jooby https://jooby.io
3+
* Apache License Version 2.0 https://jooby.io/LICENSE.txt
4+
* Copyright 2014 Edgar Espina
5+
*/
6+
package tests.i3705;
7+
8+
public class C3705 {}
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
/*
2+
* Jooby https://jooby.io
3+
* Apache License Version 2.0 https://jooby.io/LICENSE.txt
4+
* Copyright 2014 Edgar Espina
5+
*/
6+
package tests.i3705;
7+
8+
@io.jooby.annotation.Generated(C3705.class)
9+
public class C3705_ implements io.jooby.MvcExtension {
10+
protected java.util.function.Function<io.jooby.Context, C3705> factory;
11+
12+
public C3705_() {
13+
this(new C3705());
14+
}
15+
16+
public C3705_(C3705 instance) {
17+
setup(ctx -> instance);
18+
}
19+
20+
public C3705_(Class<C3705> type) {
21+
setup(ctx -> ctx.require(type));
22+
}
23+
24+
public C3705_(java.util.function.Supplier<C3705> provider) {
25+
setup(ctx -> provider.get());
26+
}
27+
28+
public C3705_(java.util.function.Function<Class<C3705>, C3705> factory) {
29+
setup(ctx -> factory.apply(C3705.class));
30+
}
31+
32+
private void setup(java.util.function.Function<io.jooby.Context, C3705> factory) {
33+
this.factory = factory;
34+
}
35+
36+
public void install(io.jooby.Jooby app) throws Exception {}
37+
}

modules/jooby-openapi/src/main/java/io/jooby/internal/openapi/AnnotationParser.java

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -187,10 +187,13 @@ public static List<OperationExt> parse(
187187
return parse(ctx, prefix, type);
188188
} else if (signature.matches(MVC_EXTENSION)) {
189189
AbstractInsnNode previous = node.getPrevious();
190-
if (previous instanceof MethodInsnNode) {
191-
MethodInsnNode methodInsnNode = (MethodInsnNode) previous;
190+
if (previous instanceof TypeInsnNode) {
191+
// kt version of mvc(Controller_())
192+
previous = previous.getPrevious();
193+
}
194+
if (previous instanceof MethodInsnNode methodInsnNode) {
192195
if (methodInsnNode.getOpcode() == Opcodes.INVOKESPECIAL) {
193-
// mvc(new Controller(...));
196+
// mvc(new Controller_(...));
194197
var type = Type.getObjectType(methodInsnNode.owner);
195198
var classNode = ctx.classNode(type);
196199
var controllerType =
@@ -204,6 +207,7 @@ public static List<OperationExt> parse(
204207
.orElse(type);
205208
return parse(ctx, prefix, controllerType);
206209
} else if (methodInsnNode.getOpcode() == Opcodes.INVOKEINTERFACE) {
210+
// TODO: almost sure this is dead code
207211
AbstractInsnNode methodPrev = methodInsnNode.getPrevious();
208212
if (methodPrev instanceof VarInsnNode) {
209213
// mvc(daggerApp.myController());
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
/*
2+
* Jooby https://jooby.io
3+
* Apache License Version 2.0 https://jooby.io/LICENSE.txt
4+
* Copyright 2014 Edgar Espina
5+
*/
6+
package kt.i3705
7+
8+
import io.jooby.Jooby
9+
import io.jooby.MvcExtension
10+
import io.jooby.SneakyThrows
11+
import io.jooby.annotation.GET
12+
import io.jooby.annotation.Path
13+
import io.jooby.kt.Kooby
14+
15+
@Path("/")
16+
class C3705 {
17+
@GET("/search")
18+
fun search(): String {
19+
return "Hello"
20+
}
21+
}
22+
23+
class BeanScope {
24+
fun <T> get(type: Class<T>): T {
25+
return type.newInstance()
26+
}
27+
}
28+
29+
@io.jooby.annotation.Generated(C3705::class)
30+
class C3705_ : MvcExtension {
31+
32+
constructor() {}
33+
34+
constructor(provider: SneakyThrows.Function<Class<C3705>, C3705>) {}
35+
36+
override fun install(application: Jooby) {
37+
TODO("Not yet implemented")
38+
}
39+
}
40+
41+
class App3705 : Kooby({ mvc(C3705_()) })
42+
43+
class App3705b :
44+
Kooby({
45+
val beanScope = BeanScope()
46+
mvc(C3705_(beanScope::get))
47+
})

0 commit comments

Comments
 (0)