JteAdapter.kt

  1. package com.hexagonkt.templates.jte

  2. import com.hexagonkt.core.media.MediaType
  3. import com.hexagonkt.core.media.TEXT_HTML
  4. import com.hexagonkt.core.media.TEXT_PLAIN
  5. import com.hexagonkt.templates.TemplatePort
  6. import gg.jte.CodeResolver
  7. import gg.jte.ContentType
  8. import gg.jte.TemplateEngine
  9. import gg.jte.TemplateOutput
  10. import gg.jte.output.StringOutput
  11. import gg.jte.resolve.DirectoryCodeResolver
  12. import gg.jte.resolve.ResourceCodeResolver
  13. import java.net.URL
  14. import java.nio.file.Path
  15. import java.util.*

  16. class JteAdapter(
  17.     mediaType: MediaType,
  18.     resolverBase: URL? = null,
  19.     precompiled: Boolean = false
  20. ) : TemplatePort {

  21.     private companion object {
  22.         val allowedTypes: String = setOf(TEXT_HTML, TEXT_PLAIN).joinToString(", ") { it.fullType }
  23.     }

  24.     private val contentType = when (mediaType) {
  25.         TEXT_HTML -> ContentType.Html
  26.         TEXT_PLAIN -> ContentType.Plain
  27.         else ->
  28.             error("Unsupported media type not in: $allowedTypes (${mediaType.fullType})")
  29.     }

  30.     private val resolver: CodeResolver =
  31.         when (resolverBase?.protocol) {
  32.             "classpath" -> ResourceCodeResolver(resolverBase.path)
  33.             "file" -> DirectoryCodeResolver(Path.of(resolverBase.path))
  34.             null -> ResourceCodeResolver("")
  35.             else -> error("Invalid base schema not in: classpath, file (${resolverBase.protocol})")
  36.         }

  37.     private val templateEngine: TemplateEngine =
  38.         if (precompiled) {
  39.             if (resolverBase === null) {
  40.                 TemplateEngine.createPrecompiled(contentType)
  41.             }
  42.             else {
  43.                 val protocol = resolverBase.protocol
  44.                 check(protocol == "classpath") {
  45.                     "Precompiled base must be classpath URLs ($protocol)"
  46.                 }
  47.                 TemplateEngine.createPrecompiled(Path.of(resolverBase.path), contentType)
  48.             }
  49.         }
  50.         else {
  51.             TemplateEngine.create(resolver, contentType)
  52.         }

  53.     override fun render(url: URL, context: Map<String, *>, locale: Locale): String {
  54.         val output: TemplateOutput = StringOutput()
  55.         templateEngine.render(url.path, context, output)
  56.         return output.toString()
  57.     }

  58.     override fun render(
  59.         name: String, templates: Map<String, String>, context: Map<String, *>, locale: Locale
  60.     ): String =
  61.         throw UnsupportedOperationException("jte does not support memory templates")
  62. }