Skip to content

Commit 4d618aa

Browse files
authored
Fixing bug with doc links for resources (#2901)
1 parent 8de5eb8 commit 4d618aa

File tree

6 files changed

+32
-22
lines changed

6 files changed

+32
-22
lines changed
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
{
2+
"type" : "bugfix",
3+
"description" : "Fix null exception when view documentation action executed for types with missing doc urls"
4+
}

jetbrains-core/src/software/aws/toolkits/jetbrains/services/dynamic/DynamicResourceFileActionProvider.kt

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -52,9 +52,12 @@ class DynamicResourceFileActionProvider :
5252
class DynamicResourceVirtualFilePanel(project: Project, file: DynamicResourceVirtualFile, text: String, actionId: String) : EditorNotificationPanel() {
5353
init {
5454
text(text)
55-
createActionLabel(message("dynamic_resources.type.explorer.view_documentation")) {
56-
openBrowser(file.dynamicResourceType, project)
55+
DynamicResourceSupportedTypes.getInstance().getDocs(file.dynamicResourceType)?.let { docUrl ->
56+
createActionLabel(message("dynamic_resources.type.explorer.view_documentation")) {
57+
BrowserLauncher.instance.browse(docUrl, project = project)
58+
}
5759
}
60+
5861
val action = ActionManager.getInstance().getAction(actionId)
5962
createActionLabel(action.templateText) {
6063
executeAction(actionId)
@@ -65,8 +68,5 @@ class DynamicResourceFileActionProvider :
6568

6669
companion object {
6770
val KEY = Key.create<DynamicResourceVirtualFilePanel>("software.aws.toolkits.jetbrains.core.dynamic.resource.file.actions")
68-
69-
fun openBrowser(resourceType: String, project: Project) =
70-
BrowserLauncher.instance.browse(DynamicResourceSupportedTypes.getInstance().getDocs(resourceType), project = project)
7171
}
7272
}

jetbrains-core/src/software/aws/toolkits/jetbrains/services/dynamic/DynamicResourceSupportedTypes.kt

Lines changed: 11 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -6,29 +6,26 @@ package software.aws.toolkits.jetbrains.services.dynamic
66
import com.fasterxml.jackson.databind.DeserializationFeature
77
import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper
88
import com.fasterxml.jackson.module.kotlin.readValue
9-
import com.intellij.openapi.application.ApplicationManager
109
import com.intellij.openapi.components.service
10+
import software.aws.toolkits.jetbrains.utils.runUnderProgressIfNeeded
11+
import software.aws.toolkits.resources.message
1112

1213
class DynamicResourceSupportedTypes {
1314

14-
private val docs = mutableMapOf<String, String>()
15-
private val mapper = jacksonObjectMapper().disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES)
16-
private val supportedTypes = if (ApplicationManager.getApplication().isDispatchThread) {
17-
throw IllegalStateException("Access from Event Dispatch Thread")
18-
} else {
19-
this.javaClass.getResourceAsStream("/cloudapi/dynamic_resources.json")?.use { resourceStream ->
20-
val resourceDetails = mapper.readValue<Map<String, ResourceDetails>>(resourceStream)
21-
.filter { it.value.operations.contains(PermittedOperation.LIST) }
22-
resourceDetails.forEach { docs[it.key] = it.value.documentation.toString() }
23-
resourceDetails.map { it.key }
24-
} ?: throw RuntimeException("dynamic resource manifest not found")
15+
private val supportedTypes by lazy {
16+
runUnderProgressIfNeeded(null, message("dynamic_resources.loading_manifest"), cancelable = false) {
17+
this.javaClass.getResourceAsStream("/cloudapi/dynamic_resources.json")?.use { resourceStream ->
18+
MAPPER.readValue<Map<String, ResourceDetails>>(resourceStream)
19+
} ?: throw RuntimeException("dynamic resource manifest not found")
20+
}
2521
}
2622

27-
fun getSupportedTypes(): List<String> = supportedTypes
23+
fun getSupportedTypes(): List<String> = supportedTypes.filterValues { it.operations.contains(PermittedOperation.LIST) }.keys.toList()
2824

29-
fun getDocs(resourceType: String): String = docs[resourceType] ?: throw RuntimeException("dynamic resource manifest doesn't have doc link")
25+
fun getDocs(resourceType: String) = supportedTypes[resourceType]?.documentation
3026

3127
companion object {
3228
fun getInstance(): DynamicResourceSupportedTypes = service()
29+
private val MAPPER = jacksonObjectMapper().disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES)
3330
}
3431
}

jetbrains-core/src/software/aws/toolkits/jetbrains/services/dynamic/explorer/DynamicResourceServiceNode.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ import software.aws.toolkits.resources.message
2828
import software.aws.toolkits.telemetry.DynamicresourceTelemetry
2929
import software.aws.toolkits.telemetry.Result
3030

31-
class DynamicResourceResourceTypeNode(project: Project, private val resourceType: String) :
31+
class DynamicResourceResourceTypeNode(project: Project, val resourceType: String) :
3232
AwsExplorerNode<String>(project, resourceType, null),
3333
ResourceParentNode,
3434
ResourceActionNode {

jetbrains-core/src/software/aws/toolkits/jetbrains/services/dynamic/explorer/actions/ViewDocumentationAction.kt

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,22 @@
33

44
package software.aws.toolkits.jetbrains.services.dynamic.explorer.actions
55

6+
import com.intellij.ide.browsers.BrowserLauncher
67
import com.intellij.openapi.actionSystem.AnActionEvent
78
import software.aws.toolkits.jetbrains.core.explorer.actions.SingleExplorerNodeAction
8-
import software.aws.toolkits.jetbrains.services.dynamic.DynamicResourceFileActionProvider
9+
import software.aws.toolkits.jetbrains.services.dynamic.DynamicResourceSupportedTypes
910
import software.aws.toolkits.jetbrains.services.dynamic.explorer.DynamicResourceResourceTypeNode
1011
import software.aws.toolkits.resources.message
1112

1213
class ViewDocumentationAction : SingleExplorerNodeAction<DynamicResourceResourceTypeNode>(message("dynamic_resources.type.explorer.view_documentation")) {
14+
private val supportedType = DynamicResourceSupportedTypes.getInstance()
1315
override fun actionPerformed(selected: DynamicResourceResourceTypeNode, e: AnActionEvent) {
14-
DynamicResourceFileActionProvider.openBrowser(selected.value, selected.nodeProject)
16+
supportedType.getDocs(selected.resourceType)?.let { docUrl ->
17+
BrowserLauncher.instance.browse(docUrl, project = e.project)
18+
}
19+
}
20+
21+
override fun update(selected: DynamicResourceResourceTypeNode, e: AnActionEvent) {
22+
e.presentation.isEnabledAndVisible = supportedType.getDocs(selected.resourceType) != null
1523
}
1624
}

resources/resources/software/aws/toolkits/resources/MessagesBundle.properties

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -454,6 +454,7 @@ dynamic_resources.fetch.fail.title=Open resource model
454454
dynamic_resources.fetch.fetch=Retrieving model
455455
dynamic_resources.fetch.indicator_title=Open resource model for {0}
456456
dynamic_resources.fetch.open=Opening model in IDE
457+
dynamic_resources.loading_manifest=Loading AWS resource manifest
457458
dynamic_resources.openFileForUpdate_text=Update resource...
458459
dynamic_resources.openReadOnlyFile_text=View Resource
459460
dynamic_resources.operation_status_failed=Failed to {1} {0}: {2}

0 commit comments

Comments
 (0)