Skip to content

Commit 5bff67c

Browse files
feat: display error message [IDE-797] (#233)
* feat: display error message * feat: display error message * fix: load init script
1 parent f8d0b42 commit 5bff67c

4 files changed

Lines changed: 92 additions & 4 deletions

File tree

plugin/src/main/java/io/snyk/eclipse/plugin/html/BaseHtmlProvider.java

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,4 +110,46 @@ public ITheme getCurrentTheme() {
110110
currentTheme = themeManager.getCurrentTheme();
111111
return currentTheme;
112112
}
113+
114+
public String getErrorHtml(String errorMessage, String path) {
115+
var html = """
116+
<!DOCTYPE html>
117+
<html lang="en">
118+
<head>
119+
<meta charset="UTF-8">
120+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
121+
<title>Snyk for Eclipse</title>
122+
<style>
123+
body {
124+
font-family: var(--default-font);
125+
background-color: var(--background-color);
126+
color: var(--text-color);
127+
}
128+
.container {
129+
display: flex;
130+
align-items: center;
131+
}
132+
.logo {
133+
margin-right: 20px;
134+
}
135+
</style>
136+
</head>
137+
<body>
138+
<div class="container">
139+
<div>
140+
<p><strong>An error occurred:</strong></p>
141+
<p>
142+
<table>
143+
<tr><td width="150" >Error message:</td><td>%s</td></tr>
144+
<tr></tr>
145+
<tr><td>Path:</td><td>%s</td></tr>
146+
</table>
147+
</p>
148+
</div>
149+
</div>
150+
</body>
151+
</html>
152+
""".formatted(errorMessage, path);
153+
return replaceCssVariables(html);
154+
}
113155
}

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

Lines changed: 37 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package io.snyk.eclipse.plugin.views.snyktoolview;
22

33
import java.nio.file.Paths;
4+
import java.util.HashMap;
5+
import java.util.Map;
46
import java.util.concurrent.CompletableFuture;
57

68
import org.apache.commons.lang3.StringUtils;
@@ -18,6 +20,9 @@
1820
import org.eclipse.swt.program.Program;
1921
import org.eclipse.swt.widgets.Display;
2022

23+
import com.google.gson.Gson;
24+
25+
import io.snyk.eclipse.plugin.html.BaseHtmlProvider;
2126
import io.snyk.eclipse.plugin.html.HtmlProviderFactory;
2227
import io.snyk.eclipse.plugin.html.StaticPageHtmlProvider;
2328

@@ -87,25 +92,53 @@ public void completed(ProgressEvent event) {
8792
initBrowserText();
8893
}
8994

95+
private record ErrorMessage(String error, String path) {
96+
}
97+
9098
public CompletableFuture<Void> updateBrowserContent(TreeNode node) {
9199
// Generate HTML content based on the selected node
100+
var htmlProvider = getHtmlProvider(node);
101+
initScript = htmlProvider.getInitScript();
102+
if (node instanceof ProductTreeNode) {
103+
var ptn = (ProductTreeNode) node;
104+
String errorJson = ptn.getErrorMessage();
105+
if (errorJson != null && !errorJson.isBlank()) {
106+
var error = new Gson().fromJson(errorJson, ErrorMessage.class);
107+
String errorHtml = htmlProvider.getErrorHtml(error.error, error.path);
108+
Display.getDefault().syncExec(() -> {
109+
browser.setText(errorHtml);
110+
});
111+
}
112+
}
113+
92114
if (!(node instanceof IssueTreeNode))
93115
return CompletableFuture.completedFuture(null);
94116

95117
return CompletableFuture.supplyAsync(() -> {
96118
return generateHtmlContent(node);
97119
}).thenAccept(htmlContent -> {
120+
var content = htmlProvider.replaceCssVariables(htmlContent);
98121
Display.getDefault().syncExec(() -> {
99-
var product = ((ProductTreeNode) node.getParent().getParent()).getProduct();
100-
var htmlProvider = HtmlProviderFactory.GetHtmlProvider(product);
101-
var content = htmlProvider.replaceCssVariables(htmlContent);
102-
initScript = htmlProvider.getInitScript();
103122
browser.setText(content);
104123
});
105124
});
106125

107126
}
108127

128+
private BaseHtmlProvider getHtmlProvider(TreeNode node) {
129+
var product = "";
130+
if (node instanceof IssueTreeNode) {
131+
product = ((ProductTreeNode) node.getParent().getParent()).getProduct();
132+
} else if (node instanceof ProductTreeNode) {
133+
product = ((ProductTreeNode) node).getProduct();
134+
} else {
135+
return new BaseHtmlProvider();
136+
}
137+
138+
var htmlProvider = HtmlProviderFactory.GetHtmlProvider(product);
139+
return htmlProvider;
140+
}
141+
109142
public String generateHtmlContent(TreeNode node) {
110143
if (node instanceof BaseTreeNode) {
111144
return ((BaseTreeNode) node).getDetails();

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

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
public class ProductTreeNode extends BaseTreeNode {
1313

1414
private String product;
15+
private String errorMessage;
1516

1617
public ProductTreeNode(String value) {
1718
super(value);
@@ -96,6 +97,7 @@ private String removePrefix(String value) {
9697
public void reset() {
9798
this.removeChildren();
9899
this.setValue(product);
100+
this.setErrorMessage(null);
99101
}
100102

101103
public String getProduct() {
@@ -105,4 +107,12 @@ public String getProduct() {
105107
public void setProduct(String product) {
106108
this.product = product;
107109
}
110+
111+
public String getErrorMessage() {
112+
return errorMessage;
113+
}
114+
115+
public void setErrorMessage(String errorMessage) {
116+
this.errorMessage = errorMessage;
117+
}
108118
}

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -377,6 +377,9 @@ public void snykScan(SnykScanParam param) {
377377
break;
378378
case SCAN_STATE_ERROR:
379379
scanState.setScanInProgress(inProgressKey, false);
380+
for (ProductTreeNode productTreeNode : affectedProductTreeNodes) {
381+
productTreeNode.setErrorMessage(param.getErrorMessage());
382+
}
380383
break;
381384
}
382385
setNodeState(param.getStatus(), affectedProductTreeNodes, issueCache);

0 commit comments

Comments
 (0)