Skip to content

Commit dfbfdca

Browse files
authored
Merge pull request #312 from modelix/MODELIX-542
MODELIX-542 Deduplicate GenerateAntScriptForMps
2 parents 9c398dc + 4a51089 commit dfbfdca

File tree

17 files changed

+276
-363
lines changed

17 files changed

+276
-363
lines changed

bulk-model-sync-gradle-test/build.gradle.kts

Lines changed: 7 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -14,16 +14,6 @@
1414
* limitations under the License.
1515
*/
1616

17-
import org.modelix.model.server.Main
18-
19-
buildscript {
20-
val modelixCoreVersion: String = file("../version.txt").readText()
21-
dependencies {
22-
classpath("org.modelix:model-server:$modelixCoreVersion")
23-
classpath("org.modelix:graph-lang-api:$modelixCoreVersion")
24-
}
25-
}
26-
2717
plugins {
2818
alias(libs.plugins.kotlin.jvm)
2919
id("org.modelix.bulk-model-sync")
@@ -41,12 +31,9 @@ repositories {
4131
maven { url = uri("https://artifacts.itemis.cloud/repository/maven-mps/") }
4232
}
4333

44-
val mps by configurations.creating
45-
val mpsDir = project.layout.buildDirectory.dir("mps").get().asFile.apply { mkdirs() }
4634
val kotlinGenDir = project.layout.buildDirectory.dir("metamodel/kotlin").get().asFile.apply { mkdirs() }
4735

4836
dependencies {
49-
mps("com.jetbrains:mps:2021.2.5")
5037
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.2")
5138
implementation("org.modelix:model-server:$modelixCoreVersion")
5239
implementation("org.modelix:model-api-gen-runtime:$modelixCoreVersion")
@@ -74,12 +61,7 @@ tasks.register("runModelServer", JavaExec::class) {
7461

7562
classpath = sourceSets["main"].runtimeClasspath
7663
mainClass.set("org.modelix.model.server.Main")
77-
args("-inmemory")
78-
}
79-
80-
val resolveMps by tasks.registering(Copy::class) {
81-
from(mps.resolve().map { zipTree(it) })
82-
into(mpsDir)
64+
args("-inmemory", "-port", "28309")
8365
}
8466

8567
val repoDir = project.layout.buildDirectory.dir("test-repo").get().asFile
@@ -89,32 +71,32 @@ val copyTestRepo by tasks.registering(Sync::class) {
8971
into(repoDir)
9072
}
9173

74+
mpsBuild {
75+
mpsVersion("2021.2.5")
76+
}
77+
9278
modelSync {
93-
dependsOn(resolveMps)
9479
dependsOn(copyTestRepo)
9580
direction("testPush") {
96-
org.modelix.model.sync.bulk.gradle.test.GraphLanguagesHelper.registerAll()
9781
includeModule("GraphSolution")
9882
fromLocal {
99-
mpsHome = mpsDir
10083
mpsHeapSize = "2g"
10184
repositoryDir = repoDir
10285
}
10386
toModelServer {
104-
url = "http://0.0.0.0:${Main.DEFAULT_PORT}/v2"
87+
url = "http://0.0.0.0:28309/v2"
10588
repositoryId = "ci-test"
10689
branchName = "master"
10790
}
10891
}
10992
direction("testPull") {
11093
includeModule("GraphSolution")
11194
fromModelServer {
112-
url = "http://0.0.0.0:${Main.DEFAULT_PORT}/v2"
95+
url = "http://0.0.0.0:28309/v2"
11396
repositoryId = "ci-test"
11497
branchName = "master"
11598
}
11699
toLocal {
117-
mpsHome = mpsDir
118100
repositoryDir = repoDir
119101
}
120102
}

bulk-model-sync-gradle-test/ci.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ if [ "${CI}" = "true" ]; then
2828
sleep 10
2929
fi
3030

31-
curl -X POST http://127.0.0.1:28101/v2/repositories/ci-test/init
31+
curl -X POST http://127.0.0.1:28309/v2/repositories/ci-test/init
3232

3333
./gradlew runSyncTestPush --console=plain --stacktrace
3434
./gradlew test --tests 'PushTest'

bulk-model-sync-gradle-test/graph-lang-api/build.gradle.kts

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -32,11 +32,6 @@ val resolveMps by tasks.registering(Copy::class) {
3232

3333
val repoDir = projectDir.resolve("test-repo")
3434

35-
val copyMetamodelToMpsHome by tasks.registering(Copy::class) {
36-
from(file(projectDir.resolve("../test-repo/languages")))
37-
into(file(mpsDir.resolve("languages").apply { mkdirs() }))
38-
}
39-
4035
kotlin {
4136
sourceSets.named("main") {
4237
kotlin.srcDir(kotlinGenDir)
@@ -45,9 +40,9 @@ kotlin {
4540

4641
metamodel {
4742
dependsOn(resolveMps)
48-
dependsOn(copyMetamodelToMpsHome)
4943
mpsHome = mpsDir
5044
kotlinDir = kotlinGenDir
45+
modulesFrom(projectDir.parentFile.resolve("test-repo"))
5146
includeLanguage("GraphLang")
5247
registrationHelperName = "org.modelix.model.sync.bulk.gradle.test.GraphLanguagesHelper"
5348
}

bulk-model-sync-gradle-test/src/test/kotlin/org/modelix/model/sync/bulk/gradle/test/PushTest.kt

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@ import org.modelix.model.data.ModelData
2222
import org.modelix.model.data.NodeData
2323
import org.modelix.model.lazy.BranchReference
2424
import org.modelix.model.lazy.RepositoryId
25-
import org.modelix.model.server.Main
2625
import org.modelix.model.sync.bulk.asExported
2726
import java.io.File
2827
import kotlin.test.assertContentEquals
@@ -32,7 +31,7 @@ class PushTest {
3231
@Test
3332
fun `nodes were synced to server`() {
3433
val inputDir = File("build/model-sync/testPush")
35-
val files = inputDir.listFiles()?.filter { it.extension == "json" } ?: error("no json files found")
34+
val files = inputDir.listFiles()?.filter { it.extension == "json" } ?: error("no json files found in ${inputDir.absolutePath}")
3635

3736
val modules = files.map { ModelData.fromJson(it.readText()) }
3837
val inputModel = ModelData(root = NodeData(children = modules.map { it.root }))
@@ -42,7 +41,7 @@ class PushTest {
4241

4342
val repoId = RepositoryId("ci-test")
4443
val branchName = "master"
45-
val url = "http://0.0.0.0:${Main.DEFAULT_PORT}/v2"
44+
val url = "http://0.0.0.0:28309/v2"
4645

4746
val branchRef = ModelFacade.createBranchReference(repoId, branchName)
4847
val client = ModelClientV2PlatformSpecificBuilder().url(url).build().apply { runBlocking { init() } }

bulk-model-sync-gradle/build.gradle.kts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@ dependencies {
1212
implementation(project(":model-client", "jvmRuntimeElements"))
1313
implementation(project(":bulk-model-sync-lib"))
1414
implementation(project(":mps-model-adapters"))
15+
implementation(libs.modelix.buildtools.gradle)
16+
implementation(libs.modelix.buildtools.lib)
1517
implementation(libs.ktor.client.core)
1618
implementation(libs.ktor.client.cio)
1719
}

bulk-model-sync-gradle/src/main/kotlin/org/modelix/model/sync/bulk/gradle/ModelSyncGradlePlugin.kt

Lines changed: 52 additions & 78 deletions
Original file line numberDiff line numberDiff line change
@@ -18,30 +18,31 @@ package org.modelix.model.sync.bulk.gradle
1818

1919
import org.gradle.api.Plugin
2020
import org.gradle.api.Project
21-
import org.gradle.api.tasks.Sync
21+
import org.gradle.api.artifacts.Configuration
2222
import org.gradle.api.tasks.TaskProvider
23+
import org.modelix.buildtools.runner.MPSRunnerConfig
24+
import org.modelix.gradle.mpsbuild.MPSBuildPlugin
2325
import org.modelix.model.sync.bulk.gradle.config.LocalSource
2426
import org.modelix.model.sync.bulk.gradle.config.LocalTarget
2527
import org.modelix.model.sync.bulk.gradle.config.ModelSyncGradleSettings
2628
import org.modelix.model.sync.bulk.gradle.config.ServerSource
2729
import org.modelix.model.sync.bulk.gradle.config.ServerTarget
2830
import org.modelix.model.sync.bulk.gradle.config.SyncDirection
2931
import org.modelix.model.sync.bulk.gradle.tasks.ExportFromModelServer
30-
import org.modelix.model.sync.bulk.gradle.tasks.ExportFromMps
31-
import org.modelix.model.sync.bulk.gradle.tasks.GenerateAntScriptForMps
3232
import org.modelix.model.sync.bulk.gradle.tasks.ImportIntoModelServer
33-
import org.modelix.model.sync.bulk.gradle.tasks.ImportIntoMps
3433
import org.modelix.model.sync.bulk.gradle.tasks.ValidateSyncSettings
3534
import java.io.File
3635
import java.util.Properties
3736

3837
class ModelSyncGradlePlugin : Plugin<Project> {
3938

4039
private lateinit var settings: ModelSyncGradleSettings
41-
42-
private val antDependenciesConfigName = "model-sync-ant-dependencies"
40+
private lateinit var mpsBuildPlugin: MPSBuildPlugin
41+
private lateinit var mpsDependencies: Configuration
4342

4443
override fun apply(project: Project) {
44+
mpsBuildPlugin = project.plugins.apply(MPSBuildPlugin::class.java)
45+
4546
settings = project.extensions.create("modelSync", ModelSyncGradleSettings::class.java)
4647
getBaseDir(project).mkdirs()
4748

@@ -55,25 +56,15 @@ class ModelSyncGradlePlugin : Plugin<Project> {
5556
}
5657
val modelixCoreVersion = readModelixCoreVersion()
5758
?: throw RuntimeException("modelix.core version not found. Try running the writeVersionFile task.")
58-
val antDependencies = project.configurations.create(antDependenciesConfigName)
59-
project.dependencies.add(antDependencies.name, "org.apache.ant:ant-junit:1.10.12")
6059

61-
val mpsDependencies = project.configurations.create("modelSyncMpsDependencies")
60+
mpsDependencies = project.configurations.create("modelSyncMpsDependencies")
6261
project.dependencies.add(
6362
mpsDependencies.name,
64-
"org.modelix.mps:bulk-model-sync-solution:$modelixCoreVersion",
63+
"org.modelix:bulk-model-sync-mps:$modelixCoreVersion",
6564
)
6665

67-
val copyMpsDependencies = project.tasks.register("copyMpsDependencies", Sync::class.java) { sync ->
68-
sync.dependsOn(validateSyncSettings)
69-
val src = mpsDependencies.resolve().map { project.zipTree(it) }
70-
val target = getDependenciesDir(project).apply { mkdirs() }
71-
sync.from(src)
72-
sync.into(target)
73-
}
74-
7566
settings.syncDirections.forEach {
76-
registerTasksForSyncDirection(it, project, copyMpsDependencies)
67+
registerTasksForSyncDirection(it, project, validateSyncSettings)
7768
}
7869
}
7970
}
@@ -126,39 +117,30 @@ class ModelSyncGradlePlugin : Plugin<Project> {
126117
jsonDir: File,
127118
): TaskProvider<*> {
128119
val localSource = syncDirection.source as LocalSource
129-
val antScript = jsonDir.resolve("build.xml")
130-
val generateAntScript = project.tasks.register(
131-
"${syncDirection.name}GenerateAntScriptForExport",
132-
GenerateAntScriptForMps::class.java,
133-
) {
134-
it.dependsOn(previousTask)
135-
it.mpsHomePath.set(localSource.mpsHome?.absolutePath)
136-
it.mpsHeapSize.set(localSource.mpsHeapSize)
137-
it.repositoryPath.set(localSource.repositoryDir?.absolutePath)
138-
it.antScriptFile.set(antScript)
139-
it.mpsDependenciesPath.set(getDependenciesDir(project).absolutePath)
140-
it.jsonDirPath.set(jsonDir.absolutePath)
141-
it.exportFlag.set(true)
142-
it.includedModules.set(syncDirection.includedModules)
143-
it.includedModulePrefixes.set(syncDirection.includedModulePrefixes)
144-
it.debugPort.set(localSource.mpsDebugPort)
145-
}
146-
147-
val exportFromMps = project.tasks.register("${syncDirection.name}ExportFromMps", ExportFromMps::class.java) {
148-
it.dependsOn(generateAntScript)
149-
it.outputs.cacheIf { false }
150-
it.workingDir = jsonDir
151-
it.classpath = project.getAntDependencies()
152-
it.mainClass.set("org.apache.tools.ant.launch.Launcher")
153-
it.mpsHome.set(localSource.mpsHome)
154-
it.antScript.set(antScript)
155-
it.jsonDir.set(jsonDir)
120+
val resolvedDependencies = mpsDependencies.resolvedConfiguration.files
121+
val config = MPSRunnerConfig(
122+
mainClassName = "org.modelix.mps.model.sync.bulk.MPSBulkSynchronizer",
123+
mainMethodName = "exportRepository",
124+
classPathElements = resolvedDependencies.toList(),
125+
mpsHome = localSource.mpsHome,
126+
workDir = jsonDir,
127+
additionalModuleDirs = localSource.mpsLibraries.toList() + listOfNotNull(localSource.repositoryDir),
128+
jvmArgs = listOfNotNull(
129+
"-Dmodelix.mps.model.sync.bulk.output.path=${jsonDir.absolutePath}",
130+
"-Dmodelix.mps.model.sync.bulk.output.modules=${syncDirection.includedModules.joinToString(",")}",
131+
"-Dmodelix.mps.model.sync.bulk.output.modules.prefixes=${syncDirection.includedModulePrefixes.joinToString(",")}",
132+
"-Dmodelix.mps.model.sync.bulk.repo.path=${localSource.repositoryDir?.absolutePath}",
133+
"-Xmx${localSource.mpsHeapSize}",
134+
localSource.mpsDebugPort?.let { "-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=$it" },
135+
),
136+
)
137+
return mpsBuildPlugin.createRunMPSTask("${syncDirection.name}ExportFromMps", config, arrayOf(previousTask)).also {
138+
it.configure { task ->
139+
task.outputs.dir(jsonDir)
140+
}
156141
}
157-
return exportFromMps
158142
}
159143

160-
private fun Project.getAntDependencies() = configurations.getByName(antDependenciesConfigName)
161-
162144
private fun registerTasksForServerTarget(
163145
syncDirection: SyncDirection,
164146
project: Project,
@@ -197,36 +179,28 @@ class ModelSyncGradlePlugin : Plugin<Project> {
197179
}
198180

199181
val localTarget = syncDirection.target as LocalTarget
200-
201-
val antScript = jsonDir.resolve("build.xml")
202-
203-
val antDependencies = project.configurations.create("model-import-ant-dependencies")
204-
project.dependencies.add(antDependencies.name, "org.apache.ant:ant-junit:1.10.12")
205-
206-
val generateAntScriptName = "${syncDirection.name}GenerateAntScriptForImport"
207-
val generateAntScript = project.tasks.register(generateAntScriptName, GenerateAntScriptForMps::class.java) {
208-
it.dependsOn(previousTask)
209-
it.mpsHomePath.set(localTarget.mpsHome?.absolutePath)
210-
it.mpsHeapSize.set(localTarget.mpsHeapSize)
211-
it.repositoryPath.set(localTarget.repositoryDir?.absolutePath)
212-
it.antScriptFile.set(antScript)
213-
it.mpsDependenciesPath.set(getDependenciesDir(project).absolutePath)
214-
it.jsonDirPath.set(jsonDir.absolutePath)
215-
it.exportFlag.set(false)
216-
it.includedModules.set(syncDirection.includedModules)
217-
it.includedModulePrefixes.set(syncDirection.includedModulePrefixes)
218-
it.debugPort.set(localTarget.mpsDebugPort)
219-
}
220-
221182
val importName = "${syncDirection.name}ImportIntoMps"
222-
val importIntoMps = project.tasks.register(importName, ImportIntoMps::class.java) {
223-
it.dependsOn(generateAntScript)
224-
it.workingDir = jsonDir
225-
it.classpath = project.getAntDependencies()
226-
it.mainClass.set("org.apache.tools.ant.launch.Launcher")
227-
it.jsonDir.set(jsonDir)
228-
it.antScript.set(jsonDir.resolve("build.xml"))
229-
it.mpsHome.set(localTarget.mpsHome)
183+
val resolvedDependencies = mpsDependencies.resolvedConfiguration.files
184+
val config = MPSRunnerConfig(
185+
mainClassName = "org.modelix.mps.model.sync.bulk.MPSBulkSynchronizer",
186+
mainMethodName = "importRepository",
187+
classPathElements = resolvedDependencies.toList(),
188+
mpsHome = localTarget.mpsHome,
189+
workDir = jsonDir,
190+
additionalModuleDirs = localTarget.mpsLibraries.toList() + listOfNotNull(localTarget.repositoryDir),
191+
jvmArgs = listOfNotNull(
192+
"-Dmodelix.mps.model.sync.bulk.input.path=${jsonDir.absolutePath}",
193+
"-Dmodelix.mps.model.sync.bulk.input.modules=${syncDirection.includedModules.joinToString(",")}",
194+
"-Dmodelix.mps.model.sync.bulk.input.modules.prefixes=${syncDirection.includedModulePrefixes.joinToString(",")}",
195+
"-Dmodelix.mps.model.sync.bulk.repo.path=${localTarget.repositoryDir?.absolutePath}",
196+
"-Xmx${localTarget.mpsHeapSize}",
197+
localTarget.mpsDebugPort?.let { "-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=$it" },
198+
),
199+
)
200+
val importIntoMps = mpsBuildPlugin.createRunMPSTask(importName, config, arrayOf(previousTask)).also {
201+
it.configure { task ->
202+
task.inputs.dir(jsonDir)
203+
}
230204
}
231205

232206
project.tasks.register("runSync${syncDirection.name.replaceFirstChar { it.uppercaseChar() }}") {

bulk-model-sync-gradle/src/main/kotlin/org/modelix/model/sync/bulk/gradle/config/ModelSyncGradleSettings.kt

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -95,11 +95,10 @@ sealed interface LocalEndpoint : SyncEndpoint {
9595
var repositoryDir: File?
9696
var mpsDebugPort: Int?
9797

98+
fun mpsLibrary(folder: File)
99+
98100
override fun getValidationErrors(): List<String> {
99101
val errors = mutableListOf<String>()
100-
if (mpsHome == null) {
101-
errors.addUndefinedLocalFieldError("mpsHome")
102-
}
103102
if (repositoryDir == null) {
104103
errors.addUndefinedLocalFieldError("repositoryDir")
105104
}
@@ -109,17 +108,27 @@ sealed interface LocalEndpoint : SyncEndpoint {
109108

110109
data class LocalSource(
111110
override var mpsHome: File? = null,
111+
internal var mpsLibraries: Set<File> = emptySet(),
112112
override var mpsHeapSize: String = "2g",
113113
override var repositoryDir: File? = null,
114114
override var mpsDebugPort: Int? = null,
115-
) : LocalEndpoint
115+
) : LocalEndpoint {
116+
override fun mpsLibrary(folder: File) {
117+
mpsLibraries += folder
118+
}
119+
}
116120

117121
data class LocalTarget(
118122
override var mpsHome: File? = null,
123+
internal var mpsLibraries: Set<File> = emptySet(),
119124
override var mpsHeapSize: String = "2g",
120125
override var repositoryDir: File? = null,
121126
override var mpsDebugPort: Int? = null,
122-
) : LocalEndpoint
127+
) : LocalEndpoint {
128+
override fun mpsLibrary(folder: File) {
129+
mpsLibraries += folder
130+
}
131+
}
123132

124133
sealed interface ServerEndpoint : SyncEndpoint {
125134
var url: String?

0 commit comments

Comments
 (0)