From 097f3f4c5aac110f2d7fa6e4ff07b504beeaf663 Mon Sep 17 00:00:00 2001 From: Josiah Noel <32279667+SentryMan@users.noreply.github.com> Date: Tue, 25 Feb 2025 18:39:24 -0500 Subject: [PATCH 1/3] [sigma] add jstachio support almost forgot about this one --- .../sigma/ControllerMethodWriter.java | 23 +++++- tests/test-sigma/pom.xml | 15 ++++ .../myapp/web/jstache/JstacheController.java | 77 +++++++++++++++++++ 3 files changed, 113 insertions(+), 2 deletions(-) create mode 100644 tests/test-sigma/src/main/java/org/example/myapp/web/jstache/JstacheController.java diff --git a/http-generator-sigma/src/main/java/io/avaje/http/generator/sigma/ControllerMethodWriter.java b/http-generator-sigma/src/main/java/io/avaje/http/generator/sigma/ControllerMethodWriter.java index cdd03ed26..459b395c8 100644 --- a/http-generator-sigma/src/main/java/io/avaje/http/generator/sigma/ControllerMethodWriter.java +++ b/http-generator-sigma/src/main/java/io/avaje/http/generator/sigma/ControllerMethodWriter.java @@ -1,10 +1,19 @@ package io.avaje.http.generator.sigma; -import static io.avaje.http.generator.core.ProcessingContext.*; +import static io.avaje.http.generator.core.ProcessingContext.isAssignable2Interface; +import static io.avaje.http.generator.core.ProcessingContext.logError; +import static io.avaje.http.generator.core.ProcessingContext.platform; import java.util.List; -import io.avaje.http.generator.core.*; +import io.avaje.http.generator.core.Append; +import io.avaje.http.generator.core.CoreWebMethod; +import io.avaje.http.generator.core.JsonBUtil; +import io.avaje.http.generator.core.MethodParam; +import io.avaje.http.generator.core.MethodReader; +import io.avaje.http.generator.core.PathSegments; +import io.avaje.http.generator.core.ProcessingContext; +import io.avaje.http.generator.core.WebMethod; import io.avaje.http.generator.core.openapi.MediaType; /** Write code to register Web route for a given controller method. */ @@ -15,6 +24,7 @@ class ControllerMethodWriter { private final WebMethod webMethod; private final boolean instrumentContext; private final boolean isFilter; + private boolean useJstachio; ControllerMethodWriter(MethodReader method, Append writer) { this.method = method; @@ -22,6 +32,7 @@ class ControllerMethodWriter { this.webMethod = method.webMethod(); this.instrumentContext = method.instrumentContext(); this.isFilter = webMethod == CoreWebMethod.FILTER; + this.useJstachio = ProcessingContext.isJstacheTemplate(method.returnType()); if (isFilter) { validateFilter(); } @@ -122,6 +133,11 @@ private List writeParams(final PathSegments segments) { private void writeContextReturn() { var produces = method.produces(); + + if (useJstachio && produces == null) { + produces = MediaType.TEXT_HTML.getValue(); + } + boolean applicationJson = produces == null || MediaType.APPLICATION_JSON.getValue().equalsIgnoreCase(produces); if (applicationJson || JsonBUtil.isJsonMimeType(produces)) { @@ -130,6 +146,9 @@ private void writeContextReturn() { } else { writer.append(" ctx.contentType(\"%s\").result(result);", produces); } + } else if (useJstachio) { + var renderer = ProcessingContext.jstacheRenderer(method.returnType()); + writer.append(" ctx.contentType(\"%s\").result(%s(result));", produces, renderer); } else if (MediaType.TEXT_HTML.getValue().equalsIgnoreCase(produces)) { writer.append(" ctx.html(result);"); } else if (MediaType.TEXT_PLAIN.getValue().equalsIgnoreCase(produces)) { diff --git a/tests/test-sigma/pom.xml b/tests/test-sigma/pom.xml index 9c8caa1b9..bde53376b 100644 --- a/tests/test-sigma/pom.xml +++ b/tests/test-sigma/pom.xml @@ -48,8 +48,23 @@ swagger-annotations ${swagger.version} + + + + io.jstach + jstachio + 1.3.6 + + + + + io.jstach + jstachio-apt + 1.3.6 + + io.avaje avaje-inject-generator diff --git a/tests/test-sigma/src/main/java/org/example/myapp/web/jstache/JstacheController.java b/tests/test-sigma/src/main/java/org/example/myapp/web/jstache/JstacheController.java new file mode 100644 index 000000000..f1e634e27 --- /dev/null +++ b/tests/test-sigma/src/main/java/org/example/myapp/web/jstache/JstacheController.java @@ -0,0 +1,77 @@ +package org.example.myapp.web.jstache; + +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; +import java.util.List; + +import io.avaje.http.api.Controller; +import io.avaje.http.api.Get; +import io.jstach.jstache.JStache; +import io.jstach.jstache.JStacheConfig; +import io.jstach.jstache.JStacheLambda; +import io.jstach.jstache.JStacheType; + +@Controller("/jstache") +public class JstacheController { + + @Get("/hello") + public HelloWorldZeroDependency hello() { + Person rick = new Person("Rick", LocalDate.now().minusYears(70)); + Person morty = new Person("Morty", LocalDate.now().minusYears(14)); + Person beth = new Person("Beth", LocalDate.now().minusYears(35)); + Person jerry = new Person("Jerry", LocalDate.now().minusYears(35)); + return new HelloWorldZeroDependency("Hello alien", List.of(rick, morty, beth, jerry)); + } + + @Get("/helloRuntime") + public HelloWorld helloRuntime() { + Person rick = new Person("Rick", LocalDate.now().minusYears(70)); + Person morty = new Person("Morty", LocalDate.now().minusYears(14)); + Person beth = new Person("Beth", LocalDate.now().minusYears(35)); + Person jerry = new Person("Jerry", LocalDate.now().minusYears(35)); + return new HelloWorld("Hello alien", List.of(rick, morty, beth, jerry)); + } + + /* + * Annotate the root model with an inline mustache template + */ + @JStacheConfig(type = JStacheType.STACHE) + @JStache( + template = + """ + {{#people}} + {{message}} {{name}}! You are {{#ageInfo}}{{age}}{{/ageInfo}} years old! + {{#-last}} + That is all for now! + {{/-last}} + {{/people}} + """) + public record HelloWorldZeroDependency(String message, List people) implements AgeLambdaSupport {} + + public record Person(String name, LocalDate birthday) {} + + public record AgeInfo(long age, String date) {} + + public interface AgeLambdaSupport { + @JStacheLambda + default AgeInfo ageInfo(Person person) { + long age = ChronoUnit.YEARS.between(person.birthday(), LocalDate.now()); + String date = person.birthday().format(DateTimeFormatter.ISO_DATE); + return new AgeInfo(age, date); + } + } + + @JStache( + template = + """ + {{#people}} + {{message}} {{name}}! You are {{#ageInfo}}{{age}}{{/ageInfo}} years old! + {{#-last}} + That is all for now! + {{/-last}} + {{/people}} + """) + public record HelloWorld(String message, List people) implements AgeLambdaSupport {} + +} From 45f74969e2744613231b6de9dc5ebbac175a6474 Mon Sep 17 00:00:00 2001 From: Josiah Noel <32279667+SentryMan@users.noreply.github.com> Date: Tue, 25 Feb 2025 18:39:24 -0500 Subject: [PATCH 2/3] [sigma] add jstachio support almost forgot about this one --- .../sigma/ControllerMethodWriter.java | 23 +++++- tests/test-sigma/pom.xml | 15 ++++ .../myapp/web/jstache/JstacheController.java | 77 +++++++++++++++++++ 3 files changed, 113 insertions(+), 2 deletions(-) create mode 100644 tests/test-sigma/src/main/java/org/example/myapp/web/jstache/JstacheController.java diff --git a/http-generator-sigma/src/main/java/io/avaje/http/generator/sigma/ControllerMethodWriter.java b/http-generator-sigma/src/main/java/io/avaje/http/generator/sigma/ControllerMethodWriter.java index cdd03ed26..459b395c8 100644 --- a/http-generator-sigma/src/main/java/io/avaje/http/generator/sigma/ControllerMethodWriter.java +++ b/http-generator-sigma/src/main/java/io/avaje/http/generator/sigma/ControllerMethodWriter.java @@ -1,10 +1,19 @@ package io.avaje.http.generator.sigma; -import static io.avaje.http.generator.core.ProcessingContext.*; +import static io.avaje.http.generator.core.ProcessingContext.isAssignable2Interface; +import static io.avaje.http.generator.core.ProcessingContext.logError; +import static io.avaje.http.generator.core.ProcessingContext.platform; import java.util.List; -import io.avaje.http.generator.core.*; +import io.avaje.http.generator.core.Append; +import io.avaje.http.generator.core.CoreWebMethod; +import io.avaje.http.generator.core.JsonBUtil; +import io.avaje.http.generator.core.MethodParam; +import io.avaje.http.generator.core.MethodReader; +import io.avaje.http.generator.core.PathSegments; +import io.avaje.http.generator.core.ProcessingContext; +import io.avaje.http.generator.core.WebMethod; import io.avaje.http.generator.core.openapi.MediaType; /** Write code to register Web route for a given controller method. */ @@ -15,6 +24,7 @@ class ControllerMethodWriter { private final WebMethod webMethod; private final boolean instrumentContext; private final boolean isFilter; + private boolean useJstachio; ControllerMethodWriter(MethodReader method, Append writer) { this.method = method; @@ -22,6 +32,7 @@ class ControllerMethodWriter { this.webMethod = method.webMethod(); this.instrumentContext = method.instrumentContext(); this.isFilter = webMethod == CoreWebMethod.FILTER; + this.useJstachio = ProcessingContext.isJstacheTemplate(method.returnType()); if (isFilter) { validateFilter(); } @@ -122,6 +133,11 @@ private List writeParams(final PathSegments segments) { private void writeContextReturn() { var produces = method.produces(); + + if (useJstachio && produces == null) { + produces = MediaType.TEXT_HTML.getValue(); + } + boolean applicationJson = produces == null || MediaType.APPLICATION_JSON.getValue().equalsIgnoreCase(produces); if (applicationJson || JsonBUtil.isJsonMimeType(produces)) { @@ -130,6 +146,9 @@ private void writeContextReturn() { } else { writer.append(" ctx.contentType(\"%s\").result(result);", produces); } + } else if (useJstachio) { + var renderer = ProcessingContext.jstacheRenderer(method.returnType()); + writer.append(" ctx.contentType(\"%s\").result(%s(result));", produces, renderer); } else if (MediaType.TEXT_HTML.getValue().equalsIgnoreCase(produces)) { writer.append(" ctx.html(result);"); } else if (MediaType.TEXT_PLAIN.getValue().equalsIgnoreCase(produces)) { diff --git a/tests/test-sigma/pom.xml b/tests/test-sigma/pom.xml index 9c8caa1b9..bde53376b 100644 --- a/tests/test-sigma/pom.xml +++ b/tests/test-sigma/pom.xml @@ -48,8 +48,23 @@ swagger-annotations ${swagger.version} + + + + io.jstach + jstachio + 1.3.6 + + + + + io.jstach + jstachio-apt + 1.3.6 + + io.avaje avaje-inject-generator diff --git a/tests/test-sigma/src/main/java/org/example/myapp/web/jstache/JstacheController.java b/tests/test-sigma/src/main/java/org/example/myapp/web/jstache/JstacheController.java new file mode 100644 index 000000000..f1e634e27 --- /dev/null +++ b/tests/test-sigma/src/main/java/org/example/myapp/web/jstache/JstacheController.java @@ -0,0 +1,77 @@ +package org.example.myapp.web.jstache; + +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; +import java.util.List; + +import io.avaje.http.api.Controller; +import io.avaje.http.api.Get; +import io.jstach.jstache.JStache; +import io.jstach.jstache.JStacheConfig; +import io.jstach.jstache.JStacheLambda; +import io.jstach.jstache.JStacheType; + +@Controller("/jstache") +public class JstacheController { + + @Get("/hello") + public HelloWorldZeroDependency hello() { + Person rick = new Person("Rick", LocalDate.now().minusYears(70)); + Person morty = new Person("Morty", LocalDate.now().minusYears(14)); + Person beth = new Person("Beth", LocalDate.now().minusYears(35)); + Person jerry = new Person("Jerry", LocalDate.now().minusYears(35)); + return new HelloWorldZeroDependency("Hello alien", List.of(rick, morty, beth, jerry)); + } + + @Get("/helloRuntime") + public HelloWorld helloRuntime() { + Person rick = new Person("Rick", LocalDate.now().minusYears(70)); + Person morty = new Person("Morty", LocalDate.now().minusYears(14)); + Person beth = new Person("Beth", LocalDate.now().minusYears(35)); + Person jerry = new Person("Jerry", LocalDate.now().minusYears(35)); + return new HelloWorld("Hello alien", List.of(rick, morty, beth, jerry)); + } + + /* + * Annotate the root model with an inline mustache template + */ + @JStacheConfig(type = JStacheType.STACHE) + @JStache( + template = + """ + {{#people}} + {{message}} {{name}}! You are {{#ageInfo}}{{age}}{{/ageInfo}} years old! + {{#-last}} + That is all for now! + {{/-last}} + {{/people}} + """) + public record HelloWorldZeroDependency(String message, List people) implements AgeLambdaSupport {} + + public record Person(String name, LocalDate birthday) {} + + public record AgeInfo(long age, String date) {} + + public interface AgeLambdaSupport { + @JStacheLambda + default AgeInfo ageInfo(Person person) { + long age = ChronoUnit.YEARS.between(person.birthday(), LocalDate.now()); + String date = person.birthday().format(DateTimeFormatter.ISO_DATE); + return new AgeInfo(age, date); + } + } + + @JStache( + template = + """ + {{#people}} + {{message}} {{name}}! You are {{#ageInfo}}{{age}}{{/ageInfo}} years old! + {{#-last}} + That is all for now! + {{/-last}} + {{/people}} + """) + public record HelloWorld(String message, List people) implements AgeLambdaSupport {} + +} From 0806718912c66bd765fcae3f81a9505bce9be96b Mon Sep 17 00:00:00 2001 From: Josiah Noel <32279667+SentryMan@users.noreply.github.com> Date: Tue, 25 Feb 2025 19:15:08 -0500 Subject: [PATCH 3/3] Update SigmaProcessorTest.java --- .../java/io/avaje/http/generator/SigmaProcessorTest.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/tests/test-sigma/src/test/java/io/avaje/http/generator/SigmaProcessorTest.java b/tests/test-sigma/src/test/java/io/avaje/http/generator/SigmaProcessorTest.java index dda2e39b7..b0d37a7ad 100644 --- a/tests/test-sigma/src/test/java/io/avaje/http/generator/SigmaProcessorTest.java +++ b/tests/test-sigma/src/test/java/io/avaje/http/generator/SigmaProcessorTest.java @@ -50,7 +50,9 @@ public void runAnnotationProcessor() throws Exception { new PrintWriter(System.out), null, null, - List.of("--release=11", "-AdisableDirectWrites=true"), + List.of( + "--release=" + Integer.getInteger("java.specification.version"), + "-AdisableDirectWrites=true"), null, files); task.setProcessors(List.of(new SigmaProcessor())); @@ -75,7 +77,7 @@ void runAnnotationProcessorJakarta() throws Exception { null, null, List.of( - "--release=11", + "--release=" + Integer.getInteger("java.specification.version"), "-AuseJavax=false", "-AuseSingleton=true", "-AdisableDirectWrites=true"),