Skip to content
This repository was archived by the owner on Nov 6, 2024. It is now read-only.

Commit d5d042f

Browse files
committed
BCE-38714 - [Configurations] Configuration screen overhaul
1 parent b0c6d7e commit d5d042f

26 files changed

+365
-292
lines changed

CHANGELOG.md

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,19 @@
22

33
# checkov-jetbrains-idea Changelog
44

5-
## [1.0.22] - 2024-09-10
5+
## [1.0.22] - 2024-09-15
66

77
### Added
88

99
- Added a new 'show logs' button in the plugin panel that opens the plugin log file
10+
- Added validations to user input in the configuration screen
11+
- Added a `test connection` button in the configuration screen
1012

1113
### Misc
1214

1315
- Upgraded gradle version to 8.10.1
1416
- Migrated the IntelliJ platform plugin to version 2.0.1
17+
- Refactored `ApiClient` (now `PrismaApiClient`) and `AnalyticsService` (*Work in progress*)
1518

1619
## [1.0.21] - 2024-08-29
1720

build.gradle.kts

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,18 +3,20 @@ import org.gradle.api.tasks.testing.logging.TestLogEvent
33
import org.jetbrains.changelog.Changelog
44
import org.jetbrains.changelog.markdownToHTML
55
import org.jetbrains.intellij.platform.gradle.TestFrameworkType
6+
import org.jetbrains.kotlin.gradle.dsl.JvmTarget
7+
import org.jetbrains.kotlin.gradle.dsl.KotlinVersion
68
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
79

810
fun properties(key: String): String = project.findProperty(key).toString()
911

1012
plugins {
1113
id("java") // Java support
1214
alias(libs.plugins.kotlin) // Kotlin support
15+
// alias(libs.plugins.kotlinSerialization) // Kotlin serialization support
1316
alias(libs.plugins.intelliJPlatform) // IntelliJ Platform Gradle Plugin
1417
alias(libs.plugins.changelog) // Gradle Changelog Plugin
1518
alias(libs.plugins.qodana) // Gradle Qodana Plugin
1619
alias(libs.plugins.kover) // Gradle Kover Plugin
17-
kotlin("plugin.serialization") version "1.9.25"
1820
}
1921

2022
group = properties("pluginGroup")
@@ -38,9 +40,13 @@ dependencies {
3840
implementation("org.json:json:20231013")
3941
implementation("commons-io:commons-io:2.11.0")
4042
implementation("io.github.java-diff-utils:java-diff-utils:4.12")
41-
implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.5.1")
4243
implementation("org.slf4j:slf4j-api:2.0.16")
4344
implementation("ch.qos.logback:logback-classic:1.5.6")
45+
implementation(libs.springWeb)
46+
// implementation(libs.kotlinxSerializationJson)
47+
implementation(libs.jackson)
48+
compileOnly(libs.lombok)
49+
annotationProcessor(libs.lombok)
4450
testImplementation(libs.junit)
4551
testImplementation(libs.jupiterApi)
4652
testRuntimeOnly("org.junit.jupiter:junit-jupiter:5.8.1")
@@ -118,7 +124,10 @@ tasks {
118124
targetCompatibility = it
119125
}
120126
withType<KotlinCompile> {
121-
kotlinOptions.jvmTarget = it
127+
compilerOptions {
128+
jvmTarget = JvmTarget.fromTarget(it)
129+
apiVersion = KotlinVersion.KOTLIN_2_0
130+
}
122131
}
123132
}
124133

gradle.properties

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,8 @@ pluginVerifierIdeVersions=2020.3.4, 2021.1.3, 2021.2.4, 2024.1.6
1111
platformType = IC
1212
# Supported build number ranges and IntelliJ Platform versions -> https://plugins.jetbrains.com/docs/intellij/build-number-ranges.html
1313
pluginSinceBuild=203
14-
pluginUntilBuild=242
15-
platformVersion=2024.1.6
14+
pluginUntilBuild=242.*
15+
platformVersion=2024.2.1
1616
platformDownloadSources = true
1717
# Plugin Dependencies -> https://plugins.jetbrains.com/docs/intellij/plugin-dependencies.html
1818
# Example: platformPlugins = com.intellij.java, com.jetbrains.php:203.4449.22

gradle/libs.versions.toml

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,32 @@
11
[versions]
2+
23
# libraries
4+
lombok = "1.18.34"
35
junit = "4.13.2"
46
jupiterApi = "5.8.1"
7+
springWeb = "6.1.12"
8+
jackson = "2.17.2"
9+
# kotlinxSerializationJson = "1.7.2"
510

611
# plugins
712
changelog = "2.2.1"
813
intelliJPlatform = "2.0.1"
9-
kotlin = "1.9.25"
14+
kotlin = "2.0.20"
1015
kover = "0.8.3"
1116
qodana = "0.1.13"
1217

