Skip to content

Commit f7f55df

Browse files
committed
redhat impl
1 parent d62d64d commit f7f55df

File tree

2 files changed

+141
-10
lines changed
  • plugins/amazonq/shared/jetbrains-community

2 files changed

+141
-10
lines changed

plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/util/FileUriUtil.kt

Lines changed: 31 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,17 +3,42 @@
33

44
package software.aws.toolkits.jetbrains.services.amazonq.lsp.util
55

6-
import com.intellij.openapi.vfs.VfsUtil
7-
import com.intellij.openapi.vfs.VirtualFile
86
import com.intellij.openapi.vfs.VfsUtilCore
9-
7+
import com.intellij.openapi.vfs.VirtualFile
8+
import software.aws.toolkits.core.utils.getLogger
9+
import software.aws.toolkits.core.utils.warn
10+
import java.io.File
11+
import java.net.URI
12+
import java.net.URISyntaxException
1013

1114
object FileUriUtil {
1215

13-
fun toUriString(virtualFile: VirtualFile): String {
14-
val file = VfsUtilCore.virtualToIoFile(virtualFile)
15-
return VfsUtil.toUri(file).toString()
16+
fun toUriString(virtualFile: VirtualFile): String? {
17+
val protocol = virtualFile.fileSystem.protocol
18+
val uri = when (protocol) {
19+
"jar" -> VfsUtilCore.convertToURL(virtualFile.url)?.toExternalForm()
20+
"jrt" -> virtualFile.url
21+
else -> toUri(VfsUtilCore.virtualToIoFile(virtualFile)).toASCIIString()
22+
} ?: return null
1623

24+
return if (virtualFile.isDirectory) {
25+
uri.trimEnd('/', '\\')
26+
} else {
27+
uri
28+
}
1729
}
30+
31+
32+
private fun toUri(file: File): URI {
33+
try {
34+
// URI scheme specified by language server protocol
35+
return URI("file", "", file.absoluteFile.toURI().path, null)
36+
} catch (e: URISyntaxException) {
37+
LOG.warn(e.localizedMessage, e)
38+
return file.absoluteFile.toURI()
39+
}
40+
}
41+
42+
private val LOG = getLogger<FileUriUtil>()
1843
}
1944

plugins/amazonq/shared/jetbrains-community/tst/software/aws/toolkits/jetbrains/services/amazonq/lsp/util/FileUriUtilTest.kt

Lines changed: 110 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,11 @@
11
package software.aws.toolkits.jetbrains.services.amazonq.lsp.util
22

33
import com.intellij.openapi.vfs.VirtualFile
4+
import com.intellij.openapi.vfs.VirtualFileManager
45
import com.intellij.testFramework.LightVirtualFile
56
import com.intellij.testFramework.fixtures.BasePlatformTestCase
7+
import io.mockk.every
8+
import io.mockk.mockk
69
import org.junit.Test
710

811
class FileUriUtilTest : BasePlatformTestCase() {
@@ -17,6 +20,13 @@ class FileUriUtilTest : BasePlatformTestCase() {
1720
assertEquals("file:///path/to/file.txt", uri)
1821
}
1922

23+
@Test
24+
fun `test unix directory path`() {
25+
val virtualFile = createMockVirtualFile("/path/to/directory/")
26+
val uri = FileUriUtil.toUriString(virtualFile)
27+
assertEquals("file:///path/to/directory", uri)
28+
}
29+
2030
@Test
2131
fun `test path with spaces`() {
2232
val virtualFile = createMockVirtualFile("/path/with spaces/file.txt")
@@ -31,6 +41,13 @@ class FileUriUtilTest : BasePlatformTestCase() {
3141
assertEquals("file:///C:/path/to/file.txt", uri)
3242
}
3343

44+
@Test
45+
fun `test windows directory path`() {
46+
val virtualFile = createMockVirtualFile("C:\\path\\to\\directory\\")
47+
val uri = FileUriUtil.toUriString(virtualFile)
48+
assertEquals("file:///C:/path/to/directory", uri)
49+
}
50+
3451
@Test
3552
fun `test root path`() {
3653
val virtualFile = createMockVirtualFile("/")
@@ -50,15 +67,104 @@ class FileUriUtilTest : BasePlatformTestCase() {
5067
val longPath = "/a".repeat(256) + "/file.txt"
5168
val virtualFile = createMockVirtualFile(longPath)
5269
val uri = FileUriUtil.toUriString(virtualFile)
53-
assertTrue(uri.startsWith("file:///"))
54-
assertTrue(uri.endsWith("/file.txt"))
70+
if (uri != null) {
71+
assertTrue(uri.startsWith("file:///"))
72+
assertTrue(uri.endsWith("/file.txt"))
73+
}
5574
}
5675

5776
@Test
5877
fun `test relative path`() {
5978
val virtualFile = createMockVirtualFile("./relative/path/file.txt")
6079
val uri = FileUriUtil.toUriString(virtualFile)
61-
assertTrue(uri.contains("file.txt"))
62-
assertTrue(uri.startsWith("file:///"))
80+
if (uri != null) {
81+
assertTrue(uri.contains("file.txt"))
82+
assertTrue(uri.startsWith("file:///"))
83+
}
84+
}
85+
86+
@Test
87+
fun `test jar protocol conversion`() {
88+
89+
val virtualFile = mockk<VirtualFile> {
90+
every { fileSystem } returns mockk {
91+
every { protocol } returns "jar"
92+
}
93+
every { url } returns "jar:file:///path/to/archive.jar!/com/example/Test.class"
94+
every { isDirectory } returns false
95+
}
96+
97+
val result = FileUriUtil.toUriString(virtualFile)
98+
assertEquals("jar:file:///path/to/archive.jar!/com/example/Test.class", result)
99+
}
100+
101+
@Test
102+
fun `test jrt protocol conversion`() {
103+
val virtualFile = mockk<VirtualFile> {
104+
every { fileSystem } returns mockk {
105+
every { protocol } returns "jrt"
106+
}
107+
every { url } returns "jrt://java.base/java/lang/String.class"
108+
every { isDirectory } returns false
109+
}
110+
111+
val result = FileUriUtil.toUriString(virtualFile)
112+
assertEquals("jrt://java.base/java/lang/String.class", result)
113+
}
114+
115+
@Test
116+
fun `test invalid jar url returns null`() {
117+
val virtualFile = mockk<VirtualFile> {
118+
every { fileSystem } returns mockk {
119+
every { protocol } returns "jar"
120+
}
121+
every { url } returns "invalid:url:format"
122+
every { isDirectory } returns false
123+
}
124+
125+
val result = FileUriUtil.toUriString(virtualFile)
126+
assertNull(result)
127+
}
128+
129+
@Test
130+
fun `test jar protocol with directory`() {
131+
val virtualFile = mockk<VirtualFile> {
132+
every { fileSystem } returns mockk {
133+
every { protocol } returns "jar"
134+
}
135+
every { url } returns "jar:file:///path/to/archive.jar!/com/example/"
136+
every { isDirectory } returns true
137+
}
138+
139+
val result = FileUriUtil.toUriString(virtualFile)
140+
assertEquals("jar:file:///path/to/archive.jar!/com/example", result)
141+
}
142+
143+
@Test
144+
fun `test null url in jar protocol`() {
145+
val virtualFile = mockk<VirtualFile> {
146+
every { fileSystem } returns mockk {
147+
every { protocol } returns "jar"
148+
}
149+
every { url } returns ""
150+
every { isDirectory } returns false
151+
}
152+
153+
val result = FileUriUtil.toUriString(virtualFile)
154+
assertNull(result)
155+
}
156+
157+
@Test
158+
fun `test empty url in jar protocol`() {
159+
val virtualFile = mockk<VirtualFile> {
160+
every { fileSystem } returns mockk {
161+
every { protocol } returns "jar"
162+
}
163+
every { url } returns ""
164+
every { isDirectory } returns false
165+
}
166+
167+
val result = FileUriUtil.toUriString(virtualFile)
168+
assertNull(result)
63169
}
64170
}

0 commit comments

Comments
 (0)