Wizard: add validators for POM data

This commit is contained in:
Ilya Kirillov
2020-01-17 17:23:54 +03:00
parent 7df1b54c82
commit b33ae61508
4 changed files with 24 additions and 14 deletions
@@ -1,16 +1,17 @@
package org.jetbrains.kotlin.tools.projectWizard.wizard.ui.secondStep
import com.intellij.ui.components.JBTabbedPane
import com.intellij.ui.components.panels.VerticalLayout
import org.jetbrains.kotlin.tools.projectWizard.core.entity.StringValidators
import org.jetbrains.kotlin.tools.projectWizard.core.ValuesReadingContext
import org.jetbrains.kotlin.tools.projectWizard.moduleConfigurators.ModuleConfigurator
import org.jetbrains.kotlin.tools.projectWizard.core.entity.StringValidators
import org.jetbrains.kotlin.tools.projectWizard.moduleConfigurators.configuratorSettings
import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.ModuleType
import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.*
import org.jetbrains.kotlin.tools.projectWizard.wizard.ui.*
import org.jetbrains.kotlin.tools.projectWizard.wizard.ui.components.DropDownComponent
import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.Module
import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.Module.Companion.ALLOWED_SPECIAL_CHARS_IN_MODULE_NAMES
import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.ModuleKind
import org.jetbrains.kotlin.tools.projectWizard.wizard.ui.DynamicComponent
import org.jetbrains.kotlin.tools.projectWizard.wizard.ui.UiConstants
import org.jetbrains.kotlin.tools.projectWizard.wizard.ui.components.TextFieldComponent
import org.jetbrains.kotlin.tools.projectWizard.wizard.ui.panel
import org.jetbrains.kotlin.tools.projectWizard.wizard.ui.setting.SettingsList
import java.awt.BorderLayout
import javax.swing.BorderFactory
@@ -19,7 +20,7 @@ import javax.swing.JComponent
class ModuleSettingsComponent(valuesReadingContext: ValuesReadingContext) : DynamicComponent(valuesReadingContext) {
private val validateModuleName =
StringValidators.shouldNotBeBlank("Module name") and
StringValidators.shouldBeValidIdentifier("Module Name")
StringValidators.shouldBeValidIdentifier("Module Name", ALLOWED_SPECIAL_CHARS_IN_MODULE_NAMES)
private val moduleConfiguratorSettingsList = SettingsList(emptyList(), valuesReadingContext).asSubComponent()
private val templateComponent = TemplatesComponent(valuesReadingContext).asSubComponent()
@@ -31,15 +31,18 @@ object StringValidators {
else ValidationResult.OK
}
fun shouldBeValidIdentifier(name: String) = settingValidator { value: String ->
if (value.any { char -> !char.isLetterOrDigit() && char !in ALLOWED_SPECIAL_CHARS_FOR_IDENTIFIERS })
fun shouldBeValidIdentifier(name: String, allowedExtraSymbols: Set<Char>) = settingValidator { value: String ->
if (value.any { char -> !char.isLetterOrDigit() && char !in allowedExtraSymbols }) {
val allowedExtraSymbolsStringified = allowedExtraSymbols
.takeIf { it.isNotEmpty() }
?.joinToString(separator = ", ") { char -> "'$char'" }
?.let { chars -> ", and symbols: $chars" }
.orEmpty()
ValidationResult.ValidationError(
"${name.capitalize()} should consist only of letters, digits, '_', or '-'"
"${name.capitalize()} should consist only of letters, digits$allowedExtraSymbolsStringified"
)
else ValidationResult.OK
} else ValidationResult.OK
}
private val ALLOWED_SPECIAL_CHARS_FOR_IDENTIFIERS = setOf('_', '-')
}
fun List<ValidationResult>.fold() = fold(ValidationResult.OK, ValidationResult::and)
@@ -3,6 +3,7 @@ package org.jetbrains.kotlin.tools.projectWizard.plugins
import org.jetbrains.kotlin.tools.projectWizard.core.Context
import org.jetbrains.kotlin.tools.projectWizard.core.Plugin
import org.jetbrains.kotlin.tools.projectWizard.core.TaskRunningContext
import org.jetbrains.kotlin.tools.projectWizard.core.entity.StringValidators
import org.jetbrains.kotlin.tools.projectWizard.core.entity.reference
import org.jetbrains.kotlin.tools.projectWizard.core.pathParser
import org.jetbrains.kotlin.tools.projectWizard.core.service.FileSystemWizardService
@@ -19,12 +20,15 @@ class StructurePlugin(context: Context) : Plugin(context) {
val groupId by stringSetting("Group ID", GenerationPhase.PROJECT_GENERATION) {
shouldNotBeBlank()
validate(StringValidators.shouldBeValidIdentifier("Group ID", setOf('.', '_')))
}
val artifactId by stringSetting("Artifact ID", GenerationPhase.PROJECT_GENERATION) {
shouldNotBeBlank()
validate(StringValidators.shouldBeValidIdentifier("Artifact ID", setOf('_')))
}
val version by stringSetting("Version", GenerationPhase.PROJECT_GENERATION) {
shouldNotBeBlank()
validate(StringValidators.shouldBeValidIdentifier("Version", setOf('_', '-', '.')))
defaultValue = "1.0-SNAPSHOT"
}
@@ -31,7 +31,7 @@ class Module(
override val validator: SettingValidator<Module> = settingValidator<Module> { module ->
StringValidators.shouldNotBeBlank("Module name").validate(this, module.name)
} and settingValidator { module ->
StringValidators.shouldBeValidIdentifier("Module name `$name`").validate(this, module.name)
StringValidators.shouldBeValidIdentifier("Module name `$name`", ALLOWED_SPECIAL_CHARS_IN_MODULE_NAMES).validate(this, module.name)
} and settingValidator { module ->
withSettingsOf(module) {
configurator.settings.map { setting ->
@@ -81,6 +81,8 @@ class Module(
}
companion object {
val ALLOWED_SPECIAL_CHARS_IN_MODULE_NAMES = setOf('-', '_')
val parser: Parser<Module> = mapParser { map, path ->
val (name) = map.parseValue<String>(path, "name")
val identificator = GeneratedIdentificator(name)