Ethan Diamond
12/30/2019, 5:44 AMpackage com._98point6.lambda.processors
import com._98point6.workflows.common.Workflow
import <http://java.io|java.io>.File
import javax.annotation.processing.AbstractProcessor
import javax.annotation.processing.RoundEnvironment
import javax.annotation.processing.SupportedOptions
import javax.annotation.processing.SupportedSourceVersion
import javax.lang.model.SourceVersion
import javax.lang.model.element.TypeElement
import javax.tools.Diagnostic
import com._98point6.workflows.annotations.Workflow as WorkflowAnnotation
@SupportedSourceVersion(SourceVersion.RELEASE_8)
@SupportedOptions(LambdaWorkflowProcessor.KAPT_KOTLIN_GENERATED_OPTION_NAME)
class LambdaWorkflowProcessor : AbstractProcessor() {
override fun getSupportedAnnotationTypes(): MutableSet<String> {
return mutableSetOf(WorkflowAnnotation::class.java.canonicalName)
}
override fun getSupportedSourceVersion(): SourceVersion {
return SourceVersion.latest()
}
override fun process(set: MutableSet<out TypeElement>?, roundEnvironment: RoundEnvironment?): Boolean { roundEnvironment?.getElementsAnnotatedWith(WorkflowAnnotation::class.java)?.forEach {
val workflow = it as Workflow
val packageName = "com._98point6.lambda.workflows"
val className = "${workflow.type}_${workflow.version.replace(".", "_")}".toUpperCase()
val fileContent = buildClass(className, packageName)
val kaptKotlinGeneratedDir = processingEnv.options[KAPT_KOTLIN_GENERATED_OPTION_NAME]
if (kaptKotlinGeneratedDir?.isEmpty() != true) {
processingEnv.messager.printMessage(Diagnostic.Kind.ERROR, "Can't find the target directory for generated Kotlin files.")
return false
}
val file = File(kaptKotlinGeneratedDir, "$className.kt")
file.writeText(fileContent)
}
return true
}
companion object {
const val KAPT_KOTLIN_GENERATED_OPTION_NAME = "kapt.kotlin.generated"
}
private fun buildClass(className: String, packageName: String): String {
return """
package $packageName
import com._98point6.lambda.workflow.common.Manifest
import com._98point6.workflows.workflows.${className.toLowerCase()}.Workflow
import com._98point6.lambda.workflow.common.base.Lambda as BaseLambda
class $className {
class Lambda : BaseLambda(workflow = Workflow) {
companion object {
@JvmStatic
fun main(args: Array<String>) {
Manifest(Workflow).writeManifest(args[0])
}
}
}
}
""".trimIndent()
}
}