Skip to content

Commit e6a4936

Browse files
committed
Addressed comments
1 parent 2adec88 commit e6a4936

File tree

13 files changed

+101
-83
lines changed

13 files changed

+101
-83
lines changed

plugins/toolkit/jetbrains-core/src-253+/software/aws/toolkits/jetbrains/services/cfnlsp/stacks/views/OpenStackViewAction.kt

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import com.intellij.openapi.actionSystem.ActionUpdateThread
77
import com.intellij.openapi.actionSystem.AnAction
88
import com.intellij.openapi.actionSystem.AnActionEvent
99
import com.intellij.openapi.project.DumbAware
10+
import software.aws.toolkit.core.utils.getLogger
1011
import software.aws.toolkits.jetbrains.core.explorer.ExplorerTreeToolWindowDataKeys
1112
import software.aws.toolkits.jetbrains.services.cfnlsp.explorer.nodes.StackNode
1213
import software.aws.toolkits.resources.message
@@ -26,8 +27,16 @@ internal class OpenStackViewAction : AnAction(), DumbAware {
2627
val project = e.project ?: return
2728
val stackNode = getStackNode(e) ?: return
2829

29-
val stackName = stackNode.stack.stackName ?: return
30-
val stackId = stackNode.stack.stackId ?: return
30+
if (stackNode.stack.stackName == null) {
31+
LOG.error("Stack name is null for stack node")
32+
return
33+
}
34+
if (stackNode.stack.stackId == null) {
35+
LOG.error("Stack ID is null for stack node")
36+
return
37+
}
38+
val stackName = stackNode.stack.stackName
39+
val stackId = stackNode.stack.stackId
3140

3241
StackViewWindowManager.getInstance(project)
3342
.openStack(stackName, stackId)
@@ -37,4 +46,8 @@ internal class OpenStackViewAction : AnAction(), DumbAware {
3746
val selectedNodes = e.getData(ExplorerTreeToolWindowDataKeys.SELECTED_NODES)
3847
return selectedNodes?.singleOrNull() as? StackNode
3948
}
49+
50+
companion object {
51+
private val LOG = getLogger<OpenStackViewAction>()
52+
}
4053
}

plugins/toolkit/jetbrains-core/src-253+/software/aws/toolkits/jetbrains/services/cfnlsp/stacks/views/StackOverviewPanel.kt

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -30,14 +30,13 @@ import javax.swing.Box
3030
import javax.swing.JComponent
3131
import javax.swing.JPanel
3232