1318
[libraries]
19+
jackson = { group = "com.fasterxml.jackson.module", name = "jackson-module-kotlin", version.ref = "jackson"}
20+
# kotlinxSerializationJson = { group = "org.jetbrains.kotlinx", name = "kotlinx-serialization-json", version.ref = "kotlinxSerializationJson"}
21+
lombok = { group = "org.projectlombok", name = "lombok", version.ref = "lombok" }
1422
junit = { group = "junit", name = "junit", version.ref = "junit" }
1523
jupiterApi = { group = "org.junit.jupiter", name = "junit-jupiter-api", version.ref = "jupiterApi" }
24+
springWeb = { group = "org.springframework", name = "spring-web", version.ref = "springWeb" }
1625

1726
[plugins]
1827
changelog = { id = "org.jetbrains.changelog", version.ref = "changelog" }
1928
intelliJPlatform = { id = "org.jetbrains.intellij.platform", version.ref = "intelliJPlatform" }
2029
kotlin = { id = "org.jetbrains.kotlin.jvm", version.ref = "kotlin" }
30+
# kotlinSerialization = { id = "org.jetbrains.kotlin.plugin.serialization", version.ref = "kotlin" }
2131
kover = { id = "org.jetbrains.kotlinx.kover", version.ref = "kover" }
22-
qodana = { id = "org.jetbrains.qodana", version.ref = "qodana" }
32+
qodana = { id = "org.jetbrains.qodana", version.ref = "qodana" }

src/main/java/com/bridgecrew/util/ApplicationServiceUtil.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
11
package com.bridgecrew.util;
22

33
import com.intellij.openapi.application.ApplicationManager;
4+
import lombok.experimental.UtilityClass;
45
import org.slf4j.Logger;
56
import org.slf4j.LoggerFactory;
67

