diff --git a/build.gradle.kts b/build.gradle.kts index 937a296..4ee4ea8 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -4,6 +4,7 @@ plugins { java `maven-publish` + `java-gradle-plugin` id("com.diffplug.spotless") version "6.12.0" id("org.jetbrains.kotlin.jvm") version "1.8.10" id("org.jlleitschuh.gradle.ktlint") version "11.2.0" @@ -22,9 +23,11 @@ java.sourceCompatibility = JavaVersion.VERSION_17 dependencies { implementation("org.camunda.bpm.model:camunda-bpmn-model:7.18.0") - compileOnly("org.apache.maven.plugin-tools:maven-plugin-annotations:3.7.1") implementation("org.freemarker:freemarker:2.3.32") + implementation("org.slf4j:slf4j-api:2.0.7") dokkaHtmlPlugin("org.jetbrains.dokka:kotlin-as-java-plugin:1.7.20") + testImplementation("org.junit.jupiter:junit-jupiter-api:5.9.2") + testImplementation("org.junit.jupiter:junit-jupiter-engine:5.9.2") } publishing { @@ -58,3 +61,12 @@ configure { ktlint() } } + +gradlePlugin { + plugins { + create("CamundaBpmnDocumentationGenerator") { + id = "info.novatec.cbdg" + implementationClass = "info.novatec.cbdg.plugin.CamundaBpmnDocumentationGenerator" + } + } +} diff --git a/src/main/kotlin/info/novatec/cbdg/plugin/CamundaBpmnDocumentationGenerator.kt b/src/main/kotlin/info/novatec/cbdg/plugin/CamundaBpmnDocumentationGenerator.kt new file mode 100644 index 0000000..39e3c70 --- /dev/null +++ b/src/main/kotlin/info/novatec/cbdg/plugin/CamundaBpmnDocumentationGenerator.kt @@ -0,0 +1,36 @@ +package info.novatec.cbdg.plugin + +import info.novatec.docu.generator.DocuGenerator +import org.gradle.api.Plugin +import org.gradle.api.Project +import org.gradle.api.provider.Property +import org.slf4j.LoggerFactory +import java.io.File + +interface CamundaBpmnDocumentationGeneratorConfiguration { + val templateFile: Property + val camundaBpmnDir: Property + val resultOutputDir: Property + val bpmnDiagramImageDir: Property? +} + +class CamundaBpmnDocumentationGenerator : Plugin { + + override fun apply(project: Project) { + val configuration = project.extensions.create("cbdg", CamundaBpmnDocumentationGeneratorConfiguration::class.java) + configuration.templateFile.convention(project.layout.buildDirectory.file("resources/main/templates/default.ftl").get().asFile) + configuration.camundaBpmnDir.convention(project.layout.buildDirectory.dir("resources/main/bpmn").get().asFile) + configuration.resultOutputDir.convention(project.layout.buildDirectory.dir("cbdg/html").get().asFile) + configuration.bpmnDiagramImageDir?.convention(project.layout.buildDirectory.dir("resources/main/images").get().asFile) + + project.task("generate").doLast { + DocuGenerator.parseAndGenerate( + LoggerFactory.getLogger(CamundaBpmnDocumentationGenerator::class.java), + configuration.templateFile.get(), + configuration.camundaBpmnDir.get(), + configuration.resultOutputDir.get(), + configuration.bpmnDiagramImageDir?.get() + ) + } + } +} diff --git a/src/main/kotlin/info/novatec/docu/generator/DocuGenerator.kt b/src/main/kotlin/info/novatec/docu/generator/DocuGenerator.kt new file mode 100644 index 0000000..1722a0d --- /dev/null +++ b/src/main/kotlin/info/novatec/docu/generator/DocuGenerator.kt @@ -0,0 +1,56 @@ +package info.novatec.docu.generator + +import info.novatec.cbdg.FreeMarkerService +import info.novatec.docu.parser.main.BpmnParser +import org.slf4j.Logger +import java.io.File +import java.io.FileNotFoundException +import java.io.FileOutputStream +import java.nio.file.Files +import java.nio.file.StandardCopyOption +import kotlin.io.path.Path +import kotlin.io.path.createDirectories +import kotlin.io.path.exists + +object DocuGenerator { + + fun parseAndGenerate( + log: Logger, + templateFile: File, + camundaBpmnDir: File, + resultOutputDir: File, + bpmnDiagramImageDir: File? = null + ) { + if (templateFile.name.equals("default.ftl")) { + FileOutputStream(templateFile, false).use { + javaClass.classLoader.getResourceAsStream("templates/default.ftl") + ?.transferTo(it) ?: throw FileNotFoundException("templates/default.ftl don't exist.") + } + } + + camundaBpmnDir.listFiles()?.forEach { + log.info("Generating documentation for file ${it.absolutePath}") + log.info("Using template ${templateFile.absolutePath}") + + val imageSrcPath = Path("${bpmnDiagramImageDir?.absolutePath}/${it.nameWithoutExtension}.png") + val imageTargetPath = Path("${resultOutputDir.absolutePath}/images/${it.nameWithoutExtension}.png") + imageTargetPath.parent.createDirectories() + if (imageSrcPath.exists()) { + Files.copy(imageSrcPath, imageTargetPath, StandardCopyOption.REPLACE_EXISTING) + } + + val bpmnObject = BpmnParser.parseBpmnFile(it, "${it.nameWithoutExtension}.png") + FreeMarkerService.writeTemplate( + bpmnObject, + templateFile.name, + "${resultOutputDir.absolutePath}/${it.nameWithoutExtension}.html" + ) { + setDirectoryForTemplateLoading(templateFile.parentFile) + } + log.info("Output report into path ${resultOutputDir.absolutePath}") + } ?: throw FileNotFoundException("${camundaBpmnDir.absolutePath} don't exist.") + resultOutputDir.listFiles()?.forEach { + log.info("Output: " + it.absolutePath) + } ?: throw FileNotFoundException("${resultOutputDir.absolutePath} don't exist.") + } +} diff --git a/src/test/kotlin/info/novatec/cbdg/plugin/CamundaBpmnDocumentationGeneratorTest.kt b/src/test/kotlin/info/novatec/cbdg/plugin/CamundaBpmnDocumentationGeneratorTest.kt new file mode 100644 index 0000000..7e46f4f --- /dev/null +++ b/src/test/kotlin/info/novatec/cbdg/plugin/CamundaBpmnDocumentationGeneratorTest.kt @@ -0,0 +1,20 @@ +package info.novatec.cbdg.plugin + +import org.gradle.api.Project +import org.gradle.testfixtures.ProjectBuilder +import org.junit.jupiter.api.Assertions.assertNotNull +import org.junit.jupiter.api.Assertions.assertTrue +import org.junit.jupiter.api.Test + +class CamundaBpmnDocumentationGeneratorTest { + + @Test + fun greetingTest() { + val project: Project = ProjectBuilder.builder().build() + + project.getPluginManager().apply("info.novatec.cbdg") + + assertTrue(project.getPluginManager().hasPlugin("info.novatec.cbdg")) + assertNotNull(project.getTasks().getByName("generate")) + } +}