From ed3015bd877a6f126eb34aa2bc0dc5a58da29c9d Mon Sep 17 00:00:00 2001 From: Andreas Fehn <andreas.fehn@tu-dresden.de> Date: Wed, 18 Jul 2018 10:31:08 +0200 Subject: [PATCH] Implement standalone code-only generation --- build.gradle.kts | 10 +++++ src/main/kotlin/fehnomenal/ecore2java/Main.kt | 43 +++++++++++++++++++ ...OnlyCodeGenModelGeneratorAdapterFactory.kt | 24 +++++++++++ 3 files changed, 77 insertions(+) create mode 100644 src/main/kotlin/fehnomenal/ecore2java/Main.kt create mode 100644 src/main/kotlin/fehnomenal/ecore2java/OnlyCodeGenModelGeneratorAdapterFactory.kt diff --git a/build.gradle.kts b/build.gradle.kts index 7c24bc5..d885df1 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -13,6 +13,16 @@ repositories { dependencies { implementation(kotlin("stdlib-jdk8")) + + mapOf( + "common" to "2.12.0", + "ecore" to "2.12.0", + "ecore.xmi" to "2.12.0", + "codegen" to "2.11.0", + "codegen.ecore" to "2.11.0" + ).forEach { artifact, version -> + implementation("org.eclipse.emf:org.eclipse.emf.$artifact:$version") + } } tasks.withType<KotlinCompile> { diff --git a/src/main/kotlin/fehnomenal/ecore2java/Main.kt b/src/main/kotlin/fehnomenal/ecore2java/Main.kt new file mode 100644 index 0000000..b12564c --- /dev/null +++ b/src/main/kotlin/fehnomenal/ecore2java/Main.kt @@ -0,0 +1,43 @@ +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)) +} diff --git a/src/main/kotlin/fehnomenal/ecore2java/OnlyCodeGenModelGeneratorAdapterFactory.kt b/src/main/kotlin/fehnomenal/ecore2java/OnlyCodeGenModelGeneratorAdapterFactory.kt new file mode 100644 index 0000000..22b3555 --- /dev/null +++ b/src/main/kotlin/fehnomenal/ecore2java/OnlyCodeGenModelGeneratorAdapterFactory.kt @@ -0,0 +1,24 @@ +package fehnomenal.ecore2java + +import org.eclipse.emf.codegen.ecore.generator.GeneratorAdapterFactory +import org.eclipse.emf.codegen.ecore.genmodel.GenModel +import org.eclipse.emf.codegen.ecore.genmodel.generator.GenModelGeneratorAdapter +import org.eclipse.emf.codegen.ecore.genmodel.generator.GenModelGeneratorAdapterFactory +import org.eclipse.emf.common.util.Monitor + +class OnlyCodeGenModelGeneratorAdapterFactory : GenModelGeneratorAdapterFactory() { + object Descriptor : GeneratorAdapterFactory.Descriptor { + override fun createAdapterFactory() = OnlyCodeGenModelGeneratorAdapterFactory() + } + + private val onlyCodeGenModelGeneratorAdapter = object : GenModelGeneratorAdapter(this) { + override fun generateModelBuildProperties(genModel: GenModel?, monitor: Monitor?) = Unit + override fun generateModelManifest(genModel: GenModel?, monitor: Monitor?) = Unit + override fun generateModelModule(genModel: GenModel?, monitor: Monitor?) = Unit + override fun generateModelPluginClass(genModel: GenModel?, monitor: Monitor?) = Unit + override fun generateModelPluginProperties(genModel: GenModel?, monitor: Monitor?) = Unit + } + + + override fun createGenModelAdapter() = onlyCodeGenModelGeneratorAdapter +} -- GitLab