8+
@UtilityClass
79
public class ApplicationServiceUtil {
810

9-
private final static Logger logger = LoggerFactory.getLogger(ApplicationServiceUtil.class);
11+
private static final Logger logger = LoggerFactory.getLogger(ApplicationServiceUtil.class);
1012

1113
public static <T> T getService(Class<T> clazz) {
1214
T service = ApplicationManager.getApplication().getService(clazz);

src/main/kotlin/com/bridgecrew/activities/PostStartupActivity.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ class PostStartupActivity : ProjectActivity {
2626
override suspend fun execute(project: Project) {
2727
val version = PluginManagerCore.getPlugin(PluginId.getId("com.github.bridgecrewio.prismacloud"))?.version
2828
logger.info("Starting Prisma Cloud JetBrains plugin version $version")
29-
project.messageBus.connect(project).subscribe(INITIALIZATION_TOPIC, object : InitializationListener {
29+
project.messageBus.connect().subscribe(INITIALIZATION_TOPIC, object : InitializationListener {
3030
override fun initializationCompleted() {
3131
project.service<CheckovToolWindowManagerPanel>().subscribeToInternalEvents(project)
3232
project.service<CheckovToolWindowManagerPanel>().subscribeToProjectEventChange()

src/main/kotlin/com/bridgecrew/analytics/AnalyticsDataEvents.kt

Lines changed: 28 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -3,85 +3,67 @@ package com.bridgecrew.analytics
33
import com.bridgecrew.cache.InMemCache
44
import com.bridgecrew.settings.PLUGIN_NAME
55
import com.bridgecrew.settings.PrismaSettingsState
6-
import com.google.gson.annotations.Expose
6+
import com.fasterxml.jackson.annotation.JsonFormat
7+
import com.fasterxml.jackson.annotation.JsonIgnore
78
import com.intellij.ide.plugins.PluginManagerCore
89
import com.intellij.openapi.application.ApplicationInfo
910
import com.intellij.openapi.extensions.PluginId
10-
import kotlinx.serialization.EncodeDefault
11-
import kotlinx.serialization.ExperimentalSerializationApi
12-
import kotlinx.serialization.Serializable
13-
import kotlinx.serialization.Transient
14-
import kotlinx.serialization.json.JsonObject
1511
import java.util.*
1612

13+
open class AnalyticsData {
14+
15+
val pluginName: String = PLUGIN_NAME
1716

18-
@OptIn(ExperimentalSerializationApi::class)
19-
@Serializable
20-
sealed class AnalyticsData(@EncodeDefault val pluginName: String = PLUGIN_NAME) {
21-
22-
@EncodeDefault
2317
val installationId: String = PrismaSettingsState().getInstance()!!.installationId
2418

25-
@EncodeDefault
26-
var pluginVersion: String? =
27-
PluginManagerCore.getPlugin(PluginId.getId("com.github.bridgecrewio.prismacloud"))?.version
19+
val pluginVersion: String? = PluginManagerCore.getPlugin(PluginId.getId("com.github.bridgecrewio.prismacloud"))?.version
2820

29-
@EncodeDefault
30-
var ideVersion: String? =
31-
ApplicationInfo.getInstance().fullApplicationName + " / " + ApplicationInfo.getInstance().build
21+
val ideVersion: String = ApplicationInfo.getInstance().fullApplicationName + " / " + ApplicationInfo.getInstance().build
3222

33-
@EncodeDefault
34-
var operatingSystem: String? = System.getProperty("os.name") + " " + System.getProperty("os.version")
23+
val operatingSystem: String = System.getProperty("os.name") + " " + System.getProperty("os.version")
3524

36-
@EncodeDefault
37-
var checkovVersion: String? = InMemCache.get("checkovVersion")
25+
val checkovVersion: String? = InMemCache.get("checkovVersion")
3826

39-
@Serializable
4027
lateinit var eventType: String
4128

42-
@Serializable(with = DateSerializer::class)
29+
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss.SSSZ", locale = "en")
4330
lateinit var eventTime: Date
4431

45-
abstract val eventData: Any
32+
open var eventData: MutableMap<String, *> = mutableMapOf<String, Any>()
4633

4734
}
4835

49-
@Serializable
50-
data class FullScanAnalyticsData(@Transient val scanNumber: Int = 0): AnalyticsData() {
51-
@Transient
36+
data class FullScanAnalyticsData(@JsonIgnore val scanNumber: Int = 0): AnalyticsData() {
37+
38+
@JsonIgnore
5239
lateinit var buttonPressedTime: Date
5340

54-
@Transient
41+
@JsonIgnore
5542
lateinit var scanStartedTime: Date
5643

57-
@Transient
44+
@JsonIgnore
5845
val frameworksScanTime: MutableMap<String, FullScanFrameworkScanTimeData> = mutableMapOf()
5946

60-
@Expose
61-
override lateinit var eventData: MutableMap<String, FullScanFrameworkScanTimeData>
62-
63-
@Transient
47+
@JsonIgnore
6448
lateinit var scanFinishedTime: Date
6549

66-
@Transient
50+
@JsonIgnore
6751
lateinit var resultsWereFullyDisplayedTime: Date
6852

53+
@JsonIgnore
6954
fun isFullScanFinished() = ::scanFinishedTime.isInitialized
55+
56+
@JsonIgnore
7057
fun isFullScanStarted() = ::scanStartedTime.isInitialized
7158
}
7259

73-
@OptIn(ExperimentalSerializationApi::class)
74-
@Serializable
75-
data class PluginInstallAnalyticsData(
76-
@EncodeDefault override val eventData: JsonObject = JsonObject(mapOf())
77-
) : AnalyticsData()
78-
79-
@Serializable
80-
data class FullScanFrameworkScanTimeData(
81-
@Serializable(with = DateSerializer::class)
82-
val startTime: Date
83-
) {
84-
@Serializable(with = DateSerializer::class)
60+
class FullScanFrameworkScanTimeData {
61+
62+
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss.SSSZ", locale = "en")
63+
val startTime: Date = Date()
64+
65+
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss.SSSZ", locale = "en")
8566
var endTime: Date = Date()
67+
8668
var totalTimeSeconds = 0L
8769
}

src/main/kotlin/com/bridgecrew/analytics/AnalyticsService.kt

Lines changed: 25 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,32 @@
11
package com.bridgecrew.analytics
22

3-
import com.bridgecrew.api.ApiClient
3+
import com.bridgecrew.api.PrismaApiClient
44
import com.bridgecrew.cache.CacheDataAnalytics
55
import com.bridgecrew.scheduler.IntervalRunner
66
import com.bridgecrew.services.scan.FullScanStateService
77
import com.bridgecrew.services.scan.ScanTaskResult
8-
import com.bridgecrew.settings.PrismaSettingsState
8+
import com.bridgecrew.util.ApplicationServiceUtil
99
import com.intellij.openapi.components.Service
1010
import com.intellij.openapi.components.service
1111
import com.intellij.openapi.project.Project
12-
import kotlinx.serialization.encodeToString
13-
import kotlinx.serialization.json.Json
1412
import org.slf4j.LoggerFactory
1513
import java.text.SimpleDateFormat
1614
import java.util.*
1715
import java.util.concurrent.TimeUnit
1816

19-
@Service
17+
// TODO:
18+
// This service should be an application level service, but it requires a major refactor with how it handles
19+
// FullScanStateService and CacheDataAnalytics on a project level
20+
@Service(Service.Level.PROJECT)
2021
class AnalyticsService(val project: Project) {
2122

2223
private val logger = LoggerFactory.getLogger(javaClass)
23-
private var apiClient: ApiClient? = null
24+
private val analyticsReleaseTask = IntervalRunner("Analytics")
2425

2526
private var fullScanData: FullScanAnalyticsData? = null
2627
private var fullScanNumber = 0
2728

28-
private var analyticsEventData: MutableList<String> = arrayListOf()
29+
private var analyticsEventData: MutableList<AnalyticsData> = mutableListOf()
2930

3031
var wereFullScanResultsDisplayed = false
3132
var wereSingleFileScanResultsDisplayed = false
@@ -47,7 +48,7 @@ class AnalyticsService(val project: Project) {
4748

4849
fun fullScanByFrameworkStarted(framework: String) {
4950
logger.info("Prisma Cloud Plugin Analytics - scan #${fullScanNumber} - full scan started for framework $framework")
50-
fullScanData!!.frameworksScanTime[framework] = FullScanFrameworkScanTimeData(Date())
51+
fullScanData!!.frameworksScanTime[framework] = FullScanFrameworkScanTimeData()
5152
}
5253

5354
fun fullScanByFrameworkFinished(framework: String) {
@@ -153,14 +154,18 @@ class AnalyticsService(val project: Project) {
153154
return "${minutes}:${secondsString}"
154155
}
155156

156-
fun releaseAnalytics() {
157-
val apiClient = getApiClient() ?: return
157+
fun stopAnalyticsService() {
158+
logger.info("Analytics service for project ${project.name} is stopping, releasing all analytics")
159+
analyticsReleaseTask.stop()
160+
releaseAnalytics()
161+
}
162+
163+
private fun releaseAnalytics() {
164+
val apiClient = ApplicationServiceUtil.getService(PrismaApiClient::class.java) ?: return
158165
if (analyticsEventData.isEmpty()) {
159166
return
160167
}
161-
162-
val data = analyticsEventData.joinToString(prefix = "[", postfix = "]")
163-
val isReleased = apiClient.putDataAnalytics(data)
168+
val isReleased = apiClient.putDataAnalytics(analyticsEventData)
164169
if (isReleased) {
165170
analyticsEventData.clear()
166171
}
@@ -169,45 +174,30 @@ class AnalyticsService(val project: Project) {
169174
}
170175

171176
fun startSchedulerReleasingAnalytics(){
172-
val apiClient = getApiClient() ?: return
177+
val apiClient = ApplicationServiceUtil.getService(PrismaApiClient::class.java) ?: return
173178
val config = apiClient.getConfig()
174179
CacheDataAnalytics(project).load(analyticsEventData)
175-
project.service<IntervalRunner>()
176-
.scheduleWithTimer({ releaseAnalytics() }, config.reportingInterval)
177-
}
178-
179-
private fun getApiClient(): ApiClient? {
180-
if (this.apiClient != null) {
181-
return this.apiClient
182-
}
183-
184-
val settings = PrismaSettingsState().getInstance()
185-
if (settings != null && settings.isConfigured()) {
186-
this.apiClient = ApiClient(settings.accessKey, settings.secretKey, settings.prismaURL)
187-
return this.apiClient
188-
}
189-
190-
return null
180+
analyticsReleaseTask.scheduleWithTimer({ releaseAnalytics() }, config?.reportingInterval ?: 300)
191181
}
192182

193183
private fun buildFullScanAnalyticsData(){
194184
fullScanData!!.eventData = fullScanData!!.frameworksScanTime
195185
fullScanData!!.eventTime = fullScanData!!.buttonPressedTime
196186
fullScanData!!.eventType = EventTypeEnum.ON_FULL_SCAN
197-
analyticsEventData.add(Json.encodeToString(fullScanData))
187+
analyticsEventData.add(fullScanData!!)
198188
}
199189

200190
private fun buildPluginInstalledAnalyticsData(){
201-
val analyticsData = PluginInstallAnalyticsData()
191+
val analyticsData = AnalyticsData()
202192
analyticsData.eventTime = Date()
203193
analyticsData.eventType = EventTypeEnum.ON_PLUGIN_INSTALL
204-
analyticsEventData.add(Json.encodeToString(analyticsData))
194+
analyticsEventData.add(analyticsData)
205195
}
206196

207197
private fun buildPluginUninstalledAnalyticsData(){
208-
val analyticsData = PluginInstallAnalyticsData()
198+
val analyticsData = AnalyticsData()
209199
analyticsData.eventTime = Date()
210200
analyticsData.eventType = EventTypeEnum.ON_PLUGIN_UNINSTALL
211-
analyticsEventData.add(Json.encodeToString(analyticsData))
201+
analyticsEventData.add(analyticsData)
212202
}
213203
}

0 commit comments

Comments
 (0)