From 2f789dd06ebd6bd58e670214a1540266fe608be4 Mon Sep 17 00:00:00 2001 From: Andreas Fehn <andreas.fehn@tu-dresden.de> Date: Fri, 20 Jul 2018 10:37:00 +0200 Subject: [PATCH] Convert to gradle plugin --- build.gradle.kts | 11 ++ settings.gradle | 2 - settings.gradle.kts | 2 + .../kotlin/ecore2java/Ecore2JavaGenerator.kt | 103 ++++++++++++++++++ .../kotlin/ecore2java/Ecore2JavaPlugin.kt | 37 +++++++ .../ecore2java/Ecore2JavaPluginExtension.kt | 11 ++ ...OnlyCodeGenModelGeneratorAdapterFactory.kt | 2 +- src/main/kotlin/fehnomenal/ecore2java/Main.kt | 43 -------- 8 files changed, 165 insertions(+), 46 deletions(-) delete mode 100644 settings.gradle create mode 100644 settings.gradle.kts create mode 100644 src/main/kotlin/ecore2java/Ecore2JavaGenerator.kt create mode 100644 src/main/kotlin/ecore2java/Ecore2JavaPlugin.kt create mode 100644 src/main/kotlin/ecore2java/Ecore2JavaPluginExtension.kt rename src/main/kotlin/{fehnomenal => }/ecore2java/OnlyCodeGenModelGeneratorAdapterFactory.kt (97%) delete mode 100644 src/main/kotlin/fehnomenal/ecore2java/Main.kt diff --git a/build.gradle.kts b/build.gradle.kts index a47a331..dfe17d7 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -2,6 +2,8 @@ import org.jetbrains.kotlin.gradle.tasks.KotlinCompile plugins { kotlin("jvm") version "1.2.51" + `kotlin-dsl` + id("java-gradle-plugin") } repositories { @@ -24,3 +26,12 @@ dependencies { tasks.withType<KotlinCompile> { kotlinOptions.jvmTarget = "1.8" } + +gradlePlugin { + (plugins) { + "ecore2java-plugin" { + id = "ecore2java" + implementationClass = "ecore2java.Ecore2JavaPlugin" + } + } +} diff --git a/settings.gradle b/settings.gradle deleted file mode 100644 index dfc52b2..0000000 --- a/settings.gradle +++ /dev/null @@ -1,2 +0,0 @@ -rootProject.name = 'ecore-to-java' - diff --git a/settings.gradle.kts b/settings.gradle.kts new file mode 100644 index 0000000..55ebbbd --- /dev/null +++ b/settings.gradle.kts @@ -0,0 +1,2 @@ +rootProject.name = "ecore2java-gradle" + diff --git a/src/main/kotlin/ecore2java/Ecore2JavaGenerator.kt b/src/main/kotlin/ecore2java/Ecore2JavaGenerator.kt new file mode 100644 index 0000000..a20760b --- /dev/null +++ b/src/main/kotlin/ecore2java/Ecore2JavaGenerator.kt @@ -0,0 +1,103 @@ +package ecore2java + +import org.eclipse.emf.codegen.ecore.generator.Generator +import org.eclipse.emf.codegen.ecore.genmodel.GenModel +import org.eclipse.emf.codegen.ecore.genmodel.GenModelPackage +import org.eclipse.emf.codegen.ecore.genmodel.generator.GenBaseGeneratorAdapter +import org.eclipse.emf.codegen.merge.java.JControlModel +import org.eclipse.emf.common.util.BasicMonitor +import org.eclipse.emf.common.util.Diagnostic +import org.eclipse.emf.common.util.URI +import org.eclipse.emf.ecore.resource.Resource +import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl +import org.eclipse.emf.ecore.xmi.impl.XMIResourceFactoryImpl +import org.gradle.api.logging.Logger +import java.io.ByteArrayOutputStream +import java.io.File +import java.io.PrintStream + +class Ecore2JavaGenerator(outputDir: File, logger: Logger) { + private val resourceSet = ResourceSetImpl().apply { + uriConverter.uriMap[URI.createURI("platform:/resource/")] = URI.createFileURI(outputDir.absolutePath + File.separator) + } + + private val generator = object : Generator() { + override fun getJControlModel() = JControlModel() + }.apply { + adapterFactoryDescriptorRegistry.addDescriptor(GenModelPackage.eNS_URI, OnlyCodeGenModelGeneratorAdapterFactory.Descriptor) + } + + private val monitor = Monitor(logger) + + init { + GenModelPackage.eINSTANCE + + Resource.Factory.Registry.INSTANCE.extensionToFactoryMap.let { + it["genmodel"] = XMIResourceFactoryImpl() + it["ecore"] = XMIResourceFactoryImpl() + } + } + + fun generate(genModelFile: File) { + var oldErr: PrintStream? = System.err + try { + System.setErr(PrintStream(ByteArrayOutputStream())) + } catch (_: Throwable) { + oldErr = null + } + + try { + val genModel = getGenModel(genModelFile) + generator.input = genModel + generator.generate(genModel, GenBaseGeneratorAdapter.MODEL_PROJECT_TYPE, monitor) + } finally { + if (oldErr != null) { + System.setErr(oldErr) + } + } + } + + private fun getGenModel(file: File): GenModel { + val res = resourceSet.getResource(URI.createFileURI(file.absolutePath), true) + + return (res.contents[0] as GenModel).apply { + modelDirectory = "." + setCanGenerate(true) + } + } + + + private class Monitor(private val logger: Logger) : BasicMonitor() { + override fun beginTask(name: String?, totalWork: Int) { + if (name != null && name.isNotEmpty()) { + log(">>> $name") + } + } + + override fun setTaskName(name: String?) { + if (name != null && name.isNotEmpty()) { + log("<>> $name") + } + } + + override fun subTask(name: String?) { + if (name != null && name.isNotEmpty()) { + log(">> $name") + } + } + + override fun setBlocked(reason: Diagnostic) { + super.setBlocked(reason) + log("#> " + reason.message) + } + + override fun clearBlocked() { + log("=> " + blockedReason.message) + super.clearBlocked() + } + + private fun log(msg: String) { + logger.info(msg) + } + } +} diff --git a/src/main/kotlin/ecore2java/Ecore2JavaPlugin.kt b/src/main/kotlin/ecore2java/Ecore2JavaPlugin.kt new file mode 100644 index 0000000..705f9db --- /dev/null +++ b/src/main/kotlin/ecore2java/Ecore2JavaPlugin.kt @@ -0,0 +1,37 @@ +package ecore2java + +import org.gradle.api.Plugin +import org.gradle.api.Project +import org.gradle.api.plugins.JavaPlugin +import org.gradle.api.plugins.JavaPluginConvention +import org.gradle.kotlin.dsl.get +import org.gradle.kotlin.dsl.task +import org.gradle.kotlin.dsl.withConvention +import java.io.File + +@Suppress("unused") +open class Ecore2JavaPlugin : Plugin<Project> { + override fun apply(project: Project) { + project.pluginManager.apply(JavaPlugin::class.java) + + + val extension = project.extensions.create("ecore2java", Ecore2JavaPluginExtension::class.java, project) + + if (extension.genModels.isPresent) { + project.task("generateEcore") { + extension.genModels.get().forEach { inputs.file(it) } + outputs.dir(extension.outputDir) + + doFirst { + val generator = Ecore2JavaGenerator(File(extension.outputDir), logger) + + extension.genModels.get() + .map(::File) + .forEach(generator::generate) + } + } + + project.withConvention(JavaPluginConvention::class) { sourceSets["main"].java.srcDir(extension.outputDir) } + } + } +} diff --git a/src/main/kotlin/ecore2java/Ecore2JavaPluginExtension.kt b/src/main/kotlin/ecore2java/Ecore2JavaPluginExtension.kt new file mode 100644 index 0000000..adf4b1f --- /dev/null +++ b/src/main/kotlin/ecore2java/Ecore2JavaPluginExtension.kt @@ -0,0 +1,11 @@ +package ecore2java + +import org.gradle.api.Project +import org.gradle.kotlin.dsl.listProperty + +open class Ecore2JavaPluginExtension(project: Project) { + val genModels = project.objects.listProperty<String>() + var outputDir = "${project.buildDir}/generated-src/ecore/java" + + fun genModel(genModelFile: String) = genModels.add(genModelFile) +} diff --git a/src/main/kotlin/fehnomenal/ecore2java/OnlyCodeGenModelGeneratorAdapterFactory.kt b/src/main/kotlin/ecore2java/OnlyCodeGenModelGeneratorAdapterFactory.kt similarity index 97% rename from src/main/kotlin/fehnomenal/ecore2java/OnlyCodeGenModelGeneratorAdapterFactory.kt rename to src/main/kotlin/ecore2java/OnlyCodeGenModelGeneratorAdapterFactory.kt index 22b3555..7527a3d 100644 --- a/src/main/kotlin/fehnomenal/ecore2java/OnlyCodeGenModelGeneratorAdapterFactory.kt +++ b/src/main/kotlin/ecore2java/OnlyCodeGenModelGeneratorAdapterFactory.kt @@ -1,4 +1,4 @@ -package fehnomenal.ecore2java +package ecore2java import org.eclipse.emf.codegen.ecore.generator.GeneratorAdapterFactory import org.eclipse.emf.codegen.ecore.genmodel.GenModel diff --git a/src/main/kotlin/fehnomenal/ecore2java/Main.kt b/src/main/kotlin/fehnomenal/ecore2java/Main.kt deleted file mode 100644 index b12564c..0000000 --- a/src/main/kotlin/fehnomenal/ecore2java/Main.kt +++ /dev/null @@ -1,43 +0,0 @@ -package fehnomenal.ecore2java - -import org.eclipse.emf.codegen.ecore.generator.Generator -import org.eclipse.emf.codegen.ecore.genmodel.GenModel -import org.eclipse.emf.codegen.ecore.genmodel.GenModelPackage -import org.eclipse.emf.codegen.ecore.genmodel.generator.GenBaseGeneratorAdapter -import org.eclipse.emf.codegen.merge.java.JControlModel -import org.eclipse.emf.common.util.BasicMonitor -import org.eclipse.emf.common.util.URI -import org.eclipse.emf.ecore.resource.Resource -import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl -import org.eclipse.emf.ecore.xmi.impl.XMIResourceFactoryImpl -import java.io.File - -fun main(args: Array<String>) { - GenModelPackage.eINSTANCE - - Resource.Factory.Registry.INSTANCE.extensionToFactoryMap.let { - it["genmodel"] = XMIResourceFactoryImpl() - it["ecore"] = XMIResourceFactoryImpl() - } - - generate(File(args[0]), File(args[1])) -} - -private fun generate(genModelFile: File, targetFolder: File) { - val genModel = ResourceSetImpl().run { - uriConverter.uriMap[URI.createURI("platform:/resource/")] = URI.createFileURI(targetFolder.absolutePath + File.separator) - - val rs = getResource(URI.createFileURI(genModelFile.absolutePath), true) - (rs.contents[0] as GenModel).apply { - modelDirectory = "." - setCanGenerate(true) - } - } - - val generator = object : Generator() { - override fun getJControlModel() = JControlModel() - } - generator.adapterFactoryDescriptorRegistry.addDescriptor(GenModelPackage.eNS_URI, OnlyCodeGenModelGeneratorAdapterFactory.Descriptor) - generator.input = genModel - generator.generate(genModel, GenBaseGeneratorAdapter.MODEL_PROJECT_TYPE, BasicMonitor.Printing(System.out)) -} -- GitLab