Skip to content

Commit 521251e

Browse files
Handle screen creation if the screen with the same ID already exists #114
1 parent 602ceb5 commit 521251e

10 files changed

Lines changed: 117 additions & 27 deletions

File tree

src/main/kotlin/com/haulmont/cuba/cli/cubaplugin/ScreenCommandBase.kt

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ package com.haulmont.cuba.cli.cubaplugin
1919
import com.haulmont.cuba.cli.ModuleStructure
2020
import com.haulmont.cuba.cli.commands.GeneratorCommand
2121
import com.haulmont.cuba.cli.kodein
22+
import com.haulmont.cuba.cli.prompting.ValidationHelper
2223
import com.haulmont.cuba.cli.registration.ScreenRegistrationHelper
2324
import org.kodein.di.generic.instance
2425
import java.nio.file.Path
@@ -31,7 +32,7 @@ abstract class ScreenCommandBase<out Model : Any> : GeneratorCommand<Model>() {
3132
webModule.screensXml
3233
}
3334

34-
private val screenRegistrationHelper: ScreenRegistrationHelper by kodein.instance()
35+
protected val screenRegistrationHelper: ScreenRegistrationHelper by kodein.instance()
3536

3637
protected fun addToMenu(screenId: String, caption: String) {
3738
screenRegistrationHelper.addToMenu(screenId, caption)
@@ -48,4 +49,24 @@ abstract class ScreenCommandBase<out Model : Any> : GeneratorCommand<Model>() {
4849
protected fun addToScreensXml(id: String, packageName: String, descriptorName: String) {
4950
screenRegistrationHelper.addToScreensXml(id, packageName, descriptorName)
5051
}
52+
53+
protected fun ValidationHelper<String>.screenIdDoesNotExists(screenId: String) {
54+
if (screenRegistrationHelper.isScreenIdExists(screenId))
55+
fail("Screen with id $screenId already exists")
56+
}
57+
58+
protected fun ValidationHelper<String>.screenDescriptorDoesNotExists(descriptorName: String, packageName: String = packageName()) {
59+
if (screenRegistrationHelper.isDescriptorExists(packageName, descriptorName)) {
60+
fail("Such screen descriptor already exists")
61+
}
62+
}
63+
64+
protected fun ValidationHelper<String>.screenControllerDoesNotExists(controllerName: String, packageName: String = answers["packageName"] as String) {
65+
if (screenRegistrationHelper.isControllerExists(packageName, controllerName)) {
66+
fail("Such screen controller already exists")
67+
}
68+
}
69+
70+
protected fun ValidationHelper<String>.packageName() =
71+
answers["packageName"] as String
5172
}

src/main/kotlin/com/haulmont/cuba/cli/cubaplugin/browsescreen/CreateBrowseScreenCommand.kt

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,10 @@ class CreateBrowseScreenCommand : ScreenCommandBase<BrowseScreenModel>() {
6868

6969
projectModel.namespace + "$" + entityName.split('.').last() + ".browse"
7070
}
71+
72+
validate {
73+
screenIdDoesNotExists(value)
74+
}
7175
}
7276

7377
question("descriptorName", "Descriptor name") {
@@ -79,6 +83,8 @@ class CreateBrowseScreenCommand : ScreenCommandBase<BrowseScreenModel>() {
7983

8084
validate {
8185
checkIsScreenDescriptor()
86+
87+
screenDescriptorDoesNotExists(value)
8288
}
8389
}
8490

@@ -87,6 +93,8 @@ class CreateBrowseScreenCommand : ScreenCommandBase<BrowseScreenModel>() {
8793

8894
validate {
8995
checkIsClass()
96+
97+
screenControllerDoesNotExists(value)
9098
}
9199
}
92100
}

src/main/kotlin/com/haulmont/cuba/cli/cubaplugin/editscreen/CreateEditScreenCommand.kt

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,10 @@ import com.beust.jcommander.Parameters
2020
import com.haulmont.cuba.cli.ModuleStructure
2121
import com.haulmont.cuba.cli.cubaplugin.CubaPlugin
2222
import com.haulmont.cuba.cli.cubaplugin.ScreenCommandBase
23-
import com.haulmont.cuba.cli.generation.*
23+
import com.haulmont.cuba.cli.generation.Properties
24+
import com.haulmont.cuba.cli.generation.TemplateProcessor
25+
import com.haulmont.cuba.cli.generation.getChildElements
26+
import com.haulmont.cuba.cli.generation.parse
2427
import com.haulmont.cuba.cli.prompting.Answers
2528
import com.haulmont.cuba.cli.prompting.QuestionsList
2629
import net.sf.practicalxml.DomUtil
@@ -65,6 +68,10 @@ class CreateEditScreenCommand : ScreenCommandBase<EditScreenModel>() {
6568

6669
projectModel.namespace + "$" + entityName.split('.').last() + ".edit"
6770
}
71+
72+
validate {
73+
screenIdDoesNotExists(value)
74+
}
6875
}
6976

