@@ -7,16 +7,21 @@ import com.fasterxml.jackson.databind.DeserializationFeature
77import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper
88import com.fasterxml.jackson.module.kotlin.readValue
99import com.intellij.openapi.application.ApplicationInfo
10+ import com.intellij.openapi.application.ApplicationManager
1011import com.intellij.openapi.application.runInEdt
1112import com.intellij.openapi.application.runReadAction
1213import com.intellij.openapi.fileEditor.FileDocumentManager
1314import com.intellij.openapi.project.Project
15+ import com.intellij.openapi.project.modules
16+ import com.intellij.openapi.roots.ModuleRootManager
1417import com.intellij.openapi.vfs.LocalFileSystem
1518import kotlinx.coroutines.delay
1619import kotlinx.coroutines.ensureActive
1720import kotlinx.coroutines.isActive
1821import kotlinx.coroutines.time.withTimeout
1922import kotlinx.coroutines.withContext
23+ import migration.software.aws.toolkits.jetbrains.settings.AwsSettings
24+ import org.apache.commons.codec.digest.DigestUtils
2025import software.amazon.awssdk.services.codewhisperer.model.ArtifactType
2126import software.amazon.awssdk.services.codewhisperer.model.CodeScanFindingsSchema
2227import software.amazon.awssdk.services.codewhisperer.model.CodeScanStatus
@@ -33,12 +38,14 @@ import software.aws.toolkits.core.utils.Waiters.waitUntil
3338import software.aws.toolkits.core.utils.debug
3439import software.aws.toolkits.core.utils.getLogger
3540import software.aws.toolkits.core.utils.info
41+ import software.aws.toolkits.core.utils.toHexString
3642import software.aws.toolkits.jetbrains.services.codewhisperer.codescan.sessionconfig.CodeScanSessionConfig
3743import software.aws.toolkits.jetbrains.services.codewhisperer.codescan.sessionconfig.PayloadContext
3844import software.aws.toolkits.jetbrains.services.codewhisperer.credentials.CodeWhispererClientAdaptor
3945import software.aws.toolkits.jetbrains.services.codewhisperer.explorer.CodeWhispererExplorerActionManager
4046import software.aws.toolkits.jetbrains.services.codewhisperer.model.CodeScanResponseContext
4147import software.aws.toolkits.jetbrains.services.codewhisperer.model.CreateUploadUrlServiceInvocationContext
48+ import software.aws.toolkits.jetbrains.services.codewhisperer.telemetry.CodeWhispererTelemetryService
4249import software.aws.toolkits.jetbrains.services.codewhisperer.util.CodeWhispererConstants
4350import software.aws.toolkits.jetbrains.services.codewhisperer.util.CodeWhispererConstants.CODE_SCAN_POLLING_INTERVAL_IN_SECONDS
4451import 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
5259import software.aws.toolkits.jetbrains.services.codewhisperer.util.getTelemetryErrorMessage
5360import software.aws.toolkits.jetbrains.utils.assertIsNonDispatchThread
5461import software.aws.toolkits.resources.message
62+ import software.aws.toolkits.telemetry.CodewhispererCodeScanScope
5563import software.aws.toolkits.telemetry.CodewhispererLanguage
5664import java.nio.file.Path
5765import java.time.Duration
5866import java.time.Instant
5967import java.util.UUID
6068import kotlin.coroutines.coroutineContext
69+ import kotlin.io.path.pathString
6170
6271class CodeWhispererCodeScanSession (val sessionContext : CodeScanSessionContext ) {
6372 private val clientToken: UUID = UUID .randomUUID()
@@ -103,7 +112,7 @@ class CodeWhispererCodeScanSession(val sessionContext: CodeScanSessionContext) {
103112 // 2 & 3. CreateUploadURL and upload the context.
104113 currentCoroutineContext.ensureActive()
105114 val artifactsUploadStartTime = now()
106- val codeScanName = UUID .randomUUID().toString ()
115+ val codeScanName = generateScanName ()
107116
108117 val taskType = if (isAutoScan()) {
109118 CodeWhispererConstants .UploadTaskType .SCAN_FILE
@@ -366,6 +375,26 @@ class CodeWhispererCodeScanSession(val sessionContext: CodeScanSessionContext) {
366375 private fun isAutoScan (): Boolean =
367376 sessionContext.codeAnalysisScope == CodeWhispererConstants .CodeAnalysisScope .FILE && ! sessionContext.sessionConfig.isInitiatedByChat()
368377
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+
369398 companion object {
370399 private val LOG = getLogger<CodeWhispererCodeScanSession >()
371400 private val MAPPER = jacksonObjectMapper()
0 commit comments