From 31a6c799297798843ca3c93423e57033098efe8d Mon Sep 17 00:00:00 2001
From: JesseBrault0709 <62299747+JesseBrault0709@users.noreply.github.com>
Date: Thu, 30 May 2024 09:36:23 +0200
Subject: [PATCH] Fixes to groovy class loading mechanisms.
---
.../ssg/DefaultStaticSiteGenerator.groovy | 41 ++++++++++++++++++-
.../jessebrault/ssg/page/DefaultPage.groovy | 3 +-
.../com/jessebrault/ssg/page/Page.groovy | 1 +
.../com/jessebrault/ssg/page/PageSpec.groovy | 1 +
.../jessebrault/ssg/view/WvcPageView.groovy | 2 +
.../groovy/com/jessebrault/site/Head.groovy | 14 +++++++
.../com/jessebrault/site/HeadTemplate.wvc | 6 +++
.../com/jessebrault/site/Biography.groovy | 9 +++-
.../jessebrault/site/BiographyTemplate.wvc | 4 +-
9 files changed, 74 insertions(+), 7 deletions(-)
create mode 100644 test-ssg-project/components/groovy/com/jessebrault/site/Head.groovy
create mode 100644 test-ssg-project/components/resources/com/jessebrault/site/HeadTemplate.wvc
diff --git a/api/src/main/groovy/com/jessebrault/ssg/DefaultStaticSiteGenerator.groovy b/api/src/main/groovy/com/jessebrault/ssg/DefaultStaticSiteGenerator.groovy
index fd70525..8568889 100644
--- a/api/src/main/groovy/com/jessebrault/ssg/DefaultStaticSiteGenerator.groovy
+++ b/api/src/main/groovy/com/jessebrault/ssg/DefaultStaticSiteGenerator.groovy
@@ -15,7 +15,12 @@ import com.jessebrault.ssg.view.PageView
import com.jessebrault.ssg.view.WvcPageView
import groovy.transform.TupleConstructor
import groowt.util.di.RegistryObjectFactory
+import groowt.view.component.compiler.DefaultComponentTemplateCompilerConfiguration
+import groowt.view.component.compiler.SimpleComponentTemplateClassFactory
+import groowt.view.component.compiler.source.ComponentTemplateSource
import groowt.view.component.web.DefaultWebViewComponentContext
+import groowt.view.component.web.DefaultWebViewComponentScope
+import groowt.view.component.web.compiler.DefaultWebViewComponentTemplateCompileUnit
import io.github.classgraph.ClassGraph
import org.slf4j.Logger
import org.slf4j.LoggerFactory
@@ -142,7 +147,10 @@ class DefaultStaticSiteGenerator implements StaticSiteGenerator {
pageSpec.name(),
pageSpec.path(),
pageSpec.fileExtension(),
- (Class extends PageView>) pageViewInfo.loadClass()
+ (Class extends PageView>) pageViewInfo.loadClass(),
+ !pageSpec.templateResource().empty
+ ? pageSpec.templateResource()
+ : pageViewInfo.simpleName + 'Template.wvc'
)
}
}
@@ -172,6 +180,9 @@ class DefaultStaticSiteGenerator implements StaticSiteGenerator {
}
def diagnostics = [] as Collection
+ def wvcCompilerConfiguration = new DefaultComponentTemplateCompilerConfiguration()
+ wvcCompilerConfiguration.groovyClassLoader = this.groovyClassLoader
+ def componentTemplateClassFactory = new SimpleComponentTemplateClassFactory(this.groovyClassLoader)
pages.each {
// instantiate PageView
@@ -191,7 +202,33 @@ class DefaultStaticSiteGenerator implements StaticSiteGenerator {
pageView.pageTitle = it.name
pageView.url = buildSpec.baseUrl.get() + it.path
if (pageView instanceof WvcPageView) {
- pageView.context = new DefaultWebViewComponentContext()
+ pageView.context = new DefaultWebViewComponentContext().tap {
+ configureRootScope {
+ // TODO: scan components in same package, add them to the scope with factories which
+ // use the object factory to construct the component
+ }
+ }
+
+ if (pageView.componentTemplate == null) {
+ def templateUrl = pageView.class.getResource(it.templateResource)
+ if (templateUrl == null) {
+ diagnostics.add(new Diagnostic(
+ "Could not find templateResource: $it.templateResource"
+ ))
+ return
+ }
+ def source = ComponentTemplateSource.of(templateUrl)
+ def compileUnit = new DefaultWebViewComponentTemplateCompileUnit(
+ source.descriptiveName,
+ pageView.class,
+ source,
+ pageView.class.packageName
+ )
+ def compileResult = compileUnit.compile(wvcCompilerConfiguration)
+ def templateClass = componentTemplateClassFactory.getTemplateClass(compileResult)
+ def componentTemplate = templateClass.getConstructor().newInstance()
+ pageView.componentTemplate = componentTemplate
+ }
}
// Render the page
diff --git a/api/src/main/groovy/com/jessebrault/ssg/page/DefaultPage.groovy b/api/src/main/groovy/com/jessebrault/ssg/page/DefaultPage.groovy
index 6f26827..a3e2e33 100644
--- a/api/src/main/groovy/com/jessebrault/ssg/page/DefaultPage.groovy
+++ b/api/src/main/groovy/com/jessebrault/ssg/page/DefaultPage.groovy
@@ -14,10 +14,11 @@ class DefaultPage implements Page {
final String path
final String fileExtension
final Class extends PageView> viewType
+ final String templateResource
@Override
String toString() {
- "SimplePage(name: $name, path: $path, fileExtension: $fileExtension)"
+ "SimplePage(name: $name, path: $path, fileExtension: $fileExtension, templateResource: $templateResource)"
}
}
diff --git a/api/src/main/groovy/com/jessebrault/ssg/page/Page.groovy b/api/src/main/groovy/com/jessebrault/ssg/page/Page.groovy
index 9488e38..c37a886 100644
--- a/api/src/main/groovy/com/jessebrault/ssg/page/Page.groovy
+++ b/api/src/main/groovy/com/jessebrault/ssg/page/Page.groovy
@@ -7,4 +7,5 @@ interface Page {
String getPath()
String getFileExtension()
Class extends PageView> getViewType()
+ String getTemplateResource()
}
diff --git a/api/src/main/groovy/com/jessebrault/ssg/page/PageSpec.groovy b/api/src/main/groovy/com/jessebrault/ssg/page/PageSpec.groovy
index a54c605..9434c21 100644
--- a/api/src/main/groovy/com/jessebrault/ssg/page/PageSpec.groovy
+++ b/api/src/main/groovy/com/jessebrault/ssg/page/PageSpec.groovy
@@ -10,5 +10,6 @@ import java.lang.annotation.Target
@interface PageSpec {
String name()
String path()
+ String templateResource() default ''
String fileExtension() default '.html'
}
diff --git a/api/src/main/groovy/com/jessebrault/ssg/view/WvcPageView.groovy b/api/src/main/groovy/com/jessebrault/ssg/view/WvcPageView.groovy
index 460e64c..34bbc49 100644
--- a/api/src/main/groovy/com/jessebrault/ssg/view/WvcPageView.groovy
+++ b/api/src/main/groovy/com/jessebrault/ssg/view/WvcPageView.groovy
@@ -13,6 +13,8 @@ abstract class WvcPageView extends BaseWebViewComponent implements PageView, Wit
String pageTitle
String url
+ WvcPageView() {}
+
WvcPageView(ComponentTemplate template) {
super(template)
}
diff --git a/test-ssg-project/components/groovy/com/jessebrault/site/Head.groovy b/test-ssg-project/components/groovy/com/jessebrault/site/Head.groovy
new file mode 100644
index 0000000..dacb619
--- /dev/null
+++ b/test-ssg-project/components/groovy/com/jessebrault/site/Head.groovy
@@ -0,0 +1,14 @@
+package com.jessebrault.site
+
+import groowt.view.component.web.BaseWebViewComponent
+
+class Head extends BaseWebViewComponent {
+
+ final String title
+
+ Head(Map attr) {
+ super(Head.getResource('HeadTemplate.wvc'))
+ this.title = attr.title()
+ }
+
+}
diff --git a/test-ssg-project/components/resources/com/jessebrault/site/HeadTemplate.wvc b/test-ssg-project/components/resources/com/jessebrault/site/HeadTemplate.wvc
new file mode 100644
index 0000000..f97e2d2
--- /dev/null
+++ b/test-ssg-project/components/resources/com/jessebrault/site/HeadTemplate.wvc
@@ -0,0 +1,6 @@
+---
+package com.jessebrault.site
+---
+
+ $title
+
diff --git a/test-ssg-project/pages/groovy/com/jessebrault/site/Biography.groovy b/test-ssg-project/pages/groovy/com/jessebrault/site/Biography.groovy
index dc606d6..1c5cb10 100644
--- a/test-ssg-project/pages/groovy/com/jessebrault/site/Biography.groovy
+++ b/test-ssg-project/pages/groovy/com/jessebrault/site/Biography.groovy
@@ -4,6 +4,7 @@ import com.jessebrault.ssg.di.InjectText
import com.jessebrault.ssg.page.PageSpec
import com.jessebrault.ssg.text.Text
import com.jessebrault.ssg.view.WvcPageView
+import groowt.view.component.web.WebViewComponentScope
import jakarta.inject.Inject
@PageSpec(name = 'Biography', path = '/biography')
@@ -15,8 +16,14 @@ class Biography extends WvcPageView {
@Inject
Biography(@InjectText('/Biography.md') Text biographyText) {
- super(Biography.getResource('BiographyTemplate.wvc'))
this.biographyText = biographyText
}
+ @Override
+ protected void beforeRender() {
+ context.configureRootScope(WebViewComponentScope) {
+ addWithAttr(Head)
+ }
+ }
+
}
diff --git a/test-ssg-project/pages/resources/com/jessebrault/site/BiographyTemplate.wvc b/test-ssg-project/pages/resources/com/jessebrault/site/BiographyTemplate.wvc
index b904c90..8be6719 100644
--- a/test-ssg-project/pages/resources/com/jessebrault/site/BiographyTemplate.wvc
+++ b/test-ssg-project/pages/resources/com/jessebrault/site/BiographyTemplate.wvc
@@ -2,9 +2,7 @@
package com.jessebrault.site
---
-
- $pageTitle
-
+
$pageTitle
$url