7077
question("descriptorName", "Descriptor name") {
@@ -76,6 +83,8 @@ class CreateEditScreenCommand : ScreenCommandBase<EditScreenModel>() {
7683

7784
validate {
7885
checkIsScreenDescriptor()
86+
87+
screenDescriptorDoesNotExists(value)
7988
}
8089
}
8190

@@ -84,6 +93,8 @@ class CreateEditScreenCommand : ScreenCommandBase<EditScreenModel>() {
8493

8594
validate {
8695
checkIsClass()
96+
97+
screenControllerDoesNotExists(value)
8798
}
8899
}
89100
}

src/main/kotlin/com/haulmont/cuba/cli/cubaplugin/screenextension/ExtendDefaultScreenCommand.kt

Lines changed: 41 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,46 @@ class ExtendDefaultScreenCommand : ScreenCommandBase<ScreenExtensionModel>() {
3636
question("packageName", "Package name") {
3737
default(projectModel.rootPackage + ".web.screens")
3838
}
39+
question("screenId", "Screen with default id already exists. Specify new id.") {
40+
askIf {
41+
if (it["screen"] == "login") {
42+
screenRegistrationHelper.isScreenIdExists("loginWindow")
43+
} else {
44+
screenRegistrationHelper.isScreenIdExists("mainWindow")
45+
}
46+
}
47+
validate {
48+
screenIdDoesNotExists(value)
49+
}
50+
}
51+
52+
question("descriptorName", "Descriptor name") {
53+
askIf {
54+
if (it["screen"] == "login") {
55+
screenRegistrationHelper.isDescriptorExists(it["packageName"] as String, "ext-loginWindow")
56+
} else {
57+
screenRegistrationHelper.isDescriptorExists(it["packageName"] as String, "ext-mainwindow")
58+
}
59+
}
60+
validate {
61+
checkIsScreenDescriptor()
62+
screenDescriptorDoesNotExists(value)
63+
}
64+
}
65+
66+
question("controllerName", "Controller name") {
67+
askIf {
68+
if (it["screen"] == "login") {
69+
screenRegistrationHelper.isControllerExists(it["packageName"] as String, "ExtAppLoginWindow")
70+
} else {
71+
screenRegistrationHelper.isDescriptorExists(it["packageName"] as String, "ExtAppMainWindow")
72+
}
73+
}
74+
validate {
75+
checkIsClass()
76+
screenControllerDoesNotExists(value)
77+
}
78+
}
3979
}
4080

