This is an automated email from the ASF dual-hosted git repository.
sdedic pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/netbeans.git
The following commit(s) were added to refs/heads/master by this push:
new 2f2ee94e30 #6377: workaround vscode jar/nbjrt URI mangle
new 61f724274c Merge pull request #6378 from
sdedic/lsp/uri-mangle-workaround
2f2ee94e30 is described below
commit 2f2ee94e3015375c7cb3195ceca2eca82ee7dc01
Author: Svata Dedic <[email protected]>
AuthorDate: Fri Aug 25 16:17:33 2023 +0200
#6377: workaround vscode jar/nbjrt URI mangle
---
.../modules/java/lsp/server/URITranslator.java | 36 +++++++++++++++------
.../modules/java/lsp/server/UtilsTest.java | 37 ++++++++++++++++++++++
2 files changed, 63 insertions(+), 10 deletions(-)
diff --git
a/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/URITranslator.java
b/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/URITranslator.java
index 00f4a91ea5..58eafebfa7 100644
---
a/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/URITranslator.java
+++
b/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/URITranslator.java
@@ -21,12 +21,10 @@ package org.netbeans.modules.java.lsp.server;
import java.io.File;
import java.io.IOException;
import java.io.OutputStream;
-import java.io.UnsupportedEncodingException;
import java.net.MalformedURLException;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.URL;
-import java.net.URLDecoder;
import java.nio.charset.StandardCharsets;
import java.util.LinkedHashMap;
import java.util.Map;
@@ -47,7 +45,6 @@ public final class URITranslator {
private static final URITranslator INSTANCE = new URITranslator();
private final Map<String, String> uriFromCacheMap = new LRUCacheMap();
- private final Map<String, String> uriToCacheMap = new LRUCacheMap();
public static URITranslator getDefault() {
return INSTANCE;
@@ -96,13 +93,32 @@ public final class URITranslator {
});
}
- public synchronized String uriFromLSP(String nbUri) {
- return uriToCacheMap.computeIfAbsent(nbUri, uri -> {
- try {
- return URLDecoder.decode(nbUri, StandardCharsets.UTF_8.name());
- } catch (UnsupportedEncodingException ex) {}
- return uri;
- });
+ public String uriFromLSP(String nbUri) {
+ // handle special cases. We use file:jar:.....!/ and
nbjrt:file:..../!/ but vscode url-encodes that, but wrongly, as it leaves other
URI-encoded
+ // special characters as they are. However doing a full decode using
Decoder will damage other URL-encoded special characters that would be
+ // parsed by URI.create() later.
+ // So handle the special cases manually and only remove the
vscode-added scheme/delimiter encoded chars
+ int slash = nbUri.indexOf('/'); // NOI18N
+ if (slash != -1) {
+ int indexOfInnerScheme = nbUri.substring(0, slash).indexOf("%3A");
// NOI18N
+ if (indexOfInnerScheme > 0 && indexOfInnerScheme < slash) {
+ int n = indexOfInnerScheme + 3;
+ StringBuilder sb = new StringBuilder();
+ sb.append(nbUri, 0, indexOfInnerScheme);
+ sb.append(':'); // NOI18N
+
+ // now search for the mangled !
+ int mangledExclamation = nbUri.indexOf("%21/"); // NOI18N
+ if (mangledExclamation > 0) {
+ sb.append(nbUri, n, mangledExclamation);
+ sb.append('!'); // NOI18N
+ n = mangledExclamation + 3;
+ }
+ sb.append(nbUri, n, nbUri.length());
+ return sb.toString();
+ }
+ }
+ return nbUri;
}
/**
diff --git
a/java/java.lsp.server/test/unit/src/org/netbeans/modules/java/lsp/server/UtilsTest.java
b/java/java.lsp.server/test/unit/src/org/netbeans/modules/java/lsp/server/UtilsTest.java
index f0ebdae200..81cb2673b7 100644
---
a/java/java.lsp.server/test/unit/src/org/netbeans/modules/java/lsp/server/UtilsTest.java
+++
b/java/java.lsp.server/test/unit/src/org/netbeans/modules/java/lsp/server/UtilsTest.java
@@ -20,7 +20,10 @@ package org.netbeans.modules.java.lsp.server;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertSame;
+import org.junit.Assume;
import org.junit.Test;
+import org.netbeans.api.java.platform.JavaPlatform;
+import org.openide.filesystems.FileObject;
/**
*
@@ -104,4 +107,38 @@ public class UtilsTest {
String result = Utils.html2plain(s, true);
assertEquals(expResult, result);
}
+
+ /**
+ * Checks that mangled URI pointing into a JAR file is properly
interpreted from LSP.
+ * @throws Exception
+ */
+ @Test
+ public void testDecodeMangledJarURI() throws Exception {
+ FileObject fo =
JavaPlatform.getDefault().getSourceFolders().findResource("java/util/Collections.java");
+ String uri = Utils.toUri(fo);
+ // mangle:
+ String replaced = uri.replace("file:", "file%3A").replace("!/",
"%21/");
+
+ assertEquals(uri, URITranslator.getDefault().uriFromLSP(replaced));
+ assertSame(fo, Utils.fromUri(replaced));
+ }
+
+ /**
+ * Checks that mangled URI pointing into a JDK11 module is properly
interpreted from LSP.
+ * @throws Exception
+ */
+ @Test
+ public void testDecodeMangledNbjrtURI() throws Exception {
+ String jdkVersion = System.getProperty("java.specification.version");
+ // ignore on JDK8
+ Assume.assumeTrue(!jdkVersion.startsWith("1.") &&
Integer.parseInt(jdkVersion) >= 9);
+
+ FileObject fo =
JavaPlatform.getDefault().getBootstrapLibraries().findResource("java/util/Collections.class");
+ String uri = Utils.toUri(fo);
+ // mangle:
+ String replaced = uri.replace("file:", "file%3A").replace("!/",
"%21/");
+
+ assertEquals(uri, URITranslator.getDefault().uriFromLSP(replaced));
+ assertSame(fo, Utils.fromUri(replaced));
+ }
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]
For further information about the NetBeans mailing lists, visit:
https://cwiki.apache.org/confluence/display/NETBEANS/Mailing+lists