Xml.kt

  1. package com.hexagontk.serialization.jackson.xml

  2. import com.fasterxml.jackson.databind.DeserializationFeature.*
  3. import com.fasterxml.jackson.databind.ObjectMapper
  4. import com.fasterxml.jackson.databind.ObjectWriter
  5. import com.fasterxml.jackson.databind.SerializationFeature.FAIL_ON_EMPTY_BEANS
  6. import com.fasterxml.jackson.databind.SerializationFeature.INDENT_OUTPUT
  7. import com.fasterxml.jackson.dataformat.xml.JacksonXmlModule
  8. import com.fasterxml.jackson.dataformat.xml.XmlMapper
  9. import com.fasterxml.jackson.dataformat.xml.util.DefaultXmlPrettyPrinter
  10. import com.hexagontk.core.media.APPLICATION_XML
  11. import com.hexagontk.core.media.MediaType
  12. import com.hexagontk.serialization.SerializationFormat
  13. import com.hexagontk.serialization.jackson.JacksonHelper.mapNode
  14. import java.io.InputStream
  15. import java.io.OutputStream

  16. // TODO Implement with Java XML support (Jackson is not the best option here)
  17. object Xml : SerializationFormat {

  18.     private val mapper: ObjectMapper = XmlMapper(JacksonXmlModule())
  19.         .configure(INDENT_OUTPUT, true)
  20.         .configure(FAIL_ON_UNKNOWN_PROPERTIES, false)
  21.         .configure(FAIL_ON_EMPTY_BEANS, false)
  22.         .configure(FAIL_ON_MISSING_CREATOR_PROPERTIES, false)
  23.         .configure(ACCEPT_SINGLE_VALUE_AS_ARRAY, true)

  24.     override val mediaType: MediaType = APPLICATION_XML
  25.     override val textFormat: Boolean = true

  26.     private val writer = createObjectWriter()

  27.     private fun createObjectWriter(): ObjectWriter =
  28.         mapper.writer(DefaultXmlPrettyPrinter())

  29.     override fun serialize(instance: Any, output: OutputStream) =
  30.         writer.writeValue(output, instance)

  31.     override fun serialize(instance: Any): String =
  32.         writer.writeValueAsString(instance)

  33.     override fun parse(input: InputStream): Any =
  34.         mapNode(mapper.readTree(input))
  35. }