diff --git a/surf-api-gradle-plugin/build.gradle.kts b/surf-api-gradle-plugin/build.gradle.kts index 708be82d0..91109f6c0 100644 --- a/surf-api-gradle-plugin/build.gradle.kts +++ b/surf-api-gradle-plugin/build.gradle.kts @@ -21,7 +21,7 @@ plugins { group = groupId version = buildString { append(mcVersion) - append("-1.11.8") + append("-1.12.0") if (snapshot) append("-SNAPSHOT") } diff --git a/surf-api-gradle-plugin/src/main/kotlin/dev/slne/surf/surfapi/gradle/generators/GeneratePluginFile.kt b/surf-api-gradle-plugin/src/main/kotlin/dev/slne/surf/surfapi/gradle/generators/GeneratePluginFile.kt index a57d1d73f..8d83854e6 100644 --- a/surf-api-gradle-plugin/src/main/kotlin/dev/slne/surf/surfapi/gradle/generators/GeneratePluginFile.kt +++ b/surf-api-gradle-plugin/src/main/kotlin/dev/slne/surf/surfapi/gradle/generators/GeneratePluginFile.kt @@ -1,15 +1,8 @@ package dev.slne.surf.surfapi.gradle.generators import kotlinx.serialization.ExperimentalSerializationApi -import kotlinx.serialization.InternalSerializationApi -import kotlinx.serialization.KSerializer -import kotlinx.serialization.builtins.ListSerializer -import kotlinx.serialization.descriptors.SerialDescriptor -import kotlinx.serialization.encoding.Decoder -import kotlinx.serialization.encoding.Encoder import kotlinx.serialization.json.Json import org.gradle.api.DefaultTask -import org.gradle.api.NamedDomainObjectContainer import org.gradle.api.file.RegularFileProperty import org.gradle.api.provider.Property import org.gradle.api.tasks.CacheableTask @@ -48,27 +41,5 @@ abstract class GeneratePluginFile : DefaultTask() { prettyPrint = true prettyPrintIndent = " " } - - @OptIn(InternalSerializationApi::class) - class NamedDomainObjectContainerSerializer( - private val dataSerializer: KSerializer, - ) : KSerializer> { - override val descriptor: SerialDescriptor = SerialDescriptor( - "dev.slne.surf.surfapi.gradle.generators.GeneratePluginFile.NamedDomainObjectContainerSerializer", - dataSerializer.descriptor - ) - - override fun serialize( - encoder: Encoder, - value: NamedDomainObjectContainer, - ) { - val values = value.toList() - encoder.encodeSerializableValue(ListSerializer(dataSerializer), values) - } - - override fun deserialize(decoder: Decoder): NamedDomainObjectContainer { - throw UnsupportedOperationException("Deserialization is not supported") - } - } } } \ No newline at end of file diff --git a/surf-api-gradle-plugin/src/main/kotlin/dev/slne/surf/surfapi/gradle/generators/pluginfiles/CommonPluginFile.kt b/surf-api-gradle-plugin/src/main/kotlin/dev/slne/surf/surfapi/gradle/generators/pluginfiles/CommonPluginFile.kt index 249ab2d29..b182d303c 100644 --- a/surf-api-gradle-plugin/src/main/kotlin/dev/slne/surf/surfapi/gradle/generators/pluginfiles/CommonPluginFile.kt +++ b/surf-api-gradle-plugin/src/main/kotlin/dev/slne/surf/surfapi/gradle/generators/pluginfiles/CommonPluginFile.kt @@ -1,19 +1,12 @@ package dev.slne.surf.surfapi.gradle.generators.pluginfiles -import kotlinx.serialization.Serializable -import org.gradle.api.Project import org.gradle.api.tasks.Internal -@Serializable sealed class CommonPluginFile { @Internal internal abstract fun isApplied(): Boolean - internal open fun setDefaults(project: Project) { - - } - internal open fun validate() { } } \ No newline at end of file diff --git a/surf-api-gradle-plugin/src/main/kotlin/dev/slne/surf/surfapi/gradle/generators/pluginfiles/HytalePluginFile.kt b/surf-api-gradle-plugin/src/main/kotlin/dev/slne/surf/surfapi/gradle/generators/pluginfiles/HytalePluginFile.kt index bb1730a34..efea9e89c 100644 --- a/surf-api-gradle-plugin/src/main/kotlin/dev/slne/surf/surfapi/gradle/generators/pluginfiles/HytalePluginFile.kt +++ b/surf-api-gradle-plugin/src/main/kotlin/dev/slne/surf/surfapi/gradle/generators/pluginfiles/HytalePluginFile.kt @@ -1,155 +1,65 @@ package dev.slne.surf.surfapi.gradle.generators.pluginfiles import dev.slne.surf.surfapi.gradle.platform.invalidPluginFile -import kotlinx.serialization.KSerializer -import kotlinx.serialization.SerialName -import kotlinx.serialization.Serializable -import kotlinx.serialization.builtins.ListSerializer -import kotlinx.serialization.builtins.MapSerializer -import kotlinx.serialization.builtins.serializer -import kotlinx.serialization.descriptors.SerialDescriptor -import kotlinx.serialization.descriptors.buildClassSerialDescriptor -import kotlinx.serialization.descriptors.element -import kotlinx.serialization.encoding.Decoder -import kotlinx.serialization.encoding.Encoder -import kotlinx.serialization.encoding.encodeStructure -import org.gradle.api.Project +import org.gradle.api.provider.ListProperty +import org.gradle.api.provider.MapProperty +import org.gradle.api.provider.Property import org.gradle.api.tasks.Input -import org.gradle.api.tasks.Optional +import javax.inject.Inject -@Serializable(with = HytalePluginFileSerializer::class) -class HytalePluginFile(project: Project) : CommonPluginFile() { - @Input - @SerialName("Group") - var group: String = "HYS" +abstract class HytalePluginFile @Inject constructor() : CommonPluginFile() { + @get:Input + abstract val group: Property - @Input - @SerialName("Id") - var id: String? = null + @get:Input + abstract val id: Property - @Input - @SerialName("Name") - var name: String? = null + @get:Input + abstract val name: Property - @Input - @SerialName("Version") - var version: String? = null + @get:Input + abstract val version: Property - @Input - @SerialName("Description") - @Optional - var description: String = "" + @get:Input + abstract val description: Property - @Input - @SerialName("Authors") - var authors: List = mutableListOf() + @get:Input + abstract val authors: ListProperty - @Input - @SerialName("Website") - @Optional - var website: String = "" + @get:Input + abstract val website: Property - @Input - @SerialName("ServerVersion") - var serverVersion: String = "*" + @get:Input + abstract val serverVersion: Property - @Input - @SerialName("DisabledByDefault") - var disabledByDefault: Boolean = false + @get:Input + abstract val disabledByDefault: Property - @Input - @SerialName("Main") - var main: String? = null + @get:Input + abstract val main: Property - @Input - @SerialName("IncludesAssetPack") - var includesAssetPack: Boolean = false + @get:Input + abstract val includesAssetPack: Property - @Input - @SerialName("Dependencies") - val dependencies: MutableMap = mutableMapOf("HYS:surf-api-hytale-server" to "*") + @get:Input + abstract val dependencies: MapProperty - @Input - @SerialName("OptionalDependencies") - val optionalDependencies: MutableMap = mutableMapOf() - - @Serializable - data class Author(@SerialName("Name") @Input val name: String) + @get:Input + abstract val optionalDependencies: MapProperty override fun isApplied(): Boolean { - return name != null && main != null - } - - override fun setDefaults(project: Project) { - id = project.name - name = project.name - version = project.version.toString() - description = project.description ?: "" - website = project.findProperty("url") as String? ?: "" + return main.isPresent } override fun validate() { - val id = name ?: invalidPluginFile("Plugin name not set") + if (name.orNull.isNullOrBlank()) invalidPluginFile("Plugin name not set") - if (version.isNullOrBlank()) invalidPluginFile("Plugin version not set") - if (main.isNullOrBlank()) invalidPluginFile("Main class not set") + if (version.orNull.isNullOrBlank()) invalidPluginFile("Plugin version not set") + if (main.orNull.isNullOrBlank()) invalidPluginFile("Main class not set") - for ((dependency, version) in optionalDependencies) { + optionalDependencies.orNull?.forEach { (dependency, version) -> if (dependency.isBlank()) invalidPluginFile("Dependency id not set") if (version.isBlank()) invalidPluginFile("Dependency '$dependency' version not set") } } -} - -object HytalePluginFileSerializer : KSerializer { - override val descriptor: SerialDescriptor = buildClassSerialDescriptor("HytalePluginFile") { - element("Group") - element("Name") - element("Version") - element("Description") - element>("Authors") - element("Website") - element("ServerVersion") - element("DisabledByDefault") - element("Main") - element("IncludesAssetPack") - element>("Dependencies") - element>("PluginDependencies") - } - - override fun serialize(encoder: Encoder, value: HytalePluginFile) { - encoder.encodeStructure(descriptor) { - encodeStringElement(descriptor, 0, value.group ?: "") - encodeStringElement(descriptor, 1, value.name ?: "") - encodeStringElement(descriptor, 2, value.version ?: "") - encodeStringElement(descriptor, 3, value.description ?: "") - encodeSerializableElement( - descriptor, - 4, - ListSerializer(HytalePluginFile.Author.serializer()), - value.authors - ) - encodeStringElement(descriptor, 5, value.website ?: "") - encodeStringElement(descriptor, 6, value.serverVersion ?: "") - encodeBooleanElement(descriptor, 7, value.disabledByDefault) - encodeStringElement(descriptor, 8, value.main ?: "") - encodeBooleanElement(descriptor, 9, value.includesAssetPack) - encodeSerializableElement( - descriptor, - 10, - MapSerializer(String.serializer(), String.serializer()), - value.dependencies - ) - encodeSerializableElement( - descriptor, - 11, - MapSerializer(String.serializer(), String.serializer()), - value.optionalDependencies - ) - } - } - - override fun deserialize(decoder: Decoder): HytalePluginFile { - throw NotImplementedError("Deserialization is not supported for HytalePluginFile") - } } \ No newline at end of file diff --git a/surf-api-gradle-plugin/src/main/kotlin/dev/slne/surf/surfapi/gradle/generators/pluginfiles/VelocityPluginFile.kt b/surf-api-gradle-plugin/src/main/kotlin/dev/slne/surf/surfapi/gradle/generators/pluginfiles/VelocityPluginFile.kt index 1ed34d8d1..614fa0da3 100644 --- a/surf-api-gradle-plugin/src/main/kotlin/dev/slne/surf/surfapi/gradle/generators/pluginfiles/VelocityPluginFile.kt +++ b/surf-api-gradle-plugin/src/main/kotlin/dev/slne/surf/surfapi/gradle/generators/pluginfiles/VelocityPluginFile.kt @@ -1,168 +1,77 @@ package dev.slne.surf.surfapi.gradle.generators.pluginfiles -import dev.slne.surf.surfapi.gradle.generators.GeneratePluginFile.Companion.NamedDomainObjectContainerSerializer -import dev.slne.surf.surfapi.gradle.generators.pluginfiles.VelocityPluginFile.Dependency import dev.slne.surf.surfapi.gradle.platform.invalidPluginFile -import dev.slne.surf.surfapi.gradle.platform.velocity.VelocitySurfExtension -import kotlinx.serialization.* -import kotlinx.serialization.builtins.ArraySerializer -import kotlinx.serialization.builtins.ListSerializer -import kotlinx.serialization.builtins.serializer -import kotlinx.serialization.descriptors.SerialDescriptor -import kotlinx.serialization.descriptors.buildClassSerialDescriptor -import kotlinx.serialization.descriptors.element -import kotlinx.serialization.encoding.Decoder -import kotlinx.serialization.encoding.Encoder -import kotlinx.serialization.encoding.encodeStructure import org.gradle.api.NamedDomainObjectContainer -import org.gradle.api.Project +import org.gradle.api.model.ObjectFactory +import org.gradle.api.provider.ListProperty +import org.gradle.api.provider.Property import org.gradle.api.tasks.Input import org.gradle.api.tasks.Nested -import org.gradle.api.tasks.Optional -import org.gradle.kotlin.dsl.findByType +import org.gradle.kotlin.dsl.domainObjectContainer import org.intellij.lang.annotations.Pattern import org.intellij.lang.annotations.RegExp +import javax.inject.Inject @RegExp private const val ID_REGEX = "[a-z][a-z0-9-_]{0,63}" +private val idRegex = ID_REGEX.toRegex() -@Serializable(with = VelocityPluginFileSerializer::class) -class VelocityPluginFile(project: Project) : CommonPluginFile() { - @Transient - private val idRegex = ID_REGEX.toRegex() - - @Pattern(ID_REGEX) - @Input - @Optional - var id: String? = null - - @Input - @Optional - var main: String? = null - - @Input - @Optional - var name: String? = null - - @Input - @Optional - var version: String? = null - - @Input - @Optional - var description: String? = null - - @Input - @Optional - var url: String? = null - - @Input - @Optional - var authors: List? = null - - - @Serializable(with = NamedDomainObjectContainerSerializer::class) - @Nested - @Optional - var pluginDependencies: NamedDomainObjectContainer = - project.objects.domainObjectContainer(Dependency::class.java).apply { - register("surf-api-velocity") { - optional = false - } - - project.afterEvaluate { - project.extensions.findByType()?.let { extension -> - if (extension.coreModule.isPresent) { - register("surf-core-velocity") { - optional = false - } - } - - if (extension.withSurfRedis.get() && !extension.surfRedisRelocation.isPresent) { - register("surf-redis-velocity") { - optional = false - } - } - } - } - } +abstract class VelocityPluginFile @Inject constructor( + objects: ObjectFactory +) : CommonPluginFile() { + @get:Pattern(ID_REGEX) + @get:Input + abstract val id: Property - @Serializable - data class Dependency(@SerialName("id") @Input val name: String) { - @OptIn(ExperimentalSerializationApi::class) - @EncodeDefault - @Input - var optional: Boolean = false - } + @get:Input + abstract val main: Property - override fun isApplied(): Boolean { - return id != null && main != null + @get:Input + abstract val name: Property + + @get:Input + abstract val version: Property + + @get:Input + abstract val description: Property + + @get:Input + abstract val url: Property + + @get:Input + abstract val authors: ListProperty + + @get:Nested + val pluginDependencies: NamedDomainObjectContainer = objects.domainObjectContainer(Dependency::class) + + abstract class Dependency @Inject constructor( + @get:Input val name: String + ) { + @get:Input + abstract val optional: Property + + @get:Input + internal abstract val enabled: Property + + init { + optional.convention(false) + enabled.convention(true) + } } - override fun setDefaults(project: Project) { - id = project.name - version = project.version.toString() - description = project.description - url = project.findProperty("url") as String? + override fun isApplied(): Boolean { + return main.isPresent } override fun validate() { - val id = id ?: invalidPluginFile("Plugin id not set") + val id = id.orNull ?: invalidPluginFile("Plugin id not set") if (!(idRegex.matches(id))) invalidPluginFile("Invalid plugin id! Should match $idRegex") - if (version.isNullOrBlank()) invalidPluginFile("Plugin version not set") - if (main.isNullOrBlank()) invalidPluginFile("Main class not set") + if (version.orNull.isNullOrBlank()) invalidPluginFile("Plugin version not set") + if (main.orNull.isNullOrBlank()) invalidPluginFile("Main class not set") for (dependency in pluginDependencies) { if (dependency.name.isBlank()) invalidPluginFile("Dependency id not set") } } -} - -object VelocityPluginFileSerializer : KSerializer { - override val descriptor: SerialDescriptor = buildClassSerialDescriptor("VelocityPluginFile") { - element("id", isOptional = true) - element("main", isOptional = true) - element("name", isOptional = true) - element("version", isOptional = true) - element("description", isOptional = true) - element("url", isOptional = true) - element>("authors", isOptional = true) - element>("dependencies", isOptional = true) - } - - override fun serialize(encoder: Encoder, value: VelocityPluginFile) { - encoder.encodeStructure(descriptor) { - value.id?.let { encodeStringElement(descriptor, 0, it) } - value.main?.let { encodeStringElement(descriptor, 1, it) } - value.name?.let { encodeStringElement(descriptor, 2, it) } - value.version?.let { encodeStringElement(descriptor, 3, it) } - value.description?.let { encodeStringElement(descriptor, 4, it) } - value.url?.let { encodeStringElement(descriptor, 5, it) } - value.authors?.let { - encodeSerializableElement( - descriptor, - 6, - ListSerializer(String.serializer()), - it - ) - } - - val dep = value.pluginDependencies - val namer = dep.namer - - dep.associateBy { namer.determineName(it) } - - encodeSerializableElement( - descriptor, - 7, - ArraySerializer(Dependency.serializer()), - value.pluginDependencies.toTypedArray() - ) - } - } - - override fun deserialize(decoder: Decoder): VelocityPluginFile { - throw UnsupportedOperationException("Deserialization is not supported") - } } \ No newline at end of file diff --git a/surf-api-gradle-plugin/src/main/kotlin/dev/slne/surf/surfapi/gradle/generators/pluginfiles/dto/HytalePluginFileDto.kt b/surf-api-gradle-plugin/src/main/kotlin/dev/slne/surf/surfapi/gradle/generators/pluginfiles/dto/HytalePluginFileDto.kt new file mode 100644 index 000000000..18dd6cbe5 --- /dev/null +++ b/surf-api-gradle-plugin/src/main/kotlin/dev/slne/surf/surfapi/gradle/generators/pluginfiles/dto/HytalePluginFileDto.kt @@ -0,0 +1,69 @@ +package dev.slne.surf.surfapi.gradle.generators.pluginfiles.dto + +import dev.slne.surf.surfapi.gradle.generators.pluginfiles.HytalePluginFile +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +data class HytalePluginFileDto( + @SerialName("Group") + val group: String, + + @SerialName("Id") + val id: String? = null, + + @SerialName("Name") + val name: String, + + @SerialName("Version") + val version: String, + + @SerialName("Description") + val description: String, + + @SerialName("Authors") + val authors: List, + + @SerialName("Website") + val website: String, + + @SerialName("ServerVersion") + val serverVersion: String, + + @SerialName("DisabledByDefault") + val disabledByDefault: Boolean, + + @SerialName("Main") + val main: String, + + @SerialName("IncludesAssetPack") + val includesAssetPack: Boolean, + + @SerialName("Dependencies") + val dependencies: Map, + + @SerialName("OptionalDependencies") + val optionalDependencies: Map, +) { + @Serializable + data class AuthorDto( + val name: String, + ) + + companion object { + fun fromFile(file: HytalePluginFile) = HytalePluginFileDto( + group = file.group.get(), + name = file.name.get(), + version = file.version.get(), + description = file.description.get(), + authors = file.authors.getOrElse(emptyList()).map { AuthorDto(it) }, + website = file.website.get(), + serverVersion = file.serverVersion.get(), + disabledByDefault = file.disabledByDefault.get(), + main = file.main.get(), + includesAssetPack = file.includesAssetPack.get(), + dependencies = file.dependencies.get(), + optionalDependencies = file.optionalDependencies.get() + ) + } +} \ No newline at end of file diff --git a/surf-api-gradle-plugin/src/main/kotlin/dev/slne/surf/surfapi/gradle/generators/pluginfiles/dto/VelocityPluginFileDto.kt b/surf-api-gradle-plugin/src/main/kotlin/dev/slne/surf/surfapi/gradle/generators/pluginfiles/dto/VelocityPluginFileDto.kt new file mode 100644 index 000000000..f611798e4 --- /dev/null +++ b/surf-api-gradle-plugin/src/main/kotlin/dev/slne/surf/surfapi/gradle/generators/pluginfiles/dto/VelocityPluginFileDto.kt @@ -0,0 +1,41 @@ +package dev.slne.surf.surfapi.gradle.generators.pluginfiles.dto + +import dev.slne.surf.surfapi.gradle.generators.pluginfiles.VelocityPluginFile +import kotlinx.serialization.Serializable + + +@Serializable +data class VelocityPluginFileDto( + val id: String? = null, + val main: String? = null, + val name: String? = null, + val version: String? = null, + val description: String? = null, + val url: String? = null, + val authors: List? = null, + val dependencies: List? = null, +) { + @Serializable + data class DependencyDto( + val id: String, + val optional: Boolean, + ) + + + companion object { + fun fromFile(file: VelocityPluginFile) = VelocityPluginFileDto( + id = file.id.orNull, + main = file.main.orNull, + name = file.name.orNull, + version = file.version.orNull, + description = file.description.orNull, + url = file.url.orNull, + authors = file.authors.orNull, + dependencies = file.pluginDependencies + .filter { it.enabled.get() } + .map { DependencyDto(it.name, it.optional.get()) } + ) + } +} + + diff --git a/surf-api-gradle-plugin/src/main/kotlin/dev/slne/surf/surfapi/gradle/platform/common/CommonSurfPlugin.kt b/surf-api-gradle-plugin/src/main/kotlin/dev/slne/surf/surfapi/gradle/platform/common/CommonSurfPlugin.kt index 8409321e8..9a45a65f0 100644 --- a/surf-api-gradle-plugin/src/main/kotlin/dev/slne/surf/surfapi/gradle/platform/common/CommonSurfPlugin.kt +++ b/surf-api-gradle-plugin/src/main/kotlin/dev/slne/surf/surfapi/gradle/platform/common/CommonSurfPlugin.kt @@ -9,7 +9,6 @@ import org.gradle.api.Plugin import org.gradle.api.Project import org.gradle.api.artifacts.component.ProjectComponentIdentifier import org.gradle.api.artifacts.result.ResolvedDependencyResult -import org.gradle.api.model.ObjectFactory import org.gradle.api.plugins.JavaPluginExtension import org.gradle.api.publish.PublishingExtension import org.gradle.api.tasks.compile.JavaCompile @@ -40,11 +39,10 @@ abstract class CommonSurfPlugin( private val relocations = mutableMapOf() private val dependencyDependentRelocations = mutableMapOf>() - protected abstract fun createExtension(objects: ObjectFactory, project: Project): E + protected abstract val extensionClass: Class override fun apply(target: Project) = with(target) { - val extension = createExtension(objects, this) - extensions.add("surf${platformName.replaceFirstChar { it.uppercase() }}Api", extension) + val extension = extensions.create("surf${platformName.replaceFirstChar { it.uppercase() }}Api", extensionClass) applyRepositories() applyPlugins() diff --git a/surf-api-gradle-plugin/src/main/kotlin/dev/slne/surf/surfapi/gradle/platform/common/CommonSurfPluginWithPluginFile.kt b/surf-api-gradle-plugin/src/main/kotlin/dev/slne/surf/surfapi/gradle/platform/common/CommonSurfPluginWithPluginFile.kt index e520be174..d2d7d9fcf 100644 --- a/surf-api-gradle-plugin/src/main/kotlin/dev/slne/surf/surfapi/gradle/platform/common/CommonSurfPluginWithPluginFile.kt +++ b/surf-api-gradle-plugin/src/main/kotlin/dev/slne/surf/surfapi/gradle/platform/common/CommonSurfPluginWithPluginFile.kt @@ -3,6 +3,7 @@ package dev.slne.surf.surfapi.gradle.platform.common import dev.slne.surf.surfapi.gradle.generators.GeneratePluginFile import dev.slne.surf.surfapi.gradle.generators.pluginfiles.CommonPluginFile import dev.slne.surf.surfapi.gradle.platform.SurfApiPlatform +import kotlinx.serialization.SerializationStrategy import org.gradle.api.Project import org.gradle.api.plugins.JavaPlugin import org.gradle.api.tasks.SourceSet @@ -12,13 +13,16 @@ import org.gradle.kotlin.dsl.register import org.gradle.kotlin.dsl.support.uppercaseFirstChar import org.gradle.kotlin.dsl.withType -abstract class CommonSurfPluginWithPluginFile( +abstract class CommonSurfPluginWithPluginFile( platformName: String, platform: SurfApiPlatform, private val pluginFileName: String, ) : CommonSurfPlugin(platformName, platform) { + protected abstract val dtoSerializer: SerializationStrategy + protected abstract fun createPluginFile(project: Project): F + protected abstract fun createPluginFileDto(pluginFile: F): D override fun apply(target: Project) { super.apply(target) @@ -35,14 +39,12 @@ abstract class CommonSurfPluginWithPluginFile(createdPluginFile) + val dto = createPluginFileDto(createdPluginFile) + GeneratePluginFile.json.encodeToString(dtoSerializer, dto) } else { logger.warn( "Plugin file generation is skipped because the plugin file is not applied. " + diff --git a/surf-api-gradle-plugin/src/main/kotlin/dev/slne/surf/surfapi/gradle/platform/core/CoreSurfPlugin.kt b/surf-api-gradle-plugin/src/main/kotlin/dev/slne/surf/surfapi/gradle/platform/core/CoreSurfPlugin.kt index 32fbd82ca..3e497e4a7 100644 --- a/surf-api-gradle-plugin/src/main/kotlin/dev/slne/surf/surfapi/gradle/platform/core/CoreSurfPlugin.kt +++ b/surf-api-gradle-plugin/src/main/kotlin/dev/slne/surf/surfapi/gradle/platform/core/CoreSurfPlugin.kt @@ -3,7 +3,6 @@ package dev.slne.surf.surfapi.gradle.platform.core import dev.slne.surf.surfapi.gradle.platform.SurfApiPlatform import dev.slne.surf.surfapi.gradle.platform.common.CommonSurfPlugin import org.gradle.api.Project -import org.gradle.api.model.ObjectFactory internal abstract class AbstractCoreSurfPlugin( platformName: String, platform: SurfApiPlatform, @@ -24,6 +23,5 @@ internal abstract class AbstractCoreSurfPlugin( internal class CoreSurfPlugin : AbstractCoreSurfPlugin("core", SurfApiPlatform.CORE) { - override fun createExtension(objects: ObjectFactory, project: Project) = - CoreSurfExtension(objects) + override val extensionClass = CoreSurfExtension::class.java } \ No newline at end of file diff --git a/surf-api-gradle-plugin/src/main/kotlin/dev/slne/surf/surfapi/gradle/platform/hytale/HytaleSurfPlugin.kt b/surf-api-gradle-plugin/src/main/kotlin/dev/slne/surf/surfapi/gradle/platform/hytale/HytaleSurfPlugin.kt index 534633e32..09847ea28 100644 --- a/surf-api-gradle-plugin/src/main/kotlin/dev/slne/surf/surfapi/gradle/platform/hytale/HytaleSurfPlugin.kt +++ b/surf-api-gradle-plugin/src/main/kotlin/dev/slne/surf/surfapi/gradle/platform/hytale/HytaleSurfPlugin.kt @@ -2,22 +2,23 @@ package dev.slne.surf.surfapi.gradle.platform.hytale import dev.slne.surf.surfapi.gradle.generated.Constants import dev.slne.surf.surfapi.gradle.generators.pluginfiles.HytalePluginFile +import dev.slne.surf.surfapi.gradle.generators.pluginfiles.dto.HytalePluginFileDto import dev.slne.surf.surfapi.gradle.platform.SurfApiPlatform import dev.slne.surf.surfapi.gradle.platform.common.CommonSurfPluginWithPluginFile import org.gradle.api.Project -import org.gradle.api.model.ObjectFactory +import org.gradle.kotlin.dsl.create import org.gradle.kotlin.dsl.dependencies import org.jetbrains.kotlin.gradle.utils.COMPILE_ONLY internal class HytaleSurfPlugin : - CommonSurfPluginWithPluginFile( + CommonSurfPluginWithPluginFile( "hytale", SurfApiPlatform.HYTALE, "manifest.json" ) { - override fun createExtension(objects: ObjectFactory, project: Project) = - HytaleSurfExtension(project, objects) + override val extensionClass = HytaleSurfExtension::class.java + override val dtoSerializer = HytalePluginFileDto.serializer() init { "it.unimi.dsi.fastutil" relocatesTo "fastutil" @@ -29,5 +30,24 @@ internal class HytaleSurfPlugin : } } - override fun createPluginFile(project: Project) = HytalePluginFile(project) + override fun createPluginFile( + project: Project + ) = project.extensions.create("hytalePluginFile").apply { + group.convention("HYS") + id.convention(project.name.lowercase()) + name.convention(project.provider { project.name }) + version.convention(project.provider { project.version.toString() }) + description.convention(project.provider { project.description ?: "" }) + authors.convention(mutableListOf("SLNE Development")) + website.convention(project.providers.gradleProperty("url").orElse("")) + serverVersion.convention("*") + disabledByDefault.convention(false) + includesAssetPack.convention(false) + dependencies.convention(mutableMapOf("HYS:surf-api-hytale-server" to "*")) + optionalDependencies.convention(mutableMapOf()) + } + + override fun createPluginFileDto(pluginFile: HytalePluginFile): HytalePluginFileDto { + return HytalePluginFileDto.fromFile(pluginFile) + } } \ No newline at end of file diff --git a/surf-api-gradle-plugin/src/main/kotlin/dev/slne/surf/surfapi/gradle/platform/paper/plugin/PaperPluginSurfPlugin.kt b/surf-api-gradle-plugin/src/main/kotlin/dev/slne/surf/surfapi/gradle/platform/paper/plugin/PaperPluginSurfPlugin.kt index c1d6f674b..d64fcd519 100644 --- a/surf-api-gradle-plugin/src/main/kotlin/dev/slne/surf/surfapi/gradle/platform/paper/plugin/PaperPluginSurfPlugin.kt +++ b/surf-api-gradle-plugin/src/main/kotlin/dev/slne/surf/surfapi/gradle/platform/paper/plugin/PaperPluginSurfPlugin.kt @@ -7,7 +7,6 @@ import dev.slne.surf.surfapi.gradle.util.registerRequired import net.minecrell.pluginyml.GeneratePluginDescription import net.minecrell.pluginyml.paper.PaperPluginDescription import org.gradle.api.Project -import org.gradle.api.model.ObjectFactory import org.gradle.api.plugins.JavaPlugin import org.gradle.api.tasks.SourceSet import org.gradle.api.tasks.SourceSetContainer @@ -20,6 +19,8 @@ import xyz.jpenilla.runpaper.task.RunServer internal class PaperPluginSurfPlugin : AbstractPaperSurfPlugin("paperPlugin") { + override val extensionClass = PaperPluginSurfExtension::class.java + init { addRelocationsForDependency( "surf-data-api", @@ -95,9 +96,6 @@ internal class PaperPluginSurfPlugin : } } - override fun createExtension(objects: ObjectFactory, project: Project) = - PaperPluginSurfExtension(objects) - override fun Project.applyPlugins0() { paperPlugins.forEach { plugin -> applyPlugin(plugin) diff --git a/surf-api-gradle-plugin/src/main/kotlin/dev/slne/surf/surfapi/gradle/platform/paper/raw/RawPaperSurfPlugin.kt b/surf-api-gradle-plugin/src/main/kotlin/dev/slne/surf/surfapi/gradle/platform/paper/raw/RawPaperSurfPlugin.kt index 6445e92e0..22b9b8f1f 100644 --- a/surf-api-gradle-plugin/src/main/kotlin/dev/slne/surf/surfapi/gradle/platform/paper/raw/RawPaperSurfPlugin.kt +++ b/surf-api-gradle-plugin/src/main/kotlin/dev/slne/surf/surfapi/gradle/platform/paper/raw/RawPaperSurfPlugin.kt @@ -1,9 +1,7 @@ package dev.slne.surf.surfapi.gradle.platform.paper.raw import dev.slne.surf.surfapi.gradle.platform.paper.AbstractPaperSurfPlugin -import org.gradle.api.Project -import org.gradle.api.model.ObjectFactory internal class RawPaperSurfPlugin : AbstractPaperSurfPlugin("rawPaper") { - override fun createExtension(objects: ObjectFactory, project: Project) = RawPaperSurfExtension(objects) + override val extensionClass = RawPaperSurfExtension::class.java } \ No newline at end of file diff --git a/surf-api-gradle-plugin/src/main/kotlin/dev/slne/surf/surfapi/gradle/platform/standalone/StandaloneSurfPlugin.kt b/surf-api-gradle-plugin/src/main/kotlin/dev/slne/surf/surfapi/gradle/platform/standalone/StandaloneSurfPlugin.kt index 231d3ed77..4793075ce 100644 --- a/surf-api-gradle-plugin/src/main/kotlin/dev/slne/surf/surfapi/gradle/platform/standalone/StandaloneSurfPlugin.kt +++ b/surf-api-gradle-plugin/src/main/kotlin/dev/slne/surf/surfapi/gradle/platform/standalone/StandaloneSurfPlugin.kt @@ -2,10 +2,8 @@ package dev.slne.surf.surfapi.gradle.platform.standalone import dev.slne.surf.surfapi.gradle.platform.SurfApiPlatform import dev.slne.surf.surfapi.gradle.platform.core.AbstractCoreSurfPlugin -import org.gradle.api.Project -import org.gradle.api.model.ObjectFactory internal class StandaloneSurfPlugin : AbstractCoreSurfPlugin("standalone", SurfApiPlatform.STANDALONE) { - override fun createExtension(objects: ObjectFactory, project: Project) = StandaloneSurfExtension(objects) + override val extensionClass = StandaloneSurfExtension::class.java } \ No newline at end of file diff --git a/surf-api-gradle-plugin/src/main/kotlin/dev/slne/surf/surfapi/gradle/platform/velocity/VelocitySurfPlugin.kt b/surf-api-gradle-plugin/src/main/kotlin/dev/slne/surf/surfapi/gradle/platform/velocity/VelocitySurfPlugin.kt index 29cc9c2da..b6fde2b95 100644 --- a/surf-api-gradle-plugin/src/main/kotlin/dev/slne/surf/surfapi/gradle/platform/velocity/VelocitySurfPlugin.kt +++ b/surf-api-gradle-plugin/src/main/kotlin/dev/slne/surf/surfapi/gradle/platform/velocity/VelocitySurfPlugin.kt @@ -2,27 +2,29 @@ package dev.slne.surf.surfapi.gradle.platform.velocity import dev.slne.surf.surfapi.gradle.generated.Constants import dev.slne.surf.surfapi.gradle.generators.pluginfiles.VelocityPluginFile +import dev.slne.surf.surfapi.gradle.generators.pluginfiles.dto.VelocityPluginFileDto import dev.slne.surf.surfapi.gradle.platform.SurfApiPlatform import dev.slne.surf.surfapi.gradle.platform.common.CommonSurfPluginWithPluginFile import org.gradle.api.Project -import org.gradle.api.model.ObjectFactory +import org.gradle.kotlin.dsl.create import org.gradle.kotlin.dsl.dependencies +import org.gradle.kotlin.dsl.invoke import org.jetbrains.kotlin.gradle.utils.COMPILE_ONLY internal class VelocitySurfPlugin : - CommonSurfPluginWithPluginFile( + CommonSurfPluginWithPluginFile( "velocity", SurfApiPlatform.VELOCITY, "velocity-plugin.json" ) { - override fun createExtension(objects: ObjectFactory, project: Project) = - VelocitySurfExtension(project, objects) - init { "it.unimi.dsi.fastutil" relocatesTo "fastutil" } + override val extensionClass = VelocitySurfExtension::class.java + override val dtoSerializer = VelocityPluginFileDto.serializer() + override fun Project.configure0() { dependencies { add(COMPILE_ONLY, Constants.VELOCITY_API) @@ -30,5 +32,41 @@ internal class VelocitySurfPlugin : } } - override fun createPluginFile(project: Project) = VelocityPluginFile(project) + override fun createPluginFile( + project: Project + ) = project.extensions.create("velocityPluginFile").apply { + id.convention(project.name.lowercase()) + name.convention(project.provider { project.name }) + version.convention(project.provider { project.version.toString() }) + description.convention(project.provider { project.description ?: "" }) + url.convention(project.providers.gradleProperty("url")) + + val ext = project.extensions.getByType(VelocitySurfExtension::class.java) + val coreEnabled = ext.coreModule.map { true }.orElse(false) + val surfRedisRelocationPresent = ext.surfRedisRelocation.map { true }.orElse(false) + val redisEnabled = ext.withSurfRedis.zip(surfRedisRelocationPresent) { withRedis, relocPresent -> + withRedis && !relocPresent + } + + pluginDependencies { + register("surf-api-velocity") { + optional.convention(false) + enabled.convention(true) + } + + register("surf-core-velocity") { + optional.convention(false) + enabled.convention(coreEnabled) + } + + register("surf-redis-velocity") { + optional.convention(false) + enabled.convention(redisEnabled) + } + } + } + + override fun createPluginFileDto(pluginFile: VelocityPluginFile): VelocityPluginFileDto { + return VelocityPluginFileDto.fromFile(pluginFile) + } } \ No newline at end of file