@@ -18,30 +18,31 @@ package org.modelix.model.sync.bulk.gradle
18
18
19
19
import org.gradle.api.Plugin
20
20
import org.gradle.api.Project
21
- import org.gradle.api.tasks.Sync
21
+ import org.gradle.api.artifacts.Configuration
22
22
import org.gradle.api.tasks.TaskProvider
23
+ import org.modelix.buildtools.runner.MPSRunnerConfig
24
+ import org.modelix.gradle.mpsbuild.MPSBuildPlugin
23
25
import org.modelix.model.sync.bulk.gradle.config.LocalSource
24
26
import org.modelix.model.sync.bulk.gradle.config.LocalTarget
25
27
import org.modelix.model.sync.bulk.gradle.config.ModelSyncGradleSettings
26
28
import org.modelix.model.sync.bulk.gradle.config.ServerSource
27
29
import org.modelix.model.sync.bulk.gradle.config.ServerTarget
28
30
import org.modelix.model.sync.bulk.gradle.config.SyncDirection
29
31
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
32
32
import org.modelix.model.sync.bulk.gradle.tasks.ImportIntoModelServer
33
- import org.modelix.model.sync.bulk.gradle.tasks.ImportIntoMps
34
33
import org.modelix.model.sync.bulk.gradle.tasks.ValidateSyncSettings
35
34
import java.io.File
36
35
import java.util.Properties
37
36
38
37
class ModelSyncGradlePlugin : Plugin <Project > {
39
38
40
39
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
43
42
44
43
override fun apply (project : Project ) {
44
+ mpsBuildPlugin = project.plugins.apply (MPSBuildPlugin ::class .java)
45
+
45
46
settings = project.extensions.create(" modelSync" , ModelSyncGradleSettings ::class .java)
46
47
getBaseDir(project).mkdirs()
47
48
@@ -55,25 +56,15 @@ class ModelSyncGradlePlugin : Plugin<Project> {
55
56
}
56
57
val modelixCoreVersion = readModelixCoreVersion()
57
58
? : 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" )
60
59
61
- val mpsDependencies = project.configurations.create(" modelSyncMpsDependencies" )
60
+ mpsDependencies = project.configurations.create(" modelSyncMpsDependencies" )
62
61
project.dependencies.add(
63
62
mpsDependencies.name,
64
- " org.modelix.mps :bulk-model-sync-solution :$modelixCoreVersion " ,
63
+ " org.modelix:bulk-model-sync-mps :$modelixCoreVersion " ,
65
64
)
66
65
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
-
75
66
settings.syncDirections.forEach {
76
- registerTasksForSyncDirection(it, project, copyMpsDependencies )
67
+ registerTasksForSyncDirection(it, project, validateSyncSettings )
77
68
}
78
69
}
79
70
}
@@ -126,39 +117,30 @@ class ModelSyncGradlePlugin : Plugin<Project> {
126
117
jsonDir : File ,
127
118
): TaskProvider <* > {
128
119
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
+ }
156
141
}
157
- return exportFromMps
158
142
}
159
143
160
- private fun Project.getAntDependencies () = configurations.getByName(antDependenciesConfigName)
161
-
162
144
private fun registerTasksForServerTarget (
163
145
syncDirection : SyncDirection ,
164
146
project : Project ,
@@ -197,36 +179,28 @@ class ModelSyncGradlePlugin : Plugin<Project> {
197
179
}
198
180
199
181
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
-
221
182
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
+ }
230
204
}
231
205
232
206
project.tasks.register(" runSync${syncDirection.name.replaceFirstChar { it.uppercaseChar() }} " ) {
0 commit comments