33-
class StackOverviewPanel(
33+
internal class StackOverviewPanel(
3434
project: Project,
3535
coordinator: StackViewCoordinator,
3636
private val stackArn: String,
3737
) : Disposable, StackPanelListener {
3838

39-
internal var clientServiceProvider: () -> CfnClientService = { CfnClientService.getInstance(project) }
40-
private val cfnClientService get() = clientServiceProvider()
39+
private val cfnClientService = CfnClientService.getInstance(project)
4140
private val disposables = mutableListOf<Disposable>()
4241

4342
internal val consoleLink = JBLabel(IconUtils.createBlueIcon(AllIcons.Ide.External_link_arrow)).apply {
@@ -74,7 +73,7 @@ class StackOverviewPanel(
7473
label.font = label.font.deriveFont(Font.PLAIN)
7574
}
7675

77-
statusValue.border = JBUI.Borders.empty(4, 8)
76+
statusValue.border = JBUI.Borders.empty(STATUS_PADDING_VERTICAL, STATUS_PADDING_HORIZONTAL)
7877
statusValue.horizontalAlignment = JBLabel.CENTER
7978
}
8079

@@ -135,7 +134,7 @@ class StackOverviewPanel(
135134
private fun createStackNamePanel(): JPanel = JBPanel<JBPanel<*>>().apply {
136135
layout = FlowLayout(FlowLayout.LEFT, 0, 0)
137136
add(stackNameValue)
138-
add(Box.createHorizontalStrut(8))
137+
add(Box.createHorizontalStrut(ICON_SPACING))
139138
add(consoleLink)
140139
}
141140

@@ -146,8 +145,8 @@ class StackOverviewPanel(
146145

147146
updateConditionalField(stackIdValue, stack.stackId.takeIf { it.isNotEmpty() })
148147
updateConditionalField(descriptionValue, stack.description?.takeIf { it.isNotEmpty() })
149-
updateConditionalField(createdValue, StackDateFormatter.formatDate(stack.creationTime))
150-
updateConditionalField(lastUpdatedValue, StackDateFormatter.formatDate(stack.lastUpdatedTime))
148+
updateConditionalField(createdValue, stack.creationTime?.let { StackDateFormatter.formatDate(it) })
149+
updateConditionalField(lastUpdatedValue, stack.lastUpdatedTime?.let { StackDateFormatter.formatDate(it) })
151150
updateConditionalField(statusReasonValue, stack.stackStatusReason?.takeIf { it.isNotEmpty() })
152151

153152
currentStackId = stack.stackId
@@ -164,7 +163,6 @@ class StackOverviewPanel(
164163
}
165164

166165
private fun renderError(message: String) {
167-
LOG.warn("Rendering error state: $message")
168166
stackNameValue.text = "Error"
169167
statusValue.text = "Error"
170168
stackIdValue.text = message
@@ -182,7 +180,7 @@ class StackOverviewPanel(
182180
statusValue.isOpaque = true
183181
statusValue.background = bgColor
184182
statusValue.foreground = fgColor
185-
statusValue.font = statusValue.font.deriveFont(12.0f)
183+
statusValue.font = statusValue.font.deriveFont(STATUS_FONT_SIZE)
186184
} else {
187185
resetStatusStyling()
188186
}
@@ -224,5 +222,9 @@ class StackOverviewPanel(
224222

225223
companion object {
226224
private val LOG = getLogger<StackOverviewPanel>()
225+
private const val STATUS_FONT_SIZE = 12.0f
226+
private const val ICON_SPACING = 8
227+
private const val STATUS_PADDING_VERTICAL = 4
228+
private const val STATUS_PADDING_HORIZONTAL = 8
227229
}
228230
}

plugins/toolkit/jetbrains-core/src-253+/software/aws/toolkits/jetbrains/services/cfnlsp/stacks/views/StackPanelLayoutBuilder.kt

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,14 +13,17 @@ import java.awt.GridBagLayout
1313
import javax.swing.JComponent
1414
import javax.swing.JPanel
1515

16-
object StackPanelLayoutBuilder {
16+
internal object StackPanelLayoutBuilder {
17+
18+
private const val DEFAULT_PADDING = 20
19+
private const val FIELD_SPACING = 12
1720

1821
fun createTitleLabel(text: String): JBLabel = JBLabel(text).apply {
1922
foreground = UIUtil.getContextHelpForeground() // Muted color like --vscode-descriptionForeground
2023
font = font.deriveFont(Font.BOLD) // Semi-bold like font-weight: 600
2124
}
2225

23-
fun createFormPanel(padding: Int = 20): JBPanel<JBPanel<*>> = JBPanel<JBPanel<*>>(GridBagLayout()).apply {
26+
fun createFormPanel(padding: Int = DEFAULT_PADDING): JBPanel<JBPanel<*>> = JBPanel<JBPanel<*>>(GridBagLayout()).apply {
2427
border = JBUI.Borders.empty(padding)
2528
}
2629

@@ -41,7 +44,7 @@ object StackPanelLayoutBuilder {
4144

4245
// Add component
4346
gbc.gridy = startRow + 1
44-
gbc.insets = if (isLast) JBUI.emptyInsets() else JBUI.insetsBottom(12)
47+
gbc.insets = if (isLast) JBUI.emptyInsets() else JBUI.insetsBottom(FIELD_SPACING)
4548
if (fillNone) {
4649
gbc.fill = GridBagConstraints.NONE
4750
gbc.anchor = GridBagConstraints.WEST

plugins/toolkit/jetbrains-core/src-253+/software/aws/toolkits/jetbrains/services/cfnlsp/stacks/views/StackEventPoller.kt renamed to plugins/toolkit/jetbrains-core/src-253+/software/aws/toolkits/jetbrains/services/cfnlsp/stacks/views/StackStatusPoller.kt

Lines changed: 17 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import software.aws.toolkits.jetbrains.services.cfnlsp.protocol.DescribeStackPar
1212
import java.util.Timer
1313
import java.util.TimerTask
1414

15-
internal class StackEventPoller(
15+
internal class StackStatusPoller(
1616
project: Project,
1717
private val stackName: String,
1818
private val stackArn: String, // Primary identifier
@@ -43,16 +43,14 @@ internal class StackEventPoller(
4343
}
4444
}
4545
},
46-
0, 5000L
46+
0, POLLING_INTERVAL_MS
4747
) // Poll every 5 seconds
4848
}
4949
}
5050

5151
fun stop() {
52-
if (pollingTimer != null) {
53-
pollingTimer?.cancel()
54-
pollingTimer = null
55-
}
52+
pollingTimer?.cancel()
53+
pollingTimer = null
5654
}
5755

5856
private fun fetchStackData() {
@@ -63,15 +61,18 @@ internal class StackEventPoller(
6361
if (error != null) {
6462
LOG.warn("Error fetching stack data for $stackName: ${error.message}")
6563
} else {
66-
result?.stack?.let { stack ->
67-
coordinator.updateStackStatus(stackArn, stack.stackStatus)
64+
if (result?.stack == null) {
65+
LOG.warn("No stack data received for $stackName")
66+
return@invokeLater
67+
}
68+
val stack = result.stack
69+
coordinator.updateStackStatus(stackArn, stack.stackStatus)
6870

69-
// Stop polling if stack reaches terminal state
70-
if (!StackStatusUtils.isInTransientState(stack.stackStatus)) {
71-
LOG.info("Stack $stackName reached terminal state: ${stack.stackStatus}, stopping polling")
72-
stop()
73-
}
74-
} ?: LOG.warn("No stack data received for $stackName")
71+
// Stop polling if stack reaches terminal state
72+
if (!StackStatusUtils.isInTransientState(stack.stackStatus)) {
73+
LOG.info("Stack $stackName reached terminal state: ${stack.stackStatus}, stopping polling")
74+
stop()
75+
}
7576
}
7677
}
7778
}
@@ -82,6 +83,7 @@ internal class StackEventPoller(
8283
}
8384

8485
companion object {
85-
private val LOG = getLogger<StackEventPoller>()
86+
private val LOG = getLogger<StackStatusPoller>()
87+
private const val POLLING_INTERVAL_MS = 5000L
8688
}
8789
}

plugins/toolkit/jetbrains-core/src-253+/software/aws/toolkits/jetbrains/services/cfnlsp/stacks/views/StackViewCoordinator.kt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,15 +12,15 @@ import java.time.Instant
1212
import java.util.concurrent.ConcurrentHashMap
1313
import java.util.concurrent.CopyOnWriteArrayList
1414

15-
interface StackSelectionListener {
15+
internal interface StackSelectionListener {
1616
fun onStackChanged(stackArn: String, stackName: String?)
1717
}
1818

19-
interface StackStatusListener {
19+
internal interface StackStatusListener {
2020
fun onStackStatusChanged(stackArn: String, status: String?)
2121
}
2222

23-
interface StackPanelListener : StackSelectionListener, StackStatusListener
23+
internal interface StackPanelListener : StackSelectionListener, StackStatusListener
2424

2525
data class StackState(
2626
val stackName: String,
@@ -30,7 +30,7 @@ data class StackState(
3030
)
3131

3232
@Service(Service.Level.PROJECT)
33-
class StackViewCoordinator : Disposable {
33+
internal class StackViewCoordinator : Disposable {
3434
private val stackStates = ConcurrentHashMap<String, StackState>()
3535
private val listeners = ConcurrentHashMap<String, CopyOnWriteArrayList<StackPanelListener>>()
3636

plugins/toolkit/jetbrains-core/src-253+/software/aws/toolkits/jetbrains/services/cfnlsp/stacks/views/StackViewPanelTabber.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ internal class StackViewPanelTabber(
1919
) : Disposable {
2020

2121
private val coordinator = StackViewCoordinator.getInstance(project)
22-
private val poller = StackEventPoller(project, stackName, stackArn, coordinator)
22+
private val poller = StackStatusPoller(project, stackName, stackArn, coordinator)
2323
private val overviewPanel = StackOverviewPanel(project, coordinator, stackArn)
2424

2525
private val tabbedPane = JBTabbedPane().apply {

plugins/toolkit/jetbrains-core/src-253+/software/aws/toolkits/jetbrains/services/cfnlsp/stacks/views/StackViewWindowManager.kt

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -16,18 +16,17 @@ import software.aws.toolkit.core.utils.getLogger
1616
import java.util.concurrent.ConcurrentHashMap
1717

1818
@Service(Service.Level.PROJECT)
19-
class StackViewWindowManager(private val project: Project) {
19+
internal class StackViewWindowManager(private val project: Project) {
2020

2121
private val activeStacks = ConcurrentHashMap<String, StackViewPanelTabber>()
22-
private val maxTabs = 10
2322
private var listenerRegistered = false
2423

2524
fun openStack(stackName: String, stackId: String) {
2625
val toolWindowManager = ToolWindowManager.getInstance(project)
27-
val toolWindow = toolWindowManager.getToolWindow("cloudformation.lsp.stack.view")
26+
val toolWindow = toolWindowManager.getToolWindow(TOOL_WINDOW_ID)
2827

2928
if (toolWindow == null) {
30-
LOG.error("Tool window 'cloudformation.lsp.stack.view' not found")
29+
LOG.error("Tool window '$TOOL_WINDOW_ID' not found")
3130
return
3231
}
3332

@@ -52,7 +51,7 @@ class StackViewWindowManager(private val project: Project) {
5251
return
5352
}
5453

55-
if (contentManager.contentCount >= maxTabs) {
54+
if (contentManager.contentCount >= MAX_TABS) {
5655
removeOldestTab()
5756
}
5857

@@ -107,7 +106,7 @@ class StackViewWindowManager(private val project: Project) {
107106
} else {
108107
stackName
109108
}
110-
content.setDisplayName(displayName)
109+
content.displayName = displayName
111110
}
112111
}
113112
}
@@ -123,7 +122,7 @@ class StackViewWindowManager(private val project: Project) {
123122

124123
private fun removeOldestTab() {
125124
val toolWindowManager = ToolWindowManager.getInstance(project)
126-
val toolWindow = toolWindowManager.getToolWindow("cloudformation.lsp.stack.view") ?: return
125+
val toolWindow = toolWindowManager.getToolWindow(TOOL_WINDOW_ID) ?: return
127126
val contentManager = toolWindow.contentManager
128127

129128
if (contentManager.contentCount > 0) {
@@ -141,6 +140,9 @@ class StackViewWindowManager(private val project: Project) {
141140
private val LOG = getLogger<StackViewWindowManager>()
142141
private val STACK_ARN_KEY = Key.create<String>("STACK_ARN")
143142

143+
private const val MAX_TABS = 10
144+
private const val TOOL_WINDOW_ID = "cloudformation.lsp.stack.view"
145+
144146
fun getInstance(project: Project): StackViewWindowManager = project.service()
145147
}
146148
}

plugins/toolkit/jetbrains-core/src-253+/software/aws/toolkits/jetbrains/services/cfnlsp/stacks/views/Utils.kt

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import java.time.Instant
1010
import java.time.ZoneId
1111
import java.time.format.DateTimeFormatter
1212

13-
object StackStatusUtils {
13+
internal object StackStatusUtils {
1414
fun getStatusColors(status: String): Pair<Color?, Color?> = when {
1515
status.contains("COMPLETE") && !status.contains("ROLLBACK") ->
1616
JBColor.GREEN to JBColor.BLACK
@@ -24,15 +24,13 @@ object StackStatusUtils {
2424
fun isInTransientState(status: String): Boolean = status.contains("_IN_PROGRESS")
2525
}
2626

27-
object StackDateFormatter {
27+
internal object StackDateFormatter {
2828
private val LOG = getLogger<StackDateFormatter>()
2929
private val dateFormatter = DateTimeFormatter.ofPattern("d/M/yyyy, h:mm:ss a")
3030

31-
fun formatDate(dateString: String?): String? = try {
32-
dateString?.let {
33-
val instant = Instant.parse(it)
34-
instant.atZone(ZoneId.systemDefault()).format(dateFormatter)
35-
}
31+
fun formatDate(dateString: String): String? = try {
32+
val instant = Instant.parse(dateString)
33+
instant.atZone(ZoneId.systemDefault()).format(dateFormatter)
3634
} catch (e: Exception) {
3735
LOG.warn("Failed to parse date string: $dateString", e)
3836
null

plugins/toolkit/jetbrains-core/src-253+/software/aws/toolkits/jetbrains/services/cfnlsp/ui/Utils.kt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,12 @@ import java.net.URLEncoder
1111
import javax.swing.Icon
1212
import javax.swing.ImageIcon
1313

14-
object ConsoleUrlGenerator {
15-
fun generateUrl(stackId: String): String =
16-
"https://console.aws.amazon.com/go/view?arn=${URLEncoder.encode(stackId, "UTF-8")}"
14+
internal object ConsoleUrlGenerator {
15+
fun generateUrl(arn: String): String =
16+
"https://console.aws.amazon.com/go/view?arn=${URLEncoder.encode(arn, "UTF-8")}"
1717
}
1818

19-
object IconUtils {
19+
internal object IconUtils {
2020
fun createBlueIcon(originalIcon: Icon): Icon {
2121
val size = 16
2222
val image = UIUtil.createImage(size, size, BufferedImage.TYPE_INT_ARGB)

plugins/toolkit/jetbrains-core/src-253+/software/aws/toolkits/jetbrains/services/cfnlsp/ui/WrappingTextArea.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import com.intellij.ui.components.JBTextArea
77
import java.awt.Dimension
88
import java.awt.Font
99

10-
class WrappingTextArea(text: String) : JBTextArea(text) {
10+
internal class WrappingTextArea(text: String) : JBTextArea(text) {
1111
init {
1212
isEditable = false
1313
isOpaque = false

0 commit comments

Comments
 (0)