Components automatically added to root scope and instantiated via objectFactory.
This commit is contained in:
parent
31a6c79929
commit
b5a7b1f67d
@ -15,11 +15,17 @@ import com.jessebrault.ssg.view.PageView
|
|||||||
import com.jessebrault.ssg.view.WvcPageView
|
import com.jessebrault.ssg.view.WvcPageView
|
||||||
import groovy.transform.TupleConstructor
|
import groovy.transform.TupleConstructor
|
||||||
import groowt.util.di.RegistryObjectFactory
|
import groowt.util.di.RegistryObjectFactory
|
||||||
|
import groowt.util.fp.either.Either
|
||||||
|
import groowt.view.component.ComponentTemplate
|
||||||
|
import groowt.view.component.ViewComponent
|
||||||
|
import groowt.view.component.compiler.ComponentTemplateClassFactory
|
||||||
|
import groowt.view.component.compiler.ComponentTemplateCompilerConfiguration
|
||||||
import groowt.view.component.compiler.DefaultComponentTemplateCompilerConfiguration
|
import groowt.view.component.compiler.DefaultComponentTemplateCompilerConfiguration
|
||||||
import groowt.view.component.compiler.SimpleComponentTemplateClassFactory
|
import groowt.view.component.compiler.SimpleComponentTemplateClassFactory
|
||||||
import groowt.view.component.compiler.source.ComponentTemplateSource
|
import groowt.view.component.compiler.source.ComponentTemplateSource
|
||||||
|
import groowt.view.component.factory.ComponentFactories
|
||||||
import groowt.view.component.web.DefaultWebViewComponentContext
|
import groowt.view.component.web.DefaultWebViewComponentContext
|
||||||
import groowt.view.component.web.DefaultWebViewComponentScope
|
import groowt.view.component.web.WebViewComponent
|
||||||
import groowt.view.component.web.compiler.DefaultWebViewComponentTemplateCompileUnit
|
import groowt.view.component.web.compiler.DefaultWebViewComponentTemplateCompileUnit
|
||||||
import io.github.classgraph.ClassGraph
|
import io.github.classgraph.ClassGraph
|
||||||
import org.slf4j.Logger
|
import org.slf4j.Logger
|
||||||
@ -65,6 +71,31 @@ class DefaultStaticSiteGenerator implements StaticSiteGenerator {
|
|||||||
texts
|
texts
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected Either<Diagnostic, ComponentTemplate> compileTemplate(
|
||||||
|
Class<? extends ViewComponent> componentClass,
|
||||||
|
String resourceName,
|
||||||
|
ComponentTemplateCompilerConfiguration compilerConfiguration,
|
||||||
|
ComponentTemplateClassFactory templateClassFactory
|
||||||
|
) {
|
||||||
|
def templateUrl = componentClass.getResource(resourceName)
|
||||||
|
if (templateUrl == null) {
|
||||||
|
return Either.left(new Diagnostic(
|
||||||
|
"Could not find templateResource: $it.templateResource"
|
||||||
|
))
|
||||||
|
}
|
||||||
|
def source = ComponentTemplateSource.of(templateUrl)
|
||||||
|
def compileUnit = new DefaultWebViewComponentTemplateCompileUnit(
|
||||||
|
source.descriptiveName,
|
||||||
|
componentClass,
|
||||||
|
source,
|
||||||
|
componentClass.packageName
|
||||||
|
)
|
||||||
|
def compileResult = compileUnit.compile(compilerConfiguration)
|
||||||
|
def templateClass = templateClassFactory.getTemplateClass(compileResult)
|
||||||
|
def componentTemplate = templateClass.getConstructor().newInstance()
|
||||||
|
return Either.right(componentTemplate)
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
Collection<Diagnostic> doBuild(
|
Collection<Diagnostic> doBuild(
|
||||||
File projectDir,
|
File projectDir,
|
||||||
@ -131,10 +162,11 @@ class DefaultStaticSiteGenerator implements StaticSiteGenerator {
|
|||||||
}
|
}
|
||||||
def classgraph = new ClassGraph()
|
def classgraph = new ClassGraph()
|
||||||
.enableAnnotationInfo()
|
.enableAnnotationInfo()
|
||||||
.addClassLoader(groovyClassLoader)
|
.addClassLoader(this.groovyClassLoader)
|
||||||
basePackages.each { classgraph.acceptPackages(it) }
|
basePackages.each { classgraph.acceptPackages(it) }
|
||||||
|
|
||||||
def pages = [] as Set<Page>
|
def pages = [] as Set<Page>
|
||||||
|
def allWvc = [] as Set<Class<? extends WebViewComponent>>
|
||||||
|
|
||||||
try (def scanResult = classgraph.scan()) {
|
try (def scanResult = classgraph.scan()) {
|
||||||
// single pages
|
// single pages
|
||||||
@ -168,6 +200,12 @@ class DefaultStaticSiteGenerator implements StaticSiteGenerator {
|
|||||||
def pageFactory = objectFactory.createInstance(pageFactoryType)
|
def pageFactory = objectFactory.createInstance(pageFactoryType)
|
||||||
pages.addAll(pageFactory.create())
|
pages.addAll(pageFactory.create())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// get all web view components
|
||||||
|
def wvcInfoList = scanResult.getClassesImplementing(WebViewComponent)
|
||||||
|
wvcInfoList.each {
|
||||||
|
allWvc << it.loadClass(WebViewComponent)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Configure for PageView instantiation
|
// Configure for PageView instantiation
|
||||||
@ -206,28 +244,52 @@ class DefaultStaticSiteGenerator implements StaticSiteGenerator {
|
|||||||
configureRootScope {
|
configureRootScope {
|
||||||
// TODO: scan components in same package, add them to the scope with factories which
|
// TODO: scan components in same package, add them to the scope with factories which
|
||||||
// use the object factory to construct the component
|
// use the object factory to construct the component
|
||||||
|
// also: automatically set template like below for pages
|
||||||
|
allWvc.each { wvcClass ->
|
||||||
|
//noinspection GroovyAssignabilityCheck
|
||||||
|
add(wvcClass, ComponentFactories.ofClosureClassType(wvcClass) { Map attr, Object[] args ->
|
||||||
|
WebViewComponent component
|
||||||
|
if (!attr.isEmpty() && args.length > 0) {
|
||||||
|
component = objectFactory.createInstance(wvcClass, attr, *args)
|
||||||
|
} else if (!attr.isEmpty()) {
|
||||||
|
component = objectFactory.createInstance(wvcClass, attr)
|
||||||
|
} else if (args.length > 0) {
|
||||||
|
component = objectFactory.createInstance(wvcClass, *args)
|
||||||
|
} else {
|
||||||
|
component = objectFactory.createInstance(wvcClass)
|
||||||
|
}
|
||||||
|
if (component.componentTemplate == null) {
|
||||||
|
def compileResult = this.compileTemplate(
|
||||||
|
wvcClass,
|
||||||
|
wvcClass.simpleName + 'Template.wvc',
|
||||||
|
wvcCompilerConfiguration,
|
||||||
|
componentTemplateClassFactory
|
||||||
|
)
|
||||||
|
if (compileResult.isRight()) {
|
||||||
|
component.componentTemplate = compileResult.getRight()
|
||||||
|
} else {
|
||||||
|
diagnostics << compileResult.getLeft()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return component
|
||||||
|
})
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pageView.componentTemplate == null) {
|
if (pageView.componentTemplate == null) {
|
||||||
def templateUrl = pageView.class.getResource(it.templateResource)
|
def compileResult = this.compileTemplate(
|
||||||
if (templateUrl == null) {
|
pageView.class,
|
||||||
diagnostics.add(new Diagnostic(
|
it.templateResource,
|
||||||
"Could not find templateResource: $it.templateResource"
|
wvcCompilerConfiguration,
|
||||||
))
|
componentTemplateClassFactory
|
||||||
|
)
|
||||||
|
if (compileResult.isRight()) {
|
||||||
|
pageView.componentTemplate = compileResult.getRight()
|
||||||
|
} else {
|
||||||
|
diagnostics << compileResult.getLeft()
|
||||||
return
|
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
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4,7 +4,6 @@ import com.jessebrault.ssg.di.InjectText
|
|||||||
import com.jessebrault.ssg.page.PageSpec
|
import com.jessebrault.ssg.page.PageSpec
|
||||||
import com.jessebrault.ssg.text.Text
|
import com.jessebrault.ssg.text.Text
|
||||||
import com.jessebrault.ssg.view.WvcPageView
|
import com.jessebrault.ssg.view.WvcPageView
|
||||||
import groowt.view.component.web.WebViewComponentScope
|
|
||||||
import jakarta.inject.Inject
|
import jakarta.inject.Inject
|
||||||
|
|
||||||
@PageSpec(name = 'Biography', path = '/biography')
|
@PageSpec(name = 'Biography', path = '/biography')
|
||||||
@ -19,11 +18,4 @@ class Biography extends WvcPageView {
|
|||||||
this.biographyText = biographyText
|
this.biographyText = biographyText
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void beforeRender() {
|
|
||||||
context.configureRootScope(WebViewComponentScope) {
|
|
||||||
addWithAttr(Head)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user