org.jetbrains.kotlin.gradle.plugin.mpp.GenerateProjectStructureMetadata.kt Maven / Gradle / Ivy
/*
* Copyright 2010-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license
* that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.gradle.plugin.mpp
import org.gradle.api.DefaultTask
import org.gradle.api.tasks.Internal
import org.gradle.api.tasks.Nested
import org.gradle.api.tasks.OutputFile
import org.gradle.api.tasks.TaskAction
import java.io.File
import javax.xml.transform.OutputKeys
import javax.xml.transform.TransformerFactory
import javax.xml.transform.dom.DOMSource
import javax.xml.transform.stream.StreamResult
open class GenerateProjectStructureMetadata : DefaultTask() {
@get:Internal
internal lateinit var lazyKotlinProjectStructureMetadata: Lazy
@get:Nested
internal val kotlinProjectStructureMetadata: KotlinProjectStructureMetadata
get() = lazyKotlinProjectStructureMetadata.value
@get:OutputFile
val resultXmlFile: File
get() = project.buildDir.resolve("kotlinProjectStructureMetadata/$MULTIPLATFORM_PROJECT_METADATA_FILE_NAME")
@TaskAction
fun generateMetadataXml() {
resultXmlFile.parentFile.mkdirs()
val document = kotlinProjectStructureMetadata.toXmlDocument()
TransformerFactory.newInstance().newTransformer().apply {
setOutputProperty(OutputKeys.INDENT, "yes")
setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "4")
}.transform(DOMSource(document), StreamResult(resultXmlFile))
}
}
internal const val MULTIPLATFORM_PROJECT_METADATA_FILE_NAME = "kotlin-project-structure-metadata.xml"