Skip to content

Commit 6d5c5b4

Browse files
authored
Merge pull request #17 from FindaDeveloper/dohun
Dohun ServerConfig String 값 추가 Action 구현
2 parents dfe0cbf + 64984a5 commit 6d5c5b4

File tree

11 files changed

+250
-3
lines changed

11 files changed

+250
-3
lines changed

build.gradle.kts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,13 @@ plugins {
99
// Kotlin support
1010
id("org.jetbrains.kotlin.jvm") version "1.4.30"
1111
// gradle-intellij-plugin - read more: https://github.com/JetBrains/gradle-intellij-plugin
12-
id("org.jetbrains.intellij") version "0.7.2"
12+
id("org.jetbrains.intellij") version "0.6.5"
1313
// gradle-changelog-plugin - read more: https://github.com/JetBrains/gradle-changelog-plugin
14-
id("org.jetbrains.changelog") version "1.1.2"
14+
id("org.jetbrains.changelog") version "1.0.1"
1515
// detekt linter - read more: https://detekt.github.io/detekt/gradle.html
1616
id("io.gitlab.arturbosch.detekt") version "1.15.0"
1717
// ktlint linter - read more: https://github.com/JLLeitschuh/ktlint-gradle
18-
id("org.jlleitschuh.gradle.ktlint") version "10.0.0"
18+
id("org.jlleitschuh.gradle.ktlint") version "9.4.1"
1919
}
2020