4181
override fun createModel(answers: Answers): ScreenExtensionModel = ScreenExtensionModel(answers)
@@ -53,7 +93,7 @@ class ExtendDefaultScreenCommand : ScreenCommandBase<ScreenExtensionModel>() {
5393

5494
val webModule = projectStructure.getModule(WEB_MODULE)
5595

56-
addToScreensXml(model.id, model.packageName, model.descriptor)
96+
addToScreensXml(model.id, model.packageName, model.descriptorName)
5797

5898
val messages = webModule.resolvePackagePath(model.packageName).resolve("messages.properties")
5999

src/main/kotlin/com/haulmont/cuba/cli/cubaplugin/screenextension/ScreenExtensionModel.kt

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -22,15 +22,18 @@ class ScreenExtensionModel(answers: Answers) {
2222
val screen: String by answers
2323
val packageName: String by answers
2424
val id: String
25-
val descriptor: String
25+
val descriptorName: String
26+
val controllerName: String
2627

2728
init {
2829
if (screen == "login") {
29-
id = "loginWindow"
30-
descriptor = "ext-loginWindow"
30+
id = answers["screenId"] as String? ?: "loginWindow"
31+
descriptorName = answers["descriptorName"] as String? ?: "ext-loginWindow"
32+
controllerName = answers["controllerName"] as String? ?: "ExtAppLoginWindow"
3133
} else {
32-
id = "mainWindow"
33-
descriptor = "ext-mainwindow"
34+
id = answers["screenId"] as String? ?: "mainWindow"
35+
descriptorName = answers["descriptorName"] as String? ?: "ext-mainwindow"
36+
controllerName = answers["controllerName"] as String? ?: "ExtAppMainWindow"
3437
}
3538
}
3639

src/main/kotlin/com/haulmont/cuba/cli/registration/ScreenRegistrationHelper.kt

Lines changed: 23 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -42,24 +42,37 @@ class ScreenRegistrationHelper {
4242
}
4343
}
4444

45-
fun checkScreenId(screenId: String) {
46-
parse(screensXml).documentElement
45+
fun isScreenIdExists(screenId: String): Boolean {
46+
return parse(screensXml).documentElement
4747
.xpath("//screen[@id=\"$screenId\"]")
48-
.firstOrNull()?.let {
49-
throw CommandExecutionException("Screen with id \"$screenId\" already exists")
50-
}
48+
.firstOrNull() != null
5149
}
5250

53-
fun checkExistence(packageName: String, descriptor: String? = null, controller: String? = null) {
51+
fun isDescriptorExists(packageName: String, descriptor: String): Boolean {
52+
val packagePath = ProjectStructure().getModule(ModuleStructure.WEB_MODULE).resolvePackagePath(packageName)
53+
54+
return Files.exists(packagePath.resolve("$descriptor.xml"))
55+
}
56+
57+
fun isControllerExists(packageName: String, controller: String): Boolean {
5458
val packagePath = ProjectStructure().getModule(ModuleStructure.WEB_MODULE).resolvePackagePath(packageName)
5559

60+
return Files.exists(packagePath.resolve("$controller.java"))
61+
}
62+
63+
fun checkScreenId(screenId: String) {
64+
if (isScreenIdExists(screenId))
65+
throw CommandExecutionException("Screen with id \"$screenId\" already exists")
66+
}
67+
68+
fun checkExistence(packageName: String, descriptor: String? = null, controller: String? = null) {
5669
descriptor?.let {
57-
ensureFileAbsence(packagePath.resolve("$descriptor.xml"),
58-
cause = "Screen descriptor $packageName.$descriptor.xml already exists")
70+
if (isDescriptorExists(packageName, descriptor))
71+
throw CommandExecutionException("Screen descriptor $packageName.$descriptor.xml already exists")
5972
}
6073
controller?.let {
61-
ensureFileAbsence(packagePath.resolve("$controller.java"),
62-
cause = "Screen controller $packageName.$controller already exists")
74+
if (isControllerExists(packageName, controller))
75+
throw CommandExecutionException("Screen controller $packageName.$controller already exists")
6376
}
6477
}
6578

@@ -84,10 +97,4 @@ class ScreenRegistrationHelper {
8497
set("menu-config.$screenId", caption)
8598
}
8699
}
87-
88-
private fun ensureFileAbsence(file: Path, cause: String, silent: Boolean = false) {
89-
if (Files.exists(file))
90-
throw CommandExecutionException(cause, silent = silent)
91-
}
92-
93100
}

src/main/resources/com/haulmont/cuba/cli/cubaplugin/templates/screenExtension/login/modules/web/src/$[screen.packageName]/ExtAppLoginWindow.java renamed to src/main/resources/com/haulmont/cuba/cli/cubaplugin/templates/screenExtension/login/modules/web/src/$[screen.packageName]/${screen.controllerName}.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,5 +2,5 @@
22

33
import com.haulmont.cuba.web.app.loginwindow.AppLoginWindow;
44

5-
public class ExtAppLoginWindow extends AppLoginWindow {
5+
public class ${screen.controllerName} extends AppLoginWindow {
66
}

src/main/resources/com/haulmont/cuba/cli/cubaplugin/templates/screenExtension/login/modules/web/src/$[screen.packageName]/ext-loginWindow.xml renamed to src/main/resources/com/haulmont/cuba/cli/cubaplugin/templates/screenExtension/login/modules/web/src/$[screen.packageName]/${screen.descriptorName}.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
22
<window xmlns="http://schemas.haulmont.com/cuba/window.xsd"
3-
class="${screen.packageName}.ExtAppLoginWindow"
3+
class="${screen.packageName}.${screen.controllerName}"
44
extends="/com/haulmont/cuba/web/app/loginwindow/loginwindow.xml"
55
messagesPack="${screen.packageName}">
66
<dialogMode height="600"

src/main/resources/com/haulmont/cuba/cli/cubaplugin/templates/screenExtension/main/modules/web/src/$[screen.packageName]/ExtAppMainWindow.java renamed to src/main/resources/com/haulmont/cuba/cli/cubaplugin/templates/screenExtension/main/modules/web/src/$[screen.packageName]/${screen.controllerName}.java

File renamed without changes.

src/main/resources/com/haulmont/cuba/cli/cubaplugin/templates/screenExtension/main/modules/web/src/$[screen.packageName]/ext-mainwindow.xml renamed to src/main/resources/com/haulmont/cuba/cli/cubaplugin/templates/screenExtension/main/modules/web/src/$[screen.packageName]/${screen.descriptorName}.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
22
<window xmlns="http://schemas.haulmont.com/cuba/window.xsd"
3-
class="${screen.packageName}.ExtAppMainWindow"
3+
class="${screen.packageName}.${screen.controllerName}"
44
extends="/com/haulmont/cuba/web/app/mainwindow/mainwindow.xml"
55
messagesPack="${screen.packageName}"
66
xmlns:main="http://schemas.haulmont.com/cuba/mainwindow.xsd">

0 commit comments

Comments
 (0)