JteAdapter.kt
- package com.hexagonkt.templates.jte
- import com.hexagonkt.core.media.MediaType
- import com.hexagonkt.core.media.TEXT_HTML
- import com.hexagonkt.core.media.TEXT_PLAIN
- import com.hexagonkt.templates.TemplatePort
- import gg.jte.CodeResolver
- import gg.jte.ContentType
- import gg.jte.TemplateEngine
- import gg.jte.TemplateOutput
- import gg.jte.output.StringOutput
- import gg.jte.resolve.DirectoryCodeResolver
- import gg.jte.resolve.ResourceCodeResolver
- import java.net.URL
- import java.nio.file.Path
- import java.util.*
- class JteAdapter(
- mediaType: MediaType,
- resolverBase: URL? = null,
- precompiled: Boolean = false
- ) : TemplatePort {
- private companion object {
- val allowedTypes: String = setOf(TEXT_HTML, TEXT_PLAIN).joinToString(", ") { it.fullType }
- }
- private val contentType = when (mediaType) {
- TEXT_HTML -> ContentType.Html
- TEXT_PLAIN -> ContentType.Plain
- else ->
- error("Unsupported media type not in: $allowedTypes (${mediaType.fullType})")
- }
- private val resolver: CodeResolver =
- when (resolverBase?.protocol) {
- "classpath" -> ResourceCodeResolver(resolverBase.path)
- "file" -> DirectoryCodeResolver(Path.of(resolverBase.path))
- null -> ResourceCodeResolver("")
- else -> error("Invalid base schema not in: classpath, file (${resolverBase.protocol})")
- }
- private val templateEngine: TemplateEngine =
- if (precompiled) {
- if (resolverBase === null) {
- TemplateEngine.createPrecompiled(contentType)
- }
- else {
- val protocol = resolverBase.protocol
- check(protocol == "classpath") {
- "Precompiled base must be classpath URLs ($protocol)"
- }
- TemplateEngine.createPrecompiled(Path.of(resolverBase.path), contentType)
- }
- }
- else {
- TemplateEngine.create(resolver, contentType)
- }
- override fun render(url: URL, context: Map<String, *>, locale: Locale): String {
- val output: TemplateOutput = StringOutput()
- templateEngine.render(url.path, context, output)
- return output.toString()
- }
- override fun render(
- name: String, templates: Map<String, String>, context: Map<String, *>, locale: Locale
- ): String =
- throw UnsupportedOperationException("jte does not support memory templates")
- }