2121
// Import variables from gradle.properties file
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package kr.co.finda.androidtemplate.feature.addServerConfig
2+
3+
import com.intellij.openapi.actionSystem.AnAction
4+
import com.intellij.openapi.actionSystem.AnActionEvent
5+
import com.intellij.openapi.actionSystem.CommonDataKeys
6+
import com.intellij.openapi.project.Project
7+
import kr.co.finda.androidtemplate.feature.addServerConfig.dialog.AddServerConfigDialog
8+
import kr.co.finda.androidtemplate.type.ServerConfig
9+
import kr.co.finda.androidtemplate.util.ActionRouter
10+
import kr.co.finda.androidtemplate.util.ActionRouterImpl
11+
import kr.co.finda.androidtemplate.util.FileHelperImpl
12+
import kr.co.finda.androidtemplate.util.ReplacerImpl
13+
14+
class AddServerConfigAction : AnAction(), AddServerConfigContract.View {
15+
16+
private val presenter: AddServerConfigContract.Presenter by lazy {
17+
AddServerConfigPresenter(this, FileHelperImpl(ReplacerImpl()), ActionRouterImpl())
18+
}
19+
20+
override fun actionPerformed(e: AnActionEvent) {
21+
val selectedDirectory = e.getData(CommonDataKeys.VIRTUAL_FILE)!!
22+
presenter.onActionPerformed(e.project!!, selectedDirectory)
23+
}
24+
25+
override fun update(e: AnActionEvent) {
26+
val selectedDirectory = e.getData(CommonDataKeys.VIRTUAL_FILE)
27+
presenter.onActionUpdate(e, selectedDirectory)
28+
}
29+
30+
override fun showAddServerConfigDialog(project: Project, serverConfig: ServerConfig) {
31+
AddServerConfigDialog(project, serverConfig).show()
32+
}
33+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package kr.co.finda.androidtemplate.feature.addServerConfig
2+
3+
import com.intellij.openapi.actionSystem.AnActionEvent
4+
import com.intellij.openapi.project.Project
5+
import com.intellij.openapi.vfs.VirtualFile
6+
import kr.co.finda.androidtemplate.type.ServerConfig
7+
8+
interface AddServerConfigContract {
9+
10+
interface View {
11+
fun showAddServerConfigDialog(project: Project, serverConfig: ServerConfig)
12+
}
13+
14+
interface Presenter {
15+
fun onActionUpdate(e: AnActionEvent, selectedDirectory: VirtualFile?)
16+
17+
fun onActionPerformed(project: Project, selectedDirectory: VirtualFile)
18+
}
19+
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package kr.co.finda.androidtemplate.feature.addServerConfig
2+
3+
import com.intellij.openapi.actionSystem.AnActionEvent
4+
import com.intellij.openapi.project.Project
5+
import com.intellij.openapi.vfs.VirtualFile
6+
import kr.co.finda.androidtemplate.util.ActionRouter
7+
import kr.co.finda.androidtemplate.util.FileHelper
8+
9+
class AddServerConfigPresenter(
10+
private val view: AddServerConfigContract.View,
11+
private val fileHelper: FileHelper,
12+
private val actionRouter: ActionRouter
13+
) : AddServerConfigContract.Presenter {
14+
15+
override fun onActionPerformed(project: Project, selectedDirectory: VirtualFile) {
16+
val serverConfig = fileHelper.getServerConfig(project, selectedDirectory)
17+
view.showAddServerConfigDialog(project, serverConfig)
18+
}
19+
20+
override fun onActionUpdate(e: AnActionEvent, selectedDirectory: VirtualFile?) {
21+
e.presentation.isEnabledAndVisible =
22+
if (selectedDirectory == null) false
23+
else actionRouter.isAddServerConfigEnable(selectedDirectory)
24+
}
25+
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package kr.co.finda.androidtemplate.feature.addServerConfig.dialog
2+
3+
import com.intellij.openapi.project.Project
4+
import kr.co.finda.androidtemplate.type.ServerConfig
5+
6+
interface AddServerConfigContract {
7+
8+
interface View {
9+
10+
}
11+
12+
interface Presenter {
13+
fun onAddServerConfig(
14+
project: Project,
15+
propertyName: String,
16+
devValue: String,
17+
stgValue: String,
18+
uatValue: String,
19+
prdValue: String,
20+
serverConfig: ServerConfig
21+
)
22+
}
23+
}
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
package kr.co.finda.androidtemplate.feature.addServerConfig.dialog
2+
3+
import com.intellij.openapi.project.Project
4+
import com.intellij.openapi.ui.DialogWrapper
5+
import com.intellij.ui.components.JBTextField
6+
import com.intellij.util.ui.FormBuilder
7+
import kr.co.finda.androidtemplate.feature.createFindaTemplate.dialog.CreateFindaTemplateDialogContract
8+
import kr.co.finda.androidtemplate.type.ServerConfig
9+
import javax.swing.JComponent
10+
11+
class AddServerConfigDialog(
12+
private val project: Project,
13+
private val serverConfig: ServerConfig
14+
) : DialogWrapper(true), AddServerConfigContract.View {
15+
16+
private val presenter: AddServerConfigContract.Presenter by lazy {
17+
AddServerConfigPresenter(this)
18+
}
19+
20+
private val propertyNameTextField = JBTextField()
21+
private val devTextField = JBTextField()
22+
private val stgTextField = JBTextField()
23+
private val uatTextField = JBTextField()
24+
private val prdTextField = JBTextField()
25+
private val panel = FormBuilder.createFormBuilder()
26+
.addLabeledComponent("프로퍼티 이름:", propertyNameTextField)
27+
.addLabeledComponent("dev 값:", devTextField)
28+
.addLabeledComponent("stg 값:", stgTextField)
29+
.addLabeledComponent("uat 값:", uatTextField)
30+
.addLabeledComponent("prd 값:", prdTextField)
31+
.panel
32+
33+
init {
34+
init()
35+
title = "Add ServerConfig Property"
36+
}
37+
38+
override fun createCenterPanel(): JComponent? {
39+
return panel
40+
}
41+
42+
override fun doOKAction() {
43+
presenter.onAddServerConfig(
44+
project = project,
45+
propertyName = propertyNameTextField.text,
46+
devValue = devTextField.text,
47+
stgValue = stgTextField.text,
48+
uatValue = uatTextField.text,
49+
prdValue = prdTextField.text,
50+
serverConfig = serverConfig
51+
)
52+
super.doOKAction()
53+
}
54+
}
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
package kr.co.finda.androidtemplate.feature.addServerConfig.dialog
2+
3+
import com.intellij.openapi.command.WriteCommandAction
4+
import com.intellij.openapi.project.Project
5+
import com.intellij.psi.PsiClass
6+
import com.intellij.psi.PsiElement
7+
import com.intellij.psi.PsiElementFactory
8+
import kr.co.finda.androidtemplate.type.ServerConfig
9+
10+
class AddServerConfigPresenter(
11+
private val view: AddServerConfigContract.View,
12+
) : AddServerConfigContract.Presenter {
13+
14+
override fun onAddServerConfig(
15+
project: Project,
16+
propertyName: String,
17+
devValue: String,
18+
stgValue: String,
19+
uatValue: String,
20+
prdValue: String,
21+
serverConfig: ServerConfig
22+
) {
23+
WriteCommandAction.runWriteCommandAction(project) {
24+
serverConfig.dev.add(createFieldElement(project, propertyName, devValue))
25+
serverConfig.stg.add(createFieldElement(project, propertyName, stgValue))
26+
serverConfig.uat.add(createFieldElement(project, propertyName, uatValue))
27+
serverConfig.prd.add(createFieldElement(project, propertyName, prdValue))
28+
}
29+
}
30+
31+
private fun createFieldElement(project: Project, propertyName: String, value: String): PsiElement {
32+
val fieldText = "public static String $propertyName = \"${value}\""
33+
return PsiElementFactory.getInstance(project)
34+
.createFieldFromText(fieldText, null)
35+
}
36+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package kr.co.finda.androidtemplate.type
2+
3+
import com.intellij.psi.PsiClass
4+
5+
data class ServerConfig(
6+
val dev: PsiClass,
7+
val stg: PsiClass,
8+
val uat: PsiClass,
9+
val prd: PsiClass,
10+
)

src/main/kotlin/kr/co/finda/androidtemplate/util/ActionRouter.kt

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,14 @@
11
package kr.co.finda.androidtemplate.util
22

3+
import com.intellij.openapi.vfs.VirtualFile
4+
35
interface ActionRouter {
46

57
fun isCreateFindaTemplateEnable(path: String): Boolean
68

79
fun isCreateViewModelTestTemplateEnable(path: String): Boolean
10+
11+
fun isAddServerConfigEnable(directory: VirtualFile): Boolean
812
}
913

1014
class ActionRouterImpl : ActionRouter {
@@ -15,4 +19,10 @@ class ActionRouterImpl : ActionRouter {
1519
override fun isCreateViewModelTestTemplateEnable(path: String): Boolean {
1620
return path.contains("src/test/(java|kotlin)".toRegex())
1721
}
22+
23+
override fun isAddServerConfigEnable(directory: VirtualFile): Boolean {
24+
return directory.children.toList().any {
25+
it.name.contains("build.gradle")
26+
}
27+
}
1828
}

src/main/kotlin/kr/co/finda/androidtemplate/util/FileHelper.kt

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,16 @@
11
package kr.co.finda.androidtemplate.util
22

3+
import com.intellij.openapi.project.Project
34
import com.intellij.openapi.vfs.VfsUtil
45
import com.intellij.openapi.vfs.VirtualFile
56
import com.intellij.openapi.vfs.VirtualFileManager
7+
import com.intellij.psi.PsiClass
8+
import com.intellij.psi.PsiJavaFile
69
import com.intellij.util.ResourceUtil
710
import kr.co.finda.androidtemplate.ext.replaceAll
811
import kr.co.finda.androidtemplate.type.FileExtension
12+
import kr.co.finda.androidtemplate.type.ServerConfig
13+
import org.jetbrains.kotlin.idea.core.util.toPsiFile
914

1015
interface FileHelper {
1116

@@ -22,6 +27,8 @@ interface FileHelper {
2227
fun getPackageNameByPath(path: String): String
2328

2429
fun getLayoutDirectory(selectedDirectoryPath: String): VirtualFile?
30+
31+
fun getServerConfig(project: Project, directory: VirtualFile): ServerConfig
2532
}
2633

2734
class FileHelperImpl(
@@ -68,6 +75,30 @@ class FileHelperImpl(
6875
.findFileByUrl("file://${layoutPath}")
6976
}
7077

78+
override fun getServerConfig(project: Project, directory: VirtualFile): ServerConfig {
79+
return ServerConfig(
80+
dev = getServerConfigFileByFlavor(project, "dev", directory)!!,
81+
stg = getServerConfigFileByFlavor(project, "stg", directory)!!,
82+
uat = getServerConfigFileByFlavor(project, "uat", directory)!!,
83+
prd = getServerConfigFileByFlavor(project, "prd", directory)!!,
84+
)
85+
}
86+
87+
private fun getServerConfigFileByFlavor(project: Project, flavor: String, moduleDirectory: VirtualFile): PsiClass? {
88+
val psiFile =
89+
moduleDirectory.findOrCreateFileByRelativePath("src/${flavor}/java/kr/co/finda/finda/config/ServerConfig.java")
90+
.toPsiFile(project) as? PsiJavaFile
91+
92+
return psiFile?.children?.first { it.text.contains("ServerConfig") && it is PsiClass } as? PsiClass
93+
}
94+
95+
private fun VirtualFile.findOrCreateFileByRelativePath(relativePath: String): VirtualFile {
96+
return relativePath.split("/").fold(this) { virtualFile, s ->
97+
val child = virtualFile.findOrCreateChildData(this, s)
98+
child
99+
}
100+
}
101+
71102
private fun getTemplateContentByName(templateName: String): String {
72103
val templateFileInputStream = ResourceUtil.getResourceAsStream(
73104
javaClass.classLoader,

0 commit comments

Comments
 (0)