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