@@ -7,16 +7,21 @@ import com.fasterxml.jackson.databind.DeserializationFeature
7
7
import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper
8
8
import com.fasterxml.jackson.module.kotlin.readValue
9
9
import com.intellij.openapi.application.ApplicationInfo
10
+ import com.intellij.openapi.application.ApplicationManager
10
11
import com.intellij.openapi.application.runInEdt
11
12
import com.intellij.openapi.application.runReadAction
12
13
import com.intellij.openapi.fileEditor.FileDocumentManager
13
14
import com.intellij.openapi.project.Project
15
+ import com.intellij.openapi.project.modules
16
+ import com.intellij.openapi.roots.ModuleRootManager
14
17
import com.intellij.openapi.vfs.LocalFileSystem
15
18
import kotlinx.coroutines.delay
16
19
import kotlinx.coroutines.ensureActive
17
20
import kotlinx.coroutines.isActive
18
21
import kotlinx.coroutines.time.withTimeout
19
22
import kotlinx.coroutines.withContext
23
+ import migration.software.aws.toolkits.jetbrains.settings.AwsSettings
24
+ import org.apache.commons.codec.digest.DigestUtils
20
25
import software.amazon.awssdk.services.codewhisperer.model.ArtifactType
21
26
import software.amazon.awssdk.services.codewhisperer.model.CodeScanFindingsSchema
22
27
import software.amazon.awssdk.services.codewhisperer.model.CodeScanStatus
@@ -33,12 +38,14 @@ import software.aws.toolkits.core.utils.Waiters.waitUntil
33
38
import software.aws.toolkits.core.utils.debug
34
39
import software.aws.toolkits.core.utils.getLogger
35
40
import software.aws.toolkits.core.utils.info
41
+ import software.aws.toolkits.core.utils.toHexString
36
42
import software.aws.toolkits.jetbrains.services.codewhisperer.codescan.sessionconfig.CodeScanSessionConfig
37
43
import software.aws.toolkits.jetbrains.services.codewhisperer.codescan.sessionconfig.PayloadContext
38
44
import software.aws.toolkits.jetbrains.services.codewhisperer.credentials.CodeWhispererClientAdaptor
39
45
import software.aws.toolkits.jetbrains.services.codewhisperer.explorer.CodeWhispererExplorerActionManager
40
46
import software.aws.toolkits.jetbrains.services.codewhisperer.model.CodeScanResponseContext
41
47
import software.aws.toolkits.jetbrains.services.codewhisperer.model.CreateUploadUrlServiceInvocationContext
48
+ import software.aws.toolkits.jetbrains.services.codewhisperer.telemetry.CodeWhispererTelemetryService
42
49
import software.aws.toolkits.jetbrains.services.codewhisperer.util.CodeWhispererConstants
43
50
import software.aws.toolkits.jetbrains.services.codewhisperer.util.CodeWhispererConstants.CODE_SCAN_POLLING_INTERVAL_IN_SECONDS
44
51
import software.aws.toolkits.jetbrains.services.codewhisperer.util.CodeWhispererConstants.FILE_SCANS_THROTTLING_MESSAGE
@@ -52,12 +59,14 @@ import software.aws.toolkits.jetbrains.services.codewhisperer.util.CodeWhisperer
52
59
import software.aws.toolkits.jetbrains.services.codewhisperer.util.getTelemetryErrorMessage
53
60
import software.aws.toolkits.jetbrains.utils.assertIsNonDispatchThread
54
61
import software.aws.toolkits.resources.message
62
+ import software.aws.toolkits.telemetry.CodewhispererCodeScanScope
55
63
import software.aws.toolkits.telemetry.CodewhispererLanguage
56
64
import java.nio.file.Path
57
65
import java.time.Duration
58
66
import java.time.Instant
59
67
import java.util.UUID
60
68
import kotlin.coroutines.coroutineContext
69
+ import kotlin.io.path.pathString
61
70
62
71
class CodeWhispererCodeScanSession (val sessionContext : CodeScanSessionContext ) {
63
72
private val clientToken: UUID = UUID .randomUUID()
@@ -103,7 +112,7 @@ class CodeWhispererCodeScanSession(val sessionContext: CodeScanSessionContext) {
103
112
// 2 & 3. CreateUploadURL and upload the context.
104
113
currentCoroutineContext.ensureActive()
105
114
val artifactsUploadStartTime = now()
106
- val codeScanName = UUID .randomUUID().toString ()
115
+ val codeScanName = generateScanName ()
107
116
108
117
val taskType = if (sessionContext.codeAnalysisScope == CodeWhispererConstants .CodeAnalysisScope .PROJECT ) {
109
118
CodeWhispererConstants .UploadTaskType .SCAN_PROJECT
@@ -366,6 +375,26 @@ class CodeWhispererCodeScanSession(val sessionContext: CodeScanSessionContext) {
366
375
private fun isAutoScan (): Boolean =
367
376
sessionContext.codeAnalysisScope == CodeWhispererConstants .CodeAnalysisScope .FILE && ! sessionContext.sessionConfig.isInitiatedByChat()
368
377
378
+ private fun generateScanName (): String {
379
+ val clientId = AwsSettings .getInstance().clientId
380
+ val filePath = sessionContext.sessionConfig.getSelectedFile()?.toNioPath()?.pathString
381
+ val scope = CodeWhispererTelemetryService .getInstance().mapToTelemetryScope(
382
+ sessionContext.codeAnalysisScope,
383
+ sessionContext.sessionConfig.isInitiatedByChat()
384
+ )
385
+ val projectId = if (scope != CodewhispererCodeScanScope .PROJECT && filePath != null ) {
386
+ filePath
387
+ } else {
388
+ ApplicationManager .getApplication().runReadAction<String > {
389
+ sessionContext.project.modules.map { module ->
390
+ ModuleRootManager .getInstance(module).contentRoots.firstOrNull()?.path
391
+ }.joinToString(" ," )
392
+ }
393
+ }
394
+
395
+ return DigestUtils .sha256(" $clientId ::$projectId ::$scope " ).toHexString()
396
+ }
397
+
369
398
companion object {
370
399
private val LOG = getLogger<CodeWhispererCodeScanSession >()
371
400
private val MAPPER = jacksonObjectMapper()
0 commit comments