🔀 Merge branch 'release/v82'
[Sone.git] / src / main / kotlin / net / pterodactylus / sone / web / page / FreenetTemplatePage.kt
index 900ece9..3912f98 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Sone - FreenetTemplatePage.java - Copyright Â© 2010–2019 David Roden
+ * Sone - FreenetTemplatePage.kt - Copyright Â© 2010–2020 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
@@ -31,17 +31,17 @@ import java.util.logging.Logger.*
  * fit into Freenet’s web interface.
  */
 open class FreenetTemplatePage(
-               private val path: String,
                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) = ""
 
@@ -71,16 +71,11 @@ open class FreenetTemplatePage(
                                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 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()
@@ -94,15 +89,18 @@ open class FreenetTemplatePage(
                        return RedirectResponse(re1.target ?: "")
                }
 
-               pageNode.content.addChild("%", output)
+               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) {
                /* do nothing. */
        }
 
+       fun redirectTo(target: String?): Nothing =
+                       throw RedirectException(target)
+
        class RedirectException(val target: String?) : Exception() {
                override fun toString(): String = format("RedirectException{target='%s'}", target)
        }