Skip to content

Commit 7a24dda

Browse files
committed
fix: refactored Uri data to a SnykUriDetails
1 parent 658023f commit 7a24dda

File tree

9 files changed

+178
-74
lines changed

9 files changed

+178
-74
lines changed

plugin/src/main/java/io/snyk/languageserver/protocolextension/SnykUriUtils.java plugin/src/main/java/io/snyk/eclipse/plugin/utils/UriUtils.java

+29-6
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package io.snyk.languageserver.protocolextension;
1+
package io.snyk.eclipse.plugin.utils;
22

33
import java.io.UnsupportedEncodingException;
44
import java.net.URI;
@@ -7,10 +7,21 @@
77
import java.util.HashMap;
88
import java.util.Map;
99

10-
import io.snyk.eclipse.plugin.utils.SnykLogger;
10+
public class UriUtils {
1111

12-
public class SnykUriUtils {
13-
12+
/**
13+
* Retrieves a parameter value from the given URI.
14+
*
15+
* If the query string does not contain the specified parameter or is
16+
* null/empty, this method returns null.
17+
*
18+
* @param uri
19+
* The URI to retrieve parameters from
20+
* @param paramName
21+
* The name of the parameter to retrieve
22+
* @return The parameter value if it exists in the query string, otherwise
23+
* null
24+
*/
1425
public static String getDecodedParam(URI uri, String paramName) {
1526
String query = uri.getQuery();
1627
if (query == null || query.isEmpty()) {
@@ -23,11 +34,23 @@ public static String getDecodedParam(URI uri, String paramName) {
2334
if (value == null) {
2435
return null;
2536
}
26-
37+
2738
return value;
2839
}
2940

30-
static Map<String, String> getQueryParameters(String queryString) {
41+
/**
42+
* Parses a query string into a map of key-value pairs, decoding any
43+
* URL-encoded values.
44+
*
45+
* If the input is null or empty, an empty map is returned. If an encoding
46+
* error occurs while decoding a value, an error is logged and an empty map
47+
* is returned.
48+
*
49+
* @param queryString
50+
* The query string to parse
51+
* @return A map containing the decoded parameters
52+
*/
53+
public static Map<String, String> getQueryParameters(String queryString) {
3154
Map<String, String> paramMap = new HashMap<>();
3255

3356
if (queryString == null || queryString.isEmpty()) {

plugin/src/main/java/io/snyk/eclipse/plugin/views/snyktoolview/ISnykToolView.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -128,5 +128,5 @@ static String getPlural(long count) {
128128
*/
129129
abstract void disableDelta();
130130

131-
abstract void selectTreeNode(Issue issue);
131+
abstract void selectTreeNode(Issue issue, String product);
132132
}

plugin/src/main/java/io/snyk/eclipse/plugin/views/snyktoolview/SnykToolView.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -480,8 +480,8 @@ protected void outputCommandResult(Object result) {
480480
}
481481

482482
@Override
483-
public void selectTreeNode(Issue issue) {
484-
ProductTreeNode productNode = getProductNode(ProductConstants.DISPLAYED_CODE_SECURITY, issue.filePath());
483+
public void selectTreeNode(Issue issue, String product) {
484+
ProductTreeNode productNode = getProductNode(product, issue.filePath());
485485
selectTreenodeForIssue((TreeNode) productNode, issue);
486486
}
487487

plugin/src/main/java/io/snyk/languageserver/protocolextension/SnykExtendedLanguageClient.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -451,7 +451,7 @@ public CompletableFuture<ShowDocumentResult> showDocument(
451451
return null;
452452
}
453453

454-
SnykUriDetails uriDetails = SnykUriDetails.fromURI(uri);
454+
SnykShowFixUriDetails uriDetails = SnykShowFixUriDetails.fromURI(uri);
455455

456456
Issue issue;
457457
if (uriDetails.isValid()) {
@@ -471,7 +471,7 @@ public CompletableFuture<ShowDocumentResult> showDocument(
471471

472472
return CompletableFuture.supplyAsync(() -> {
473473
openToolView();
474-
this.toolView.selectTreeNode(issue);
474+
this.toolView.selectTreeNode(issue, uriDetails.product());
475475
return new ShowDocumentResult(true);
476476
});
477477
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package io.snyk.languageserver.protocolextension;
2+
3+
import java.net.URI;
4+
5+
import io.snyk.eclipse.plugin.utils.UriUtils;
6+
7+
import static io.snyk.eclipse.plugin.domain.ProductConstants.DIAGNOSTIC_SOURCE_SNYK_CODE;
8+
9+
public record SnykShowFixUriDetails(String scheme, String filePath, String product,
10+
String action, String issueId) {
11+
public static SnykShowFixUriDetails fromURI(URI uri) {
12+
return new SnykShowFixUriDetails(uri.getScheme(), uri.getPath(),
13+
UriUtils.getDecodedParam(uri, "product"),
14+
UriUtils.getDecodedParam(uri, "action"),
15+
UriUtils.getDecodedParam(uri, "issueId"));
16+
}
17+
18+
public boolean isValid() {
19+
return ("snyk".equals(this.scheme())
20+
&& DIAGNOSTIC_SOURCE_SNYK_CODE.equals(this.product())
21+
&& "showInDetailPanel".equals(this.action()));
22+
}
23+
}

plugin/src/main/java/io/snyk/languageserver/protocolextension/SnykUriDetails.java

-20
This file was deleted.

tests/src/test/java/io/snyk/languageserver/protocolextension/SnykExtendedLanguageClientTest.java

-37
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@
1111
import static io.snyk.eclipse.plugin.views.snyktoolview.ISnykToolView.CONGRATS_NO_ISSUES_FOUND;
1212
import static io.snyk.eclipse.plugin.views.snyktoolview.ISnykToolView.getPlural;
1313
import static org.junit.jupiter.api.Assertions.assertEquals;
14-
import static org.junit.jupiter.api.Assertions.assertTrue;
1514
import static org.mockito.ArgumentMatchers.any;
1615
import static org.mockito.Mockito.mock;
1716
import static org.mockito.Mockito.mockStatic;
@@ -25,7 +24,6 @@
2524
import java.io.File;
2625
import java.io.IOException;
2726
import java.net.URI;
28-
import java.net.URISyntaxException;
2927
import java.nio.file.Path;
3028
import java.nio.file.Paths;
3129
import java.util.Collection;
@@ -585,39 +583,4 @@ void testGetTotal() throws IOException {
585583
private AdditionalData getSecurityIssue() {
586584
return Instancio.of(AdditionalData.class).set(Select.field(AdditionalData::isSecurityType), true).create();
587585
}
588-
589-
@Test
590-
public void getDecodedParam_Returns_Parameter_Value_If_Present_In_Query_String() throws Exception {
591-
cut = new SnykExtendedLanguageClient();
592-
String query = "product=Snyk+Code&issueId=7642f506c568056a7090d3ceb7b3c2e0&action=showInDetailPanel";
593-
URI uriWithQuery = new URI("snyk://path/to/resource?" + query);
594-
595-
var result = SnykUriUtils.getDecodedParam(uriWithQuery, "issueId");
596-
assertEquals("7642f506c568056a7090d3ceb7b3c2e0", result);
597-
598-
result = SnykUriUtils.getDecodedParam(uriWithQuery, "action");
599-
assertEquals("showInDetailPanel", result);
600-
601-
result = SnykUriUtils.getDecodedParam(uriWithQuery, "product");
602-
assertEquals("Snyk Code", result);
603-
}
604-
605-
@Test
606-
public void parseQueryString_Returns_Parameters_In_Query_String() throws Exception {
607-
cut = new SnykExtendedLanguageClient();
608-
String query = "product=Snyk+Code&issueId=7642f506c568056a7090d3ceb7b3c2e0&action=showInDetailPanel";
609-
URI uriWithQuery = new URI("snyk://path/to/resource?" + query);
610-
611-
var result = SnykUriUtils.getQueryParameters(uriWithQuery.getQuery());
612-
assertEquals(3, result.size());
613-
}
614-
615-
@Test
616-
public void parseQueryString_Returns_Empty_Map_If_Query_String_Is_Empty() throws URISyntaxException {
617-
cut = new SnykExtendedLanguageClient();
618-
619-
var result = SnykUriUtils.getQueryParameters(null);
620-
assertTrue(result.isEmpty());
621-
}
622-
623586
}

tests/src/test/java/io/snyk/languageserver/protocolextension/SnykUriDetailsTest.java

+6-6
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ private URI createSnykUri() throws URISyntaxException {
2121

2222
@Test
2323
void testFromURI() throws URISyntaxException {
24-
SnykUriDetails details = SnykUriDetails.fromURI(createSnykUri());
24+
SnykShowFixUriDetails details = SnykShowFixUriDetails.fromURI(createSnykUri());
2525

2626
assertTrue(details.scheme().equals("snyk"));
2727
assertTrue(details.filePath().equals(
@@ -35,7 +35,7 @@ void testFromURI() throws URISyntaxException {
3535
@Test
3636
void testFromURINullProduct() throws URISyntaxException {
3737
URI uri = new URI("snyk:///test_repos/project-with-vulns/routes/vulnCodeSnippet.ts?issueId=id&action=showInDetailPanel");
38-
SnykUriDetails details = SnykUriDetails.fromURI(uri);
38+
SnykShowFixUriDetails details = SnykShowFixUriDetails.fromURI(uri);
3939

4040
assertTrue(details.scheme().equals("snyk"));
4141
assertTrue(details.filePath().equals("/test_repos/project-with-vulns/routes/vulnCodeSnippet.ts"));
@@ -46,7 +46,7 @@ void testFromURINullProduct() throws URISyntaxException {
4646

4747
@Test
4848
void testFromURIEmptyProduct() throws URISyntaxException {
49-
SnykUriDetails details = SnykUriDetails.fromURI(createSnykUri());
49+
SnykShowFixUriDetails details = SnykShowFixUriDetails.fromURI(createSnykUri());
5050

5151
assertTrue(details.scheme().equals("snyk"));
5252
assertTrue(details.filePath().equals("/test_repos/project-with-vulns/routes/vulnCodeSnippet.ts"));
@@ -58,23 +58,23 @@ void testFromURIEmptyProduct() throws URISyntaxException {
5858

5959
@Test
6060
void testIsValidTrue() throws URISyntaxException {
61-
SnykUriDetails details = SnykUriDetails.fromURI(createSnykUri());
61+
SnykShowFixUriDetails details = SnykShowFixUriDetails.fromURI(createSnykUri());
6262

6363
assertTrue(details.isValid());
6464
}
6565

6666
@Test
6767
void testIsValidFalse() throws URISyntaxException {
6868
URI uri = new URI("http://path/product/showInDetailPanel?issueId=id");
69-
SnykUriDetails details = SnykUriDetails.fromURI(uri);
69+
SnykShowFixUriDetails details = SnykShowFixUriDetails.fromURI(uri);
7070

7171
assertFalse(details.isValid());
7272
}
7373

7474
@Test
7575
void testIsValidProductFalse() throws URISyntaxException {
7676
URI uri = new URI("snyk://path/null/showInDetailPanel?issueId=id");
77-
SnykUriDetails details = SnykUriDetails.fromURI(uri);
77+
SnykShowFixUriDetails details = SnykShowFixUriDetails.fromURI(uri);
7878

7979
assertFalse(details.isValid());
8080
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,115 @@
1+
package io.snyk.languageserver.protocolextension;
2+
3+
import static org.junit.jupiter.api.Assertions.*;
4+
5+
import java.net.URI;
6+
import java.net.URISyntaxException;
7+
import java.util.Collections;
8+
import java.util.HashMap;
9+
import java.util.Map;
10+
11+
import org.junit.jupiter.api.Test;
12+
13+
import io.snyk.eclipse.plugin.utils.UriUtils;
14+
15+
class SnykUriUtilsTest {
16+
17+
@Test
18+
public void getDecodedParam_Returns_Parameter_Value_If_Present_In_Query_String()
19+
throws URISyntaxException {
20+
String query = "product=Snyk+Code&issueId=7642f506c568056a7090d3ceb7b3c2e0&action=showInDetailPanel";
21+
URI uriWithQuery = new URI("snyk://path/to/resource?" + query);
22+
23+
var result = UriUtils.getDecodedParam(uriWithQuery, "issueId");
24+
assertEquals("7642f506c568056a7090d3ceb7b3c2e0", result);
25+
26+
result = UriUtils.getDecodedParam(uriWithQuery, "action");
27+
assertEquals("showInDetailPanel", result);
28+
29+
result = UriUtils.getDecodedParam(uriWithQuery, "product");
30+
assertEquals("Snyk Code", result);
31+
}
32+
33+
@Test
34+
void getDecodedParamNullQuery() throws URISyntaxException {
35+
URI uri = new URI(
36+
"snyk:///test_repos/project-with-vulns/routes/vulnCodeSnippet.ts");
37+
String paramName = "product";
38+
39+
assertNull(UriUtils.getDecodedParam(uri, paramName));
40+
}
41+
42+
@Test
43+
void getDecodedParamEmptyQuery() throws URISyntaxException {
44+
URI uri = new URI(
45+
"snyk:///test_repos/project-with-vulns/routes/vulnCodeSnippet.ts?product=");
46+
String paramName = "product";
47+
48+
assertNull(UriUtils.getDecodedParam(uri, paramName));
49+
}
50+
51+
@Test
52+
void getDecodedParamMissingParameter() throws URISyntaxException {
53+
URI uri = new URI(
54+
"snyk:///test_repos/project-with-vulns/routes/vulnCodeSnippet.ts?other=parameter");
55+
String paramName = "product";
56+
57+
assertNull(UriUtils.getDecodedParam(uri, paramName));
58+
}
59+
60+
@Test
61+
public void parseQueryString_Returns_Parameters_In_Query_String()
62+
throws Exception {
63+
String query = "product=Snyk+Code&issueId=7642f506c568056a7090d3ceb7b3c2e0&action=showInDetailPanel";
64+
URI uriWithQuery = new URI("snyk://path/to/resource?" + query);
65+
66+
var result = UriUtils.getQueryParameters(uriWithQuery.getQuery());
67+
assertEquals(3, result.size());
68+
}
69+
70+
@Test
71+
public void parseQueryString_Returns_Empty_Map_If_Query_String_Is_Empty()
72+
throws URISyntaxException {
73+
var result = UriUtils.getQueryParameters(null);
74+
assertTrue(result.isEmpty());
75+
}
76+
77+
@Test
78+
void queryParametersEmptyQueryString() {
79+
Map<String, String> paramMap = UriUtils.getQueryParameters("");
80+
81+
assertTrue(paramMap.isEmpty());
82+
}
83+
84+
@Test
85+
void queryParametersNullQueryString() {
86+
Map<String, String> paramMap = UriUtils.getQueryParameters(null);
87+
88+
assertTrue(paramMap.isEmpty());
89+
}
90+
91+
@Test
92+
void queryParametersSingleParameter() {
93+
String queryString = "product=Snyk+Code";
94+
Map<String, String> expectedParamMap = Collections
95+
.singletonMap("product", "Snyk Code");
96+
97+
Map<String, String> paramMap = UriUtils.getQueryParameters(queryString);
98+
99+
assertEquals(expectedParamMap, paramMap);
100+
}
101+
102+
@Test
103+
void queryParametersMultipleParameters() {
104+
String queryString = "product=Snyk+Code&other=parameter";
105+
Map<String, String> expectedParamMap = new HashMap<>();
106+
expectedParamMap.put("product", "Snyk Code");
107+
expectedParamMap.put("other", "parameter");
108+
109+
110+
Map<String, String> paramMap = UriUtils.getQueryParameters(queryString);
111+
112+
assertEquals(expectedParamMap, paramMap);
113+
}
114+
115+
}

0 commit comments

Comments
 (0)