Skip to content

Commit 1d0f0af

Browse files
authored
Micronaut: Use JTE template engine and GraalVM 22 (#9262)
* Micronaut: Use JTE template engine and GraalVM 22 * CR * User Graalvm 21 for Micronaut Data
1 parent 64398bc commit 1d0f0af

File tree

16 files changed

+104
-63
lines changed

16 files changed

+104
-63
lines changed

frameworks/Java/micronaut/buildSrc/src/main/groovy/io.micronaut.benchmark.module.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ dependencies {
2828
}
2929

3030
graalvmNative.binaries.all {
31-
buildArgs.add("--initialize-at-build-time=views")
31+
buildArgs.add("--initialize-at-build-time=gg.jte.generated.precompiled")
3232
}
3333

3434
test {

frameworks/Java/micronaut/common/build.gradle

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
plugins {
22
id 'java'
33
id "io.micronaut.library"
4-
id "nu.studer.rocker" version "3.0.4"
4+
id "gg.jte.gradle" version "3.1.12"
55
}
66

77
group 'io.micronaut.benchmark'
@@ -16,14 +16,10 @@ micronaut {
1616
testRuntime "junit5"
1717
}
1818

19-
rocker {
20-
configurations {
21-
main {
22-
templateDir = file('src/main/resources')
23-
outputDir = file('build/generated/rocker')
24-
optimize = true
25-
}
26-
}
19+
jte {
20+
sourceDirectory = file("src/main/jte").toPath()
21+
generate()
22+
binaryStaticContent = true
2723
}
2824

2925
dependencies {
@@ -38,12 +34,20 @@ dependencies {
3834
transitive = false
3935
}
4036

41-
implementation("com.fizzed:rocker-runtime")
37+
// Switch to BOM version after https://github.com/micronaut-projects/micronaut-views/issues/876
38+
implementation("gg.jte:jte-runtime:3.1.12")
4239

4340
runtimeOnly("ch.qos.logback:logback-classic")
4441
runtimeOnly("org.yaml:snakeyaml")
4542
}
4643

4744
test {
4845
useJUnitPlatform()
46+
}
47+
48+
// Gradle requires that generateJte is run before some tasks
49+
tasks.configureEach {
50+
if (name == "inspectRuntimeClasspath") {
51+
mustRunAfter("generateJte")
52+
}
4953
}

frameworks/Java/micronaut/common/src/main/java/benchmark/controller/AbstractBenchmarkController.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,28 @@
55

66
import java.util.ArrayList;
77
import java.util.Collections;
8+
import java.util.Comparator;
89
import java.util.List;
910
import java.util.concurrent.ThreadLocalRandom;
1011
import java.util.stream.IntStream;
1112

1213
public class AbstractBenchmarkController {
1314

1415
protected final Integer[] boxed = IntStream.range(1, 10001).boxed().toArray(Integer[]::new);
16+
private static final Comparator<Fortune> FORTUNES_COMPARATOR = new Comparator<>() {
17+
@Override
18+
public int compare(Fortune o1, Fortune o2) {
19+
return o1.message().compareTo(o2.message());
20+
}
21+
};
22+
23+
protected List<Fortune> prepareFortunes(List<Fortune> fortuneList) {
24+
List<Fortune> all = new ArrayList<>(fortuneList.size() + 1);
25+
all.add(new Fortune(0, "Additional fortune added at request time."));
26+
all.addAll(fortuneList);
27+
all.sort(FORTUNES_COMPARATOR);
28+
return all;
29+
}
1530

1631
protected List<Fortune> createFortunes() {
1732
List<Integer> fortuneMessages = IntStream.range(0, 10).boxed().toList();

frameworks/Java/micronaut/common/src/main/java/benchmark/controller/AsyncBenchmarkController.java

Lines changed: 2 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,9 @@
55
import benchmark.repository.AsyncFortuneRepository;
66
import benchmark.repository.AsyncWorldRepository;
77
import io.micronaut.context.annotation.Requires;
8-
import io.micronaut.http.HttpResponse;
98
import io.micronaut.http.annotation.Controller;
109
import io.micronaut.http.annotation.Get;
1110
import io.micronaut.http.annotation.QueryValue;
12-
import views.fortunes;
1311

1412
import java.util.ArrayList;
1513
import java.util.Comparator;
@@ -55,15 +53,8 @@ public CompletionStage<List<World>> queries(@QueryValue String queries) {
5553

5654
// https://github.com/TechEmpower/FrameworkBenchmarks/wiki/Project-Information-Framework-Tests-Overview#fortunes
5755
@Get(value = "/fortunes", produces = "text/html;charset=utf-8")
58-
public CompletionStage<HttpResponse<String>> fortune() {
59-
return fortuneRepository.findAll().thenApply(fortuneList -> {
60-
List<Fortune> all = new ArrayList<>(fortuneList.size() + 1);
61-
all.add(new Fortune(0, "Additional fortune added at request time."));
62-
all.addAll(fortuneList);
63-
all.sort(comparing(Fortune::message));
64-
String body = fortunes.template(all).render().toString();
65-
return HttpResponse.ok(body).contentType("text/html;charset=utf-8");
66-
});
56+
public CompletionStage<List<Fortune>> fortune() {
57+
return fortuneRepository.findAll().thenApply(this::prepareFortunes);
6758
}
6859

6960
// https://github.com/TechEmpower/FrameworkBenchmarks/wiki/Project-Information-Framework-Tests-Overview#database-updates

frameworks/Java/micronaut/common/src/main/java/benchmark/controller/BenchmarkController.java

Lines changed: 3 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -5,19 +5,14 @@
55
import benchmark.repository.FortuneRepository;
66
import benchmark.repository.WorldRepository;
77
import io.micronaut.context.annotation.Requires;
8-
import io.micronaut.http.HttpResponse;
98
import io.micronaut.http.annotation.Controller;
109
import io.micronaut.http.annotation.Get;
1110
import io.micronaut.http.annotation.QueryValue;
12-
import views.fortunes;
1311

1412
import java.util.ArrayList;
15-
import java.util.Collection;
1613
import java.util.Comparator;
1714
import java.util.List;
1815

19-
import static java.util.Comparator.comparing;
20-
2116
@Requires(beans = {WorldRepository.class, FortuneRepository.class})
2217
@Controller
2318
public class BenchmarkController extends AbstractBenchmarkController {
@@ -56,14 +51,8 @@ public List<World> queries(@QueryValue String queries) {
5651

5752
// https://github.com/TechEmpower/FrameworkBenchmarks/wiki/Project-Information-Framework-Tests-Overview#fortunes
5853
@Get(value = "/fortunes", produces = "text/html;charset=utf-8")
59-
public HttpResponse<String> fortune() {
60-
Collection<Fortune> all = fortuneRepository.findAll();
61-
List<Fortune> fortunesList = new ArrayList<>(all.size() + 1);
62-
fortunesList.add(new Fortune(0, "Additional fortune added at request time."));
63-
fortunesList.addAll(all);
64-
fortunesList.sort(comparing(Fortune::message));
65-
String body = fortunes.template(fortunesList).render().toString();
66-
return HttpResponse.ok(body).contentType("text/html;charset=utf-8");
54+
public List<Fortune> fortune() {
55+
return prepareFortunes(fortuneRepository.findAll());
6756
}
6857

6958
// https://github.com/TechEmpower/FrameworkBenchmarks/wiki/Project-Information-Framework-Tests-Overview#database-updates
@@ -77,5 +66,5 @@ public List<World> updates(@QueryValue String queries) {
7766
worldRepository.updateAll(worldList);
7867
return worldList;
7968
}
80-
69+
8170
}
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
package benchmark.controller;
2+
3+
import benchmark.model.Fortune;
4+
import gg.jte.TemplateOutput;
5+
import gg.jte.generated.precompiled.JtefortunesGenerated;
6+
import gg.jte.html.OwaspHtmlTemplateOutput;
7+
import io.micronaut.core.annotation.NonNull;
8+
import io.micronaut.core.type.Argument;
9+
import io.micronaut.core.type.MutableHeaders;
10+
import io.micronaut.http.MediaType;
11+
import io.micronaut.http.body.MessageBodyWriter;
12+
import io.micronaut.http.codec.CodecException;
13+
import io.micronaut.http.netty.NettyHttpHeaders;
14+
import jakarta.inject.Singleton;
15+
16+
import java.io.IOException;
17+
import java.io.OutputStream;
18+
import java.nio.charset.StandardCharsets;
19+
import java.util.List;
20+
21+
@Singleton
22+
public class FortunesBodyWriter implements MessageBodyWriter<List<Fortune>> {
23+
24+
@Override
25+
public void writeTo(@NonNull Argument<List<Fortune>> type,
26+
@NonNull MediaType mediaType,
27+
List<Fortune> values,
28+
@NonNull MutableHeaders outgoingHeaders,
29+
@NonNull OutputStream outputStream) throws CodecException {
30+
outgoingHeaders.set(NettyHttpHeaders.CONTENT_TYPE, "text/html;charset=utf-8");
31+
TemplateOutput output = new TemplateOutput() {
32+
33+
@Override
34+
public void writeContent(String value) {
35+
writeBinaryContent(value.getBytes(StandardCharsets.UTF_8));
36+
}
37+
38+
@Override
39+
public void writeContent(String value, int beginIndex, int endIndex) {
40+
writeBinaryContent(value.substring(beginIndex, endIndex).getBytes(StandardCharsets.UTF_8));
41+
}
42+
43+
@Override
44+
public void writeBinaryContent(byte[] value) {
45+
try {
46+
outputStream.write(value);
47+
} catch (IOException e) {
48+
throw new RuntimeException(e);
49+
}
50+
}
51+
};
52+
JtefortunesGenerated.render(new OwaspHtmlTemplateOutput(output), null, values);
53+
}
54+
}

frameworks/Java/micronaut/common/src/main/java/benchmark/controller/ReactiveBenchmarkController.java

Lines changed: 2 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -6,21 +6,17 @@
66
import benchmark.repository.ReactiveWorldRepository;
77
import io.micronaut.context.annotation.Requires;
88
import io.micronaut.core.async.annotation.SingleResult;
9-
import io.micronaut.http.HttpResponse;
109
import io.micronaut.http.annotation.Controller;
1110
import io.micronaut.http.annotation.Get;
1211
import io.micronaut.http.annotation.QueryValue;
1312
import org.reactivestreams.Publisher;
1413
import reactor.core.publisher.Flux;
1514
import reactor.core.publisher.Mono;
16-
import views.fortunes;
1715

1816
import java.util.ArrayList;
1917
import java.util.Comparator;
2018
import java.util.List;
2119

22-
import static java.util.Comparator.comparing;
23-
2420
@Requires(beans = {ReactiveWorldRepository.class, ReactiveFortuneRepository.class})
2521
@Controller
2622
public class ReactiveBenchmarkController extends AbstractBenchmarkController {
@@ -61,15 +57,8 @@ public Publisher<List<World>> queries(@QueryValue String queries) {
6157
// https://github.com/TechEmpower/FrameworkBenchmarks/wiki/Project-Information-Framework-Tests-Overview#fortunes
6258
@Get(value = "/fortunes", produces = "text/html;charset=utf-8")
6359
@SingleResult
64-
public Mono<HttpResponse<String>> fortune() {
65-
return Mono.from(fortuneRepository.findAll()).map(fortuneList -> {
66-
List<Fortune> all = new ArrayList<>(fortuneList.size() + 1);
67-
all.add(new Fortune(0, "Additional fortune added at request time."));
68-
all.addAll(fortuneList);
69-
all.sort(comparing(Fortune::message));
70-
String body = fortunes.template(all).render().toString();
71-
return HttpResponse.ok(body).contentType("text/html;charset=utf-8");
72-
});
60+
public Mono<List<Fortune>> fortune() {
61+
return Mono.from(fortuneRepository.findAll()).map(this::prepareFortunes);
7362
}
7463

7564
// https://github.com/TechEmpower/FrameworkBenchmarks/wiki/Project-Information-Framework-Tests-Overview#database-updates

frameworks/Java/micronaut/common/src/main/java/benchmark/repository/FortuneRepository.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,12 @@
44
import org.reactivestreams.Publisher;
55

66
import java.util.Collection;
7+
import java.util.List;
78

89
public interface FortuneRepository {
910

1011
void initDb(Collection<Fortune> fortunes);
1112

12-
Collection<Fortune> findAll();
13+
List<Fortune> findAll();
1314

1415
}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
@param java.util.List<benchmark.model.Fortune> fortunes
2+
<!DOCTYPE html><html><head><title>Fortunes</title></head><body><table><tr><th>id</th><th>message</th></tr>@for(benchmark.model.Fortune fortune : fortunes)
3+
<tr><td>${fortune.id()}</td><td>${fortune.message()}</td></tr>@endfor
4+
</table></body></html>

frameworks/Java/micronaut/common/src/main/resources/views/fortunes.rocker.html

Lines changed: 0 additions & 8 deletions
This file was deleted.

0 commit comments

Comments
 (0)