/*
- * Sone - FreenetTemplatePage.java - Copyright © 2010–2019 David Roden
+ * Sone - FreenetTemplatePage.kt - Copyright © 2010–2019 David Roden
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
import net.pterodactylus.sone.main.*
import net.pterodactylus.util.template.*
import net.pterodactylus.util.web.*
-import java.io.*
import java.lang.String.*
import java.net.*
import java.util.logging.*
* fit into Freenet’s web interface.
*/
open class FreenetTemplatePage(
- private val path: String,
- private val templateContextFactory: TemplateContextFactory,
- private val loaders: Loaders,
- private val template: Template,
+ private val templateRenderer: TemplateRenderer,
+ loaders: Loaders,
private val invalidFormPasswordRedirectTarget: String
) : FreenetPage, LinkEnabledCallback {
+ private val pageMakerInteractionFactory: PageMakerInteractionFactory = DefaultPageMakerInteractionFactory()
open val styleSheets: Collection<String> = emptySet()
open val shortcutIcon: String? get() = null
open val isFullAccessOnly get() = false
- override fun getPath() = path
+ override fun getPath() = toadletPath
open fun getPageTitle(request: FreenetRequest) = ""
override fun isEnabled(toadletContext: ToadletContext) = !isFullAccessOnly
+ private val template = templatePath?.let(loaders::loadTemplate) ?: Template()
+
override fun handleRequest(request: FreenetRequest, response: Response): Response {
getRedirectTarget(request)?.let { redirectTarget -> return RedirectResponse(redirectTarget) }
return RedirectResponse(invalidFormPasswordRedirectTarget)
}
}
- val pageMaker = toadletContext.pageMaker
- val pageNode = pageMaker.getPageNode(getPageTitle(request), toadletContext)
-
- styleSheets.forEach(pageNode::addCustomStyleSheet)
- getAdditionalLinkNodes(request)
- .map { it to pageNode.headNode.addChild("link") }
- .forEach { (linkNodeParameters, linkNode) ->
- linkNodeParameters.forEach(linkNode::addAttribute)
- }
- shortcutIcon?.let { pageNode.addForwardLink("icon", it) }
-
- val templateContext = templateContextFactory.createTemplateContext()
- templateContext.mergeContext(template.initialContext)
- try {
+
+ val pageMakerInteraction = pageMakerInteractionFactory.createPageMaker(toadletContext, getPageTitle(request))
+ styleSheets.forEach(pageMakerInteraction::addStyleSheet)
+ getAdditionalLinkNodes(request).forEach(pageMakerInteraction::addLinkNode)
+ shortcutIcon?.let(pageMakerInteraction::addShortcutIcon)
+
+ val output = try {
val start = System.nanoTime()
- processTemplate(request, templateContext)
- val finish = System.nanoTime()
- logger.log(Level.FINEST, format("Template was rendered in %.2fms.", (finish - start) / 1000000.0))
+ templateRenderer.render(template) { templateContext ->
+ processTemplate(request, templateContext)
+ }.also {
+ val finish = System.nanoTime()
+ logger.log(Level.FINEST, format("Template was rendered in %.2fms.", (finish - start) / 1000000.0))
+ }
} catch (re1: RedirectException) {
return RedirectResponse(re1.target ?: "")
}
- val stringWriter = StringWriter()
- template.render(templateContext, stringWriter)
- pageNode.content.addChild("%", stringWriter.toString())
+ pageMakerInteraction.setContent(output)
- return response.setStatusCode(200).setStatusText("OK").setContentType("text/html").write(pageNode.outer.generate())
+ return response.setStatusCode(200).setStatusText("OK").setContentType("text/html").write(pageMakerInteraction.renderPage())
}
open fun processTemplate(request: FreenetRequest, templateContext: TemplateContext) {