Skip to content

Commit b36512e

Browse files
authored
SpongeAPI 8 plugin templates (#928)
1 parent 98d3f74 commit b36512e

21 files changed

+730
-28
lines changed

src/main/kotlin/creator/buildsystem/gradle/gradle-steps.kt

Lines changed: 29 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,8 @@ class SimpleGradleSetupStep(
5353
private val project: Project,
5454
private val rootDirectory: Path,
5555
private val buildSystem: BuildSystem,
56-
private val gradleFiles: GradleFiles<String>
56+
private val gradleFiles: GradleFiles<String>,
57+
private val kotlinScript: Boolean = false
5758
) : CreatorStep {
5859

5960
override fun runStep(indicator: ProgressIndicator) {
@@ -66,7 +67,8 @@ class SimpleGradleSetupStep(
6667
DirectorySet.create(rootDirectory)
6768
val (buildGradle, gradleProp, settingsGradle) = setupGradleFiles(
6869
rootDirectory,
69-
gradleFiles
70+
gradleFiles,
71+
kotlinScript
7072
)
7173

7274
val psiManager = PsiManager.getInstance(project)
@@ -97,17 +99,18 @@ class GradleSetupStep(
9799
private val project: Project,
98100
private val rootDirectory: Path,
99101
private val buildSystem: BuildSystem,
100-
private val gradleFiles: GradleFiles<String>
102+
private val gradleFiles: GradleFiles<String>,
103+
private val kotlinScript: Boolean = false
101104
) : CreatorStep {
102105
override fun runStep(indicator: ProgressIndicator) {
103-
val (_, gradleProp, settingsGradle) = setupGradleFiles(rootDirectory, gradleFiles)
106+
val (_, gradleProp, settingsGradle) = setupGradleFiles(rootDirectory, gradleFiles, kotlinScript)
104107

105108
runWriteTask {
106109
if (project.isDisposed) {
107110
return@runWriteTask
108111
}
109112

110-
val buildGradlePsi = addBuildGradleDependencies(project, buildSystem, gradleFiles.buildGradle)
113+
val buildGradlePsi = addBuildGradleDependencies(project, buildSystem, gradleFiles.buildGradle, kotlinScript)
111114
val psiManager = PsiManager.getInstance(project)
112115
psiManager.findDirectory(rootDirectory.virtualFileOrError)?.let { dir ->
113116
dir.findFile(buildGradlePsi.name)?.delete()
@@ -131,11 +134,11 @@ data class GradleFiles<out T>(
131134
val settingsGradle: T?
132135
)
133136

134-
fun setupGradleFiles(dir: Path, givenFiles: GradleFiles<String>): GradleFiles<Path> {
137+
fun setupGradleFiles(dir: Path, givenFiles: GradleFiles<String>, kotlinScript: Boolean = false): GradleFiles<Path> {
135138
return GradleFiles(
136-
dir.resolve("build.gradle"),
139+
dir.resolve(if (kotlinScript) "build.gradle.kts" else "build.gradle"),
137140
givenFiles.gradleProperties?.let { dir.resolve("gradle.properties") },
138-
givenFiles.settingsGradle?.let { dir.resolve("settings.gradle") }
141+
givenFiles.settingsGradle?.let { dir.resolve(if (kotlinScript) "settings.gradle.kts" else "settings.gradle") },
139142
).apply {
140143
Files.deleteIfExists(buildGradle)
141144
Files.createFile(buildGradle)
@@ -144,10 +147,15 @@ fun setupGradleFiles(dir: Path, givenFiles: GradleFiles<String>): GradleFiles<Pa
144147
}
145148
}
146149

147-
fun addBuildGradleDependencies(project: Project, buildSystem: BuildSystem, text: String): PsiFile {
150+
fun addBuildGradleDependencies(
151+
project: Project,
152+
buildSystem: BuildSystem,
153+
text: String,
154+
kotlinScript: Boolean = false
155+
): PsiFile {
148156
val file = PsiFileFactory.getInstance(project).createFileFromText(GroovyLanguage, text)
149157
return file.runWriteAction {
150-
val fileName = "build.gradle"
158+
val fileName = if (kotlinScript) "build.gradle.kts" else "build.gradle"
151159
file.name = fileName
152160

153161
val groovyFile = file as GroovyFile
@@ -211,7 +219,8 @@ private fun getClosableBlockByName(element: PsiElement, name: String) =
211219
class BasicGradleFinalizerStep(
212220
private val module: Module,
213221
private val rootDirectory: Path,
214-
private val buildSystem: BuildSystem
222+
private val buildSystem: BuildSystem,
223+
private vararg val additionalRunTasks: String
215224
) : CreatorStep {
216225
private val project
217226
get() = module.project
@@ -230,10 +239,17 @@ class BasicGradleFinalizerStep(
230239

231240
// Set up the run config
232241
// Get the gradle external task type, this is what sets it as a gradle task
242+
addRunTaskConfiguration("build")
243+
for (tasks in additionalRunTasks) {
244+
addRunTaskConfiguration(tasks)
245+
}
246+
}
247+
248+
private fun addRunTaskConfiguration(task: String) {
233249
val gradleType = GradleExternalTaskConfigurationType.getInstance()
234250

235251
val runManager = RunManager.getInstance(project)
236-
val runConfigName = buildSystem.artifactId + " build"
252+
val runConfigName = buildSystem.artifactId + ' ' + task
237253

238254
val runConfiguration = ExternalSystemRunConfiguration(
239255
GradleConstants.SYSTEM_ID,
@@ -245,7 +261,7 @@ class BasicGradleFinalizerStep(
245261
// Set relevant gradle values
246262
runConfiguration.settings.externalProjectPath = rootDirectory.toAbsolutePath().toString()
247263
runConfiguration.settings.executionName = runConfigName
248-
runConfiguration.settings.taskNames = listOf("build")
264+
runConfiguration.settings.taskNames = listOf(task)
249265

250266
runConfiguration.isAllowRunningInParallel = false
251267

src/main/kotlin/platform/BaseTemplate.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,12 @@ abstract class BaseTemplate {
1717

1818
protected fun Project.applyTemplate(
1919
templateName: String,
20-
properties: Map<String, String>? = null
20+
properties: Map<String, *>? = null
2121
): String {
2222
val manager = FileTemplateManager.getInstance(this)
2323
val template = manager.getJ2eeTemplate(templateName)
2424

25-
val allProperties = manager.defaultProperties
25+
val allProperties = manager.defaultProperties.toMutableMap()
2626
properties?.let { prop -> allProperties.putAll(prop) }
2727

2828
return template.getText(allProperties)
Lines changed: 159 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,159 @@
1+
/*
2+
* Minecraft Dev for IntelliJ
3+
*
4+
* https://minecraftdev.org
5+
*
6+
* Copyright (c) 2021 minecraft-dev
7+
*
8+
* MIT License
9+
*/
10+
11+
package com.demonwav.mcdev.platform.sponge.creator
12+
13+
import com.demonwav.mcdev.creator.BaseProjectCreator
14+
import com.demonwav.mcdev.creator.BasicJavaClassStep
15+
import com.demonwav.mcdev.creator.CreateDirectoriesStep
16+
import com.demonwav.mcdev.creator.CreatorStep
17+
import com.demonwav.mcdev.creator.buildsystem.BuildSystem
18+
import com.demonwav.mcdev.creator.buildsystem.gradle.BasicGradleFinalizerStep
19+
import com.demonwav.mcdev.creator.buildsystem.gradle.GradleBuildSystem
20+
import com.demonwav.mcdev.creator.buildsystem.gradle.GradleFiles
21+
import com.demonwav.mcdev.creator.buildsystem.gradle.GradleGitignoreStep
22+
import com.demonwav.mcdev.creator.buildsystem.gradle.GradleSetupStep
23+
import com.demonwav.mcdev.creator.buildsystem.gradle.GradleWrapperStep
24+
import com.demonwav.mcdev.creator.buildsystem.maven.BasicMavenFinalizerStep
25+
import com.demonwav.mcdev.creator.buildsystem.maven.BasicMavenStep
26+
import com.demonwav.mcdev.creator.buildsystem.maven.CommonModuleDependencyStep
27+
import com.demonwav.mcdev.creator.buildsystem.maven.MavenBuildSystem
28+
import com.demonwav.mcdev.creator.buildsystem.maven.MavenGitignoreStep
29+
import com.intellij.openapi.module.Module
30+
import com.intellij.openapi.progress.ProgressIndicator
31+
import com.intellij.openapi.project.Project
32+
import java.nio.file.Path
33+
34+
sealed class Sponge8ProjectCreator<T : BuildSystem>(
35+
protected val rootDirectory: Path,
36+
protected val rootModule: Module,
37+
protected val buildSystem: T,
38+
protected val config: SpongeProjectConfig
39+
) : BaseProjectCreator(rootModule, buildSystem) {
40+
41+
protected fun setupDependencyStep(): SpongeDependenciesSetup {
42+
val spongeApiVersion = config.spongeApiVersion
43+
return SpongeDependenciesSetup(buildSystem, spongeApiVersion, false)
44+
}
45+
46+
protected fun setupMainClassStep(): BasicJavaClassStep {
47+
return createJavaClassStep(config.mainClass) { packageName, className ->
48+
val pluginId = (buildSystem.parent ?: buildSystem).artifactId
49+
Sponge8Template.applyMainClass(project, pluginId, packageName, className)
50+
}
51+
}
52+
}
53+
54+
class Sponge8MavenCreator(
55+
rootDirectory: Path,
56+
rootModule: Module,
57+
buildSystem: MavenBuildSystem,
58+
config: SpongeProjectConfig
59+
) : Sponge8ProjectCreator<MavenBuildSystem>(rootDirectory, rootModule, buildSystem, config) {
60+
61+
override fun getSingleModuleSteps(): Iterable<CreatorStep> {
62+
val mainClassStep = setupMainClassStep()
63+
val pluginsJsonStep = CreatePluginsJsonStep(project, buildSystem, config)
64+
65+
val pomText = SpongeTemplate.applyPom(project)
66+
67+
return listOf(
68+
setupDependencyStep(),
69+
BasicMavenStep(project, rootDirectory, buildSystem, config, pomText),
70+
mainClassStep,
71+
pluginsJsonStep,
72+
MavenGitignoreStep(project, rootDirectory),
73+
BasicMavenFinalizerStep(rootModule, rootDirectory),
74+
)
75+
}
76+
77+
override fun getMultiModuleSteps(projectBaseDir: Path): Iterable<CreatorStep> {
78+
val depStep = setupDependencyStep()
79+
val commonDepStep = CommonModuleDependencyStep(buildSystem)
80+
val mainClassStep = setupMainClassStep()
81+
val pluginsJsonStep = CreatePluginsJsonStep(project, buildSystem, config)
82+
83+
val pomText = SpongeTemplate.applySubPom(project)
84+
val mavenStep = BasicMavenStep(
85+
project = project,
86+
rootDirectory = rootDirectory,
87+
buildSystem = buildSystem,
88+
config = config,
89+
pomText = pomText,
90+
parts = listOf(
91+
BasicMavenStep.setupDirs(),
92+
BasicMavenStep.setupSubCore(buildSystem.parentOrError.artifactId),
93+
BasicMavenStep.setupSubName(config.type),
94+
BasicMavenStep.setupInfo(),
95+
BasicMavenStep.setupDependencies()
96+
)
97+
)
98+
return listOf(depStep, commonDepStep, mavenStep, mainClassStep, pluginsJsonStep)
99+
}
100+
}
101+
102+
class CreatePluginsJsonStep(
103+
private val project: Project,
104+
private val buildSystem: BuildSystem,
105+
private val config: SpongeProjectConfig
106+
) : CreatorStep {
107+
override fun runStep(indicator: ProgressIndicator) {
108+
val pluginsJsonPath = buildSystem.dirsOrError.resourceDirectory.resolve("META-INF")
109+
val pluginsJsonText = Sponge8Template.applyPluginsJson(project, buildSystem, config)
110+
CreatorStep.writeTextToFile(project, pluginsJsonPath, "plugins.json", pluginsJsonText)
111+
}
112+
}
113+
114+
class Sponge8GradleCreator(
115+
rootDirectory: Path,
116+
rootModule: Module,
117+
buildSystem: GradleBuildSystem,
118+
config: SpongeProjectConfig
119+
) : Sponge8ProjectCreator<GradleBuildSystem>(rootDirectory, rootModule, buildSystem, config) {
120+
121+
override fun getSingleModuleSteps(): Iterable<CreatorStep> {
122+
val mainClassStep = setupMainClassStep()
123+
124+
val buildText = Sponge8Template.applyBuildGradle(
125+
project,
126+
buildSystem,
127+
config
128+
)
129+
val propText = Sponge8Template.applyGradleProp(project)
130+
val settingsText = Sponge8Template.applySettingsGradle(project, buildSystem.artifactId)
131+
val files = GradleFiles(buildText, propText, settingsText)
132+
133+
return listOf(
134+
CreateDirectoriesStep(buildSystem, rootDirectory),
135+
GradleSetupStep(project, rootDirectory, buildSystem, files, true),
136+
mainClassStep,
137+
GradleWrapperStep(project, rootDirectory, buildSystem),
138+
GradleGitignoreStep(project, rootDirectory),
139+
BasicGradleFinalizerStep(rootModule, rootDirectory, buildSystem, "runServer")
140+
)
141+
}
142+
143+
override fun getMultiModuleSteps(projectBaseDir: Path): Iterable<CreatorStep> {
144+
val mainClassStep = setupMainClassStep()
145+
146+
val buildText = Sponge8Template.applySubBuildGradle(
147+
project,
148+
buildSystem,
149+
config
150+
)
151+
val files = GradleFiles(buildText, null, null)
152+
153+
return listOf(
154+
CreateDirectoriesStep(buildSystem, rootDirectory),
155+
GradleSetupStep(project, rootDirectory, buildSystem, files, true),
156+
mainClassStep
157+
)
158+
}
159+
}

0 commit comments

Comments
 (0)