From 49b01519bbfcd4219ce77ff9ef7497d4ab1458e0 Mon Sep 17 00:00:00 2001 From: Matthias Andreas Benkard Date: Mon, 5 Jul 2021 06:45:54 +0200 Subject: KB66 Use type-safe templates everywhere. Change-Id: I879e76e5bbaf91349f6df4637d9dc15291a3ada1 --- .../mulkcms2/benki/bookmarks/BookmarkResource.java | 15 +-- .../mulkcms2/benki/lazychat/LazychatMessage.java | 8 -- .../benki/newsletter/NewsletterResource.java | 2 +- .../benki/newsletter/NewsletterSender.java | 2 +- .../benki/newsletter/NewsletterUnsubscriber.java | 2 +- .../java/eu/mulk/mulkcms2/benki/posts/Post.java | 46 +++---- .../eu/mulk/mulkcms2/benki/posts/PostResource.java | 92 ++++++++------ .../eu/mulk/mulkcms2/benki/wiki/WikiResource.java | 19 ++- .../eu/mulk/mulkcms2/cms/about/AboutResource.java | 11 +- .../cms/privacy/about/PrivacyPolicyResource.java | 11 +- .../templates/benki/bookmarks/newBookmark.html | 5 +- .../resources/templates/benki/posts/postList.html | 138 ++++++++++----------- .../resources/templates/benki/wiki/wikiPage.html | 4 +- .../templates/benki/wiki/wikiPageRevisionList.html | 21 ++-- 14 files changed, 182 insertions(+), 194 deletions(-) (limited to 'src/main') diff --git a/src/main/java/eu/mulk/mulkcms2/benki/bookmarks/BookmarkResource.java b/src/main/java/eu/mulk/mulkcms2/benki/bookmarks/BookmarkResource.java index bb39be9..a2d8831 100644 --- a/src/main/java/eu/mulk/mulkcms2/benki/bookmarks/BookmarkResource.java +++ b/src/main/java/eu/mulk/mulkcms2/benki/bookmarks/BookmarkResource.java @@ -9,9 +9,8 @@ import static javax.ws.rs.core.MediaType.WILDCARD; import eu.mulk.mulkcms2.benki.posts.Post; import eu.mulk.mulkcms2.benki.posts.PostFilter; import eu.mulk.mulkcms2.benki.posts.PostResource; -import io.quarkus.qute.Template; +import io.quarkus.qute.CheckedTemplate; import io.quarkus.qute.TemplateInstance; -import io.quarkus.qute.api.ResourcePath; import io.quarkus.security.Authenticated; import java.io.IOException; import java.net.URI; @@ -21,7 +20,6 @@ import java.time.OffsetDateTime; import java.util.Objects; import java.util.Set; import javax.annotation.CheckForNull; -import javax.inject.Inject; import javax.json.JsonObject; import javax.transaction.Transactional; import javax.validation.constraints.NotEmpty; @@ -42,9 +40,12 @@ import org.jsoup.Jsoup; @Path("/bookmarks") public class BookmarkResource extends PostResource { - @ResourcePath("benki/bookmarks/newBookmark.html") - @Inject - Template newBookmark; + @CheckedTemplate(basePath = "benki/bookmarks") + static class Templates { + + public static native TemplateInstance newBookmark( + @CheckForNull String uri, @CheckForNull String title, @CheckForNull String description); + } public BookmarkResource() throws NoSuchAlgorithmException { super(PostFilter.BOOKMARKS_ONLY, "Bookmarks"); @@ -124,7 +125,7 @@ public class BookmarkResource extends PostResource { @QueryParam("uri") @CheckForNull String uri, @QueryParam("title") @CheckForNull String title, @QueryParam("description") @CheckForNull String description) { - return newBookmark.data("uri", uri).data("title", title).data("description", description); + return Templates.newBookmark(uri, title, description); } @GET diff --git a/src/main/java/eu/mulk/mulkcms2/benki/lazychat/LazychatMessage.java b/src/main/java/eu/mulk/mulkcms2/benki/lazychat/LazychatMessage.java index aa5b6eb..f52e05a 100644 --- a/src/main/java/eu/mulk/mulkcms2/benki/lazychat/LazychatMessage.java +++ b/src/main/java/eu/mulk/mulkcms2/benki/lazychat/LazychatMessage.java @@ -8,7 +8,6 @@ import javax.persistence.Entity; import javax.persistence.FetchType; import javax.persistence.OneToMany; import javax.persistence.Table; -import javax.persistence.Transient; @Entity @Table(name = "lazychat_messages", schema = "benki") @@ -18,13 +17,6 @@ public class LazychatMessage extends Post { @JsonbTransient public Collection references; - @Transient - @JsonbTransient - @CheckForNull - public String getContentHtml() { - return getDescriptionHtml(); - } - @CheckForNull @Override public String getUri() { diff --git a/src/main/java/eu/mulk/mulkcms2/benki/newsletter/NewsletterResource.java b/src/main/java/eu/mulk/mulkcms2/benki/newsletter/NewsletterResource.java index 948ef4b..3ad24af 100644 --- a/src/main/java/eu/mulk/mulkcms2/benki/newsletter/NewsletterResource.java +++ b/src/main/java/eu/mulk/mulkcms2/benki/newsletter/NewsletterResource.java @@ -3,8 +3,8 @@ package eu.mulk.mulkcms2.benki.newsletter; import static javax.ws.rs.core.MediaType.TEXT_HTML; import io.quarkus.mailer.MailTemplate.MailTemplateInstance; +import io.quarkus.qute.CheckedTemplate; import io.quarkus.qute.TemplateInstance; -import io.quarkus.qute.api.CheckedTemplate; import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletionStage; import javax.transaction.Transactional; diff --git a/src/main/java/eu/mulk/mulkcms2/benki/newsletter/NewsletterSender.java b/src/main/java/eu/mulk/mulkcms2/benki/newsletter/NewsletterSender.java index 1dacccc..c6999fb 100644 --- a/src/main/java/eu/mulk/mulkcms2/benki/newsletter/NewsletterSender.java +++ b/src/main/java/eu/mulk/mulkcms2/benki/newsletter/NewsletterSender.java @@ -8,8 +8,8 @@ import eu.mulk.mulkcms2.benki.lazychat.LazychatMessage; import eu.mulk.mulkcms2.benki.posts.Post; import io.quarkus.mailer.MailTemplate.MailTemplateInstance; import io.quarkus.panache.common.Sort; +import io.quarkus.qute.CheckedTemplate; import io.quarkus.qute.TemplateExtension; -import io.quarkus.qute.api.CheckedTemplate; import io.quarkus.scheduler.Scheduled; import java.time.LocalDate; import java.time.OffsetDateTime; diff --git a/src/main/java/eu/mulk/mulkcms2/benki/newsletter/NewsletterUnsubscriber.java b/src/main/java/eu/mulk/mulkcms2/benki/newsletter/NewsletterUnsubscriber.java index d157a87..89e292e 100644 --- a/src/main/java/eu/mulk/mulkcms2/benki/newsletter/NewsletterUnsubscriber.java +++ b/src/main/java/eu/mulk/mulkcms2/benki/newsletter/NewsletterUnsubscriber.java @@ -1,7 +1,7 @@ package eu.mulk.mulkcms2.benki.newsletter; import io.quarkus.mailer.MailTemplate.MailTemplateInstance; -import io.quarkus.qute.api.CheckedTemplate; +import io.quarkus.qute.CheckedTemplate; import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; diff --git a/src/main/java/eu/mulk/mulkcms2/benki/posts/Post.java b/src/main/java/eu/mulk/mulkcms2/benki/posts/Post.java index f783ba0..6c87096 100644 --- a/src/main/java/eu/mulk/mulkcms2/benki/posts/Post.java +++ b/src/main/java/eu/mulk/mulkcms2/benki/posts/Post.java @@ -245,7 +245,23 @@ public abstract class Post> extends PanacheEntityBase { return scope == Scope.top_level; } - public static class PostPage> { + public static class Day>> { + public final @CheckForNull LocalDate date; + public final List posts; + + private Day(LocalDate date, List posts) { + this.date = date; + this.posts = posts; + } + + public void cacheDescriptions() { + for (var post : posts) { + post.getTexts().values().forEach(PostText::getDescriptionHtml); + } + } + } + + public static class PostPage>> { public @CheckForNull final Integer prevCursor; public @CheckForNull final Integer cursor; public @CheckForNull final Integer nextCursor; @@ -268,39 +284,23 @@ public abstract class Post> extends PanacheEntityBase { days().forEach(Day::cacheDescriptions); } - public class Day { - public final @CheckForNull LocalDate date; - public final List posts; - - private Day(LocalDate date, List posts) { - this.date = date; - this.posts = posts; - } - - public void cacheDescriptions() { - for (var post : posts) { - post.getTexts().values().forEach(PostText::getDescriptionHtml); - } - } - } - - public List days() { + public List> days() { return posts.stream() .collect(Collectors.groupingBy(post -> post.date.toLocalDate())) .entrySet() .stream() - .map(x -> new Day(x.getKey(), x.getValue())) - .sorted(Comparator.comparing((Day day) -> day.date).reversed()) + .map(x -> new Day(x.getKey(), x.getValue())) + .sorted(Comparator.comparing((Day day) -> day.date).reversed()) .collect(Collectors.toUnmodifiableList()); } } - public static PostPage> findViewable( + public static PostPage>> findViewable( PostFilter postFilter, Session session, @CheckForNull User viewer, @CheckForNull User owner) { return findViewable(postFilter, session, viewer, owner, null, null, null); } - public static PostPage> findViewable( + public static PostPage>> findViewable( PostFilter postFilter, Session session, @CheckForNull User viewer, @@ -322,7 +322,7 @@ public abstract class Post> extends PanacheEntityBase { return findViewable(entityClass, session, viewer, owner, cursor, count, searchQuery); } - protected static > PostPage findViewable( + protected static >> PostPage findViewable( Class entityClass, Session session, @CheckForNull User viewer, diff --git a/src/main/java/eu/mulk/mulkcms2/benki/posts/PostResource.java b/src/main/java/eu/mulk/mulkcms2/benki/posts/PostResource.java index 495c780..e1ba1aa 100644 --- a/src/main/java/eu/mulk/mulkcms2/benki/posts/PostResource.java +++ b/src/main/java/eu/mulk/mulkcms2/benki/posts/PostResource.java @@ -15,13 +15,11 @@ import com.rometools.rome.io.WireFeedOutput; import eu.mulk.mulkcms2.benki.accesscontrol.PageKey; import eu.mulk.mulkcms2.benki.accesscontrol.Role; import eu.mulk.mulkcms2.benki.login.LoginRoles; -import eu.mulk.mulkcms2.benki.login.LoginStatus; import eu.mulk.mulkcms2.benki.posts.Post.PostPage; import eu.mulk.mulkcms2.benki.users.User; -import io.quarkus.qute.Template; +import io.quarkus.qute.CheckedTemplate; import io.quarkus.qute.TemplateExtension; import io.quarkus.qute.TemplateInstance; -import io.quarkus.qute.api.ResourcePath; import io.quarkus.security.identity.SecurityIdentity; import java.math.BigInteger; import java.net.URI; @@ -88,9 +86,22 @@ public abstract class PostResource { @ConfigProperty(name = "mulkcms.posts.default-max-results") int defaultMaxResults; - @ResourcePath("benki/posts/postList.html") - @Inject - Template postList; + @CheckedTemplate(basePath = "benki/posts") + static class Templates { + + public static native TemplateInstance postList( + List>>> postDays, + @CheckForNull String feedUri, + String pageTitle, + Boolean showBookmarkForm, + Boolean showLazychatForm, + Boolean hasPreviousPage, + Boolean hasNextPage, + @CheckForNull Integer previousCursor, + @CheckForNull Integer nextCursor, + @CheckForNull Integer pageSize, + @CheckForNull String searchQuery); + } @Inject protected SecurityIdentity identity; @@ -135,18 +146,18 @@ public abstract class PostResource { feedUri += "?page-key=" + pageKey.key.toString(36); } - return postList - .data("postDays", q.days()) - .data("feedUri", feedUri) - .data("pageTitle", pageTitle) - .data("showBookmarkForm", showBookmarkForm()) - .data("showLazychatForm", showLazychatForm()) - .data("hasPreviousPage", q.prevCursor != null) - .data("hasNextPage", q.nextCursor != null) - .data("previousCursor", q.prevCursor) - .data("nextCursor", q.nextCursor) - .data("pageSize", maxResults) - .data("searchQuery", searchQuery); + return Templates.postList( + q.days(), + feedUri, + pageTitle, + showBookmarkForm(), + showLazychatForm(), + q.prevCursor != null, + q.nextCursor != null, + q.prevCursor, + q.nextCursor, + maxResults, + searchQuery); } @GET @@ -173,17 +184,18 @@ public abstract class PostResource { feedUri += "?page-key=" + pageKey.key.toString(36); } - return postList - .data("postDays", q.days()) - .data("feedUri", feedUri) - .data("pageTitle", pageTitle) - .data("showBookmarkForm", showBookmarkForm()) - .data("showLazychatForm", showLazychatForm()) - .data("hasPreviousPage", q.prevCursor != null) - .data("hasNextPage", q.nextCursor != null) - .data("previousCursor", q.prevCursor) - .data("nextCursor", q.nextCursor) - .data("pageSize", maxResults); + return Templates.postList( + q.days(), + feedUri, + pageTitle, + showBookmarkForm(), + showLazychatForm(), + q.prevCursor != null, + q.nextCursor != null, + q.prevCursor, + q.nextCursor, + maxResults, + null); } @Transactional @@ -214,16 +226,18 @@ public abstract class PostResource { public TemplateInstance getPostHtml(@PathParam("id") int id) { var post = getPostIfVisible(id); - return postList - .data("postDays", new PostPage<>(null, null, null, List.of(post)).days()) - .data("pageTitle", String.format("Post #%d", id)) - .data("showBookmarkForm", false) - .data("showLazychatForm", false) - .data("hasPreviousPage", false) - .data("hasNextPage", false) - .data("previousCursor", null) - .data("nextCursor", null) - .data("pageSize", null); + return Templates.postList( + new PostPage>>(null, null, null, List.of(post)).days(), + null, + String.format("Post #%d", id), + false, + false, + false, + false, + null, + null, + null, + null); } @GET diff --git a/src/main/java/eu/mulk/mulkcms2/benki/wiki/WikiResource.java b/src/main/java/eu/mulk/mulkcms2/benki/wiki/WikiResource.java index 7b2395d..d50cdc5 100644 --- a/src/main/java/eu/mulk/mulkcms2/benki/wiki/WikiResource.java +++ b/src/main/java/eu/mulk/mulkcms2/benki/wiki/WikiResource.java @@ -5,10 +5,9 @@ import static javax.ws.rs.core.MediaType.TEXT_HTML; import eu.mulk.mulkcms2.benki.users.User; import io.quarkus.panache.common.Sort; -import io.quarkus.qute.Template; +import io.quarkus.qute.CheckedTemplate; import io.quarkus.qute.TemplateExtension; import io.quarkus.qute.TemplateInstance; -import io.quarkus.qute.api.ResourcePath; import io.quarkus.security.Authenticated; import io.quarkus.security.identity.SecurityIdentity; import java.net.URI; @@ -48,13 +47,13 @@ public class WikiResource { private static final JsonProvider jsonProvider = JsonProvider.provider(); - @ResourcePath("benki/wiki/wikiPage.html") - @Inject - Template wikiPage; + @CheckedTemplate(basePath = "benki/wiki") + static class Templates { - @ResourcePath("benki/wiki/wikiPageRevisionList.html") - @Inject - Template wikiPageRevisionList; + public static native TemplateInstance wikiPage(WikiPageRevision page); + + public static native TemplateInstance wikiPageRevisionList(WikiPage page, String title); + } @Inject SecurityIdentity identity; @@ -78,7 +77,7 @@ public class WikiResource { throw new NotFoundException(); } var page = maybePage.get(); - return wikiPage.data("page", page); + return Templates.wikiPage(page); } @POST @@ -160,7 +159,7 @@ public class WikiResource { primaryRevision.page.id) .singleResult(); - return wikiPageRevisionList.data("page", page).data("title", pageName); + return Templates.wikiPageRevisionList(page, pageName); } @TemplateExtension diff --git a/src/main/java/eu/mulk/mulkcms2/cms/about/AboutResource.java b/src/main/java/eu/mulk/mulkcms2/cms/about/AboutResource.java index a1da033..c112773 100644 --- a/src/main/java/eu/mulk/mulkcms2/cms/about/AboutResource.java +++ b/src/main/java/eu/mulk/mulkcms2/cms/about/AboutResource.java @@ -1,8 +1,7 @@ package eu.mulk.mulkcms2.cms.about; -import io.quarkus.qute.Template; +import io.quarkus.qute.CheckedTemplate; import io.quarkus.qute.TemplateInstance; -import io.quarkus.qute.api.ResourcePath; import javax.ws.rs.GET; import javax.ws.rs.Path; import javax.ws.rs.Produces; @@ -11,12 +10,14 @@ import javax.ws.rs.core.MediaType; @Path("/about") public class AboutResource { - @ResourcePath("benki/about/index.html") - Template index; + @CheckedTemplate(basePath = "benki/about") + static class Templates { + public static native TemplateInstance index(); + } @GET @Produces(MediaType.TEXT_HTML) public TemplateInstance getIndex() { - return index.instance(); + return Templates.index(); } } diff --git a/src/main/java/eu/mulk/mulkcms2/cms/privacy/about/PrivacyPolicyResource.java b/src/main/java/eu/mulk/mulkcms2/cms/privacy/about/PrivacyPolicyResource.java index 05c155c..5255ee2 100644 --- a/src/main/java/eu/mulk/mulkcms2/cms/privacy/about/PrivacyPolicyResource.java +++ b/src/main/java/eu/mulk/mulkcms2/cms/privacy/about/PrivacyPolicyResource.java @@ -1,8 +1,7 @@ package eu.mulk.mulkcms2.cms.privacy.about; -import io.quarkus.qute.Template; +import io.quarkus.qute.CheckedTemplate; import io.quarkus.qute.TemplateInstance; -import io.quarkus.qute.api.ResourcePath; import javax.ws.rs.GET; import javax.ws.rs.Path; import javax.ws.rs.Produces; @@ -11,12 +10,14 @@ import javax.ws.rs.core.MediaType; @Path("/privacy") public class PrivacyPolicyResource { - @ResourcePath("benki/privacy/index.html") - Template index; + @CheckedTemplate(basePath = "benki/privacy") + static class Templates { + public static native TemplateInstance index(); + } @GET @Produces(MediaType.TEXT_HTML) public TemplateInstance getIndex() { - return index.instance(); + return Templates.index(); } } diff --git a/src/main/resources/templates/benki/bookmarks/newBookmark.html b/src/main/resources/templates/benki/bookmarks/newBookmark.html index d6a868c..bc469f5 100644 --- a/src/main/resources/templates/benki/bookmarks/newBookmark.html +++ b/src/main/resources/templates/benki/bookmarks/newBookmark.html @@ -1,5 +1,6 @@ -{@java.util.List bookmarks} -{@java.lang.Boolean authenticated} +{@java.lang.String uri} +{@java.lang.String title} +{@java.lang.String description} {#include base.html} diff --git a/src/main/resources/templates/benki/posts/postList.html b/src/main/resources/templates/benki/posts/postList.html index 7039d65..7198af1 100644 --- a/src/main/resources/templates/benki/posts/postList.html +++ b/src/main/resources/templates/benki/posts/postList.html @@ -1,13 +1,3 @@ -{@java.util.List.Day> postDays} -{@java.lang.String pageTitle} -{@java.lang.Boolean showBookmarkForm} -{@java.lang.Boolean hasPreviousPage} -{@java.lang.Boolean hasNextPage} -{@java.lang.Integer previousCursor} -{@java.lang.Integer nextCursor} -{@java.lang.Integer pageSize} -{@java.lang.String searchQuery} - {#include base.html} {#title}Benki {pageTitle}{/title} @@ -60,73 +50,71 @@ {#for post in day.posts} - {#with post} - {#if post.isBookmark} -
-
- {#if showBookmarkForm} - - - - {/if} -
- -
-
- {owner.firstName} - - # - - - -

🔖 {title}

. -
-
-
- -
- {#if showBookmarkForm} - - {/if} + {#if post.isBookmark} + - {#else} -
-
- {#if showLazychatForm} - - - - {/if} -
- -
-
- {owner.firstName} - - # - -
-
- -
- {#if showLazychatForm} - - {/if} + + +
+ {#if showBookmarkForm} + + {/if} +
+ +
+ {post.descriptionHtml.raw} +
+ +
+
+ {#else} +
+
+ {#if showLazychatForm} + + + + {/if} +
+ +
+
+ {post.owner.firstName} + + # +
- -
- {contentHtml.raw} -
-
- {/if} - {/with} + + +
+ {#if showLazychatForm} + + {/if} +
+ +
+ {post.descriptionHtml.raw} +
+
+ {/if} {/for} {/for} diff --git a/src/main/resources/templates/benki/wiki/wikiPage.html b/src/main/resources/templates/benki/wiki/wikiPage.html index 048c9b3..63d9950 100644 --- a/src/main/resources/templates/benki/wiki/wikiPage.html +++ b/src/main/resources/templates/benki/wiki/wikiPage.html @@ -1,5 +1,3 @@ -{@eu.mulk.mulkcms2.benki.wiki.WikiPageRevision page} - {#include base.html} {#title}{page.title} — Benki Wiki{/title} @@ -84,7 +82,7 @@
- {#with page}{enrichedContent.raw}{/} + {page.enrichedContent.raw}
diff --git a/src/main/resources/templates/benki/wiki/wikiPageRevisionList.html b/src/main/resources/templates/benki/wiki/wikiPageRevisionList.html index eacad4b..ca84fcb 100644 --- a/src/main/resources/templates/benki/wiki/wikiPageRevisionList.html +++ b/src/main/resources/templates/benki/wiki/wikiPageRevisionList.html @@ -1,6 +1,3 @@ -{@eu.mulk.mulkcms2.benki.wiki.WikiPage page} -{@java.lang.String title} - {#include base.html} {#title}Revisions — {title} — Benki Wiki{/title} @@ -25,17 +22,13 @@ - {#with page} - {#for revision in revisions} - - {#with revision} - {date.humanDateTime} - {title} - {author.firstName} - {/with} - - {/for} - {/with} + {#for revision in page.revisions} + + {revision.date.humanDateTime} + {revision.title} + {revision.author.firstName} + + {/for} -- cgit v1.2.3