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 package org.jetbrains.kotlin.tools.projectWizard.wizard.ui.secondStep
import com.intellij.ui.components.JBTabbedPane 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.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.moduleConfigurators.configuratorSettings
import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.ModuleType import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.ModuleType
import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.* import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.Module
import org.jetbrains.kotlin.tools.projectWizard.wizard.ui.* import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.Module.Companion.ALLOWED_SPECIAL_CHARS_IN_MODULE_NAMES
import org.jetbrains.kotlin.tools.projectWizard.wizard.ui.components.DropDownComponent 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.components.TextFieldComponent
import org.jetbrains.kotlin.tools.projectWizard.wizard.ui.panel
import org.jetbrains.kotlin.tools.projectWizard.wizard.ui.setting.SettingsList import org.jetbrains.kotlin.tools.projectWizard.wizard.ui.setting.SettingsList
import java.awt.BorderLayout import java.awt.BorderLayout
import javax.swing.BorderFactory import javax.swing.BorderFactory
@@ -19,7 +20,7 @@ import javax.swing.JComponent
class ModuleSettingsComponent(valuesReadingContext: ValuesReadingContext) : DynamicComponent(valuesReadingContext) { class ModuleSettingsComponent(valuesReadingContext: ValuesReadingContext) : DynamicComponent(valuesReadingContext) {
private val validateModuleName = private val validateModuleName =
StringValidators.shouldNotBeBlank("Module name") and 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 moduleConfiguratorSettingsList = SettingsList(emptyList(), valuesReadingContext).asSubComponent()
private val templateComponent = TemplatesComponent(valuesReadingContext).asSubComponent() private val templateComponent = TemplatesComponent(valuesReadingContext).asSubComponent()
@@ -31,15 +31,18 @@ object StringValidators {
else ValidationResult.OK else ValidationResult.OK
} }
fun shouldBeValidIdentifier(name: String) = settingValidator { value: String -> fun shouldBeValidIdentifier(name: String, allowedExtraSymbols: Set<Char>) = settingValidator { value: String ->
if (value.any { char -> !char.isLetterOrDigit() && char !in ALLOWED_SPECIAL_CHARS_FOR_IDENTIFIERS }) 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( 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) 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.Context
import org.jetbrains.kotlin.tools.projectWizard.core.Plugin import org.jetbrains.kotlin.tools.projectWizard.core.Plugin
import org.jetbrains.kotlin.tools.projectWizard.core.TaskRunningContext 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.entity.reference
import org.jetbrains.kotlin.tools.projectWizard.core.pathParser import org.jetbrains.kotlin.tools.projectWizard.core.pathParser
import org.jetbrains.kotlin.tools.projectWizard.core.service.FileSystemWizardService 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) { val groupId by stringSetting("Group ID", GenerationPhase.PROJECT_GENERATION) {
shouldNotBeBlank() shouldNotBeBlank()
validate(StringValidators.shouldBeValidIdentifier("Group ID", setOf('.', '_')))
} }
val artifactId by stringSetting("Artifact ID", GenerationPhase.PROJECT_GENERATION) { val artifactId by stringSetting("Artifact ID", GenerationPhase.PROJECT_GENERATION) {
shouldNotBeBlank() shouldNotBeBlank()
validate(StringValidators.shouldBeValidIdentifier("Artifact ID", setOf('_')))
} }
val version by stringSetting("Version", GenerationPhase.PROJECT_GENERATION) { val version by stringSetting("Version", GenerationPhase.PROJECT_GENERATION) {
shouldNotBeBlank() shouldNotBeBlank()
validate(StringValidators.shouldBeValidIdentifier("Version", setOf('_', '-', '.')))
defaultValue = "1.0-SNAPSHOT" defaultValue = "1.0-SNAPSHOT"
} }
@@ -31,7 +31,7 @@ class Module(
override val validator: SettingValidator<Module> = settingValidator<Module> { module -> override val validator: SettingValidator<Module> = settingValidator<Module> { module ->
StringValidators.shouldNotBeBlank("Module name").validate(this, module.name) StringValidators.shouldNotBeBlank("Module name").validate(this, module.name)
} and settingValidator { module -> } 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 -> } and settingValidator { module ->
withSettingsOf(module) { withSettingsOf(module) {
configurator.settings.map { setting -> configurator.settings.map { setting ->
@@ -81,6 +81,8 @@ class Module(
} }
companion object { companion object {
val ALLOWED_SPECIAL_CHARS_IN_MODULE_NAMES = setOf('-', '_')
val parser: Parser<Module> = mapParser { map, path -> val parser: Parser<Module> = mapParser { map, path ->
val (name) = map.parseValue<String>(path, "name") val (name) = map.parseValue<String>(path, "name")
val identificator = GeneratedIdentificator(name) val identificator = GeneratedIdentificator(name)