Skip to content

Commit f8d0b42

Browse files
feat: provide configured jdk for java projects (#234)
* feat: provide JRE if java project * fix: dont fail on missing jdt * chore: add comment * chore: add comment
1 parent 5f656b5 commit f8d0b42

9 files changed

Lines changed: 89 additions & 23 deletions

File tree

plugin/src/main/java/io/snyk/eclipse/plugin/SnykStartup.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -164,7 +164,6 @@ static LsDownloader getLsDownloader() throws URISyntaxException {
164164
return new LsDownloader(HttpClientFactory.getInstance(), runtimeEnvironment, logger);
165165
}
166166

167-
@SuppressWarnings("ResultOfMethodCallIgnored")
168167
public static IStatus download(IProgressMonitor monitor) {
169168
final File lsFile = new File(Preferences.getInstance().getCliPath());
170169
try {
@@ -183,6 +182,6 @@ public static boolean isDownloading() {
183182
}
184183

185184
public void setLogger(ILog logger) {
186-
this.logger = logger;
185+
SnykStartup.logger = logger;
187186
}
188187
}

plugin/src/main/java/io/snyk/languageserver/LsConfigurationUpdater.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@
1010
import io.snyk.languageserver.download.LsBinaries;
1111
import io.snyk.languageserver.protocolextension.SnykExtendedLanguageClient;
1212

13-
@SuppressWarnings("restriction")
1413
public class LsConfigurationUpdater {
1514

1615
public void configurationChanged() {
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
package io.snyk.languageserver.protocolextension;
2+
3+
import org.apache.commons.lang3.exception.ExceptionUtils;
4+
import org.eclipse.core.resources.IProject;
5+
import org.eclipse.core.runtime.IPath;
6+
import org.eclipse.jdt.core.IClasspathEntry;
7+
import org.eclipse.jdt.core.IJavaProject;
8+
import org.eclipse.jdt.core.JavaCore;
9+
10+
import io.snyk.eclipse.plugin.utils.SnykLogger;
11+
import io.snyk.languageserver.protocolextension.messageObjects.LsSdk;
12+
13+
public class SdkHelper {
14+
private static final String JAVA = "java";
15+
16+
public LsSdk getJDK(IProject project) {
17+
try {
18+
IJavaProject javaProject = JavaCore.create(project);
19+
IClasspathEntry[] classpathEntries;
20+
classpathEntries = javaProject.getResolvedClasspath(true);
21+
for (IClasspathEntry entry : classpathEntries) {
22+
if (entry.getEntryKind() == IClasspathEntry.CPE_LIBRARY) {
23+
IPath classPath = entry.getPath();
24+
var segments = classPath.segments();
25+
for (String segment : segments) {
26+
if (segment.toLowerCase().contains("jdk") || segment.toLowerCase().contains("jre")) {
27+
// the classpath contains the rt.jar, which is located in the lib folder
28+
// thus, we go two segments up in the path, to get the java home
29+
String javaHome = classPath.removeLastSegments(2).toOSString();
30+
return new LsSdk(JAVA, javaHome);
31+
}
32+
}
33+
}
34+
}
35+
} catch (Exception e) {
36+
SnykLogger.logInfo(ExceptionUtils.getStackTrace(e));
37+
return null;
38+
}
39+
return null;
40+
}
41+
42+
}

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

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import java.io.File;
2525
import java.net.URI;
2626
import java.nio.file.InvalidPathException;
27+
import java.nio.file.Path;
2728
import java.nio.file.Paths;
2829
import java.util.ArrayList;
2930
import java.util.Arrays;
@@ -42,6 +43,8 @@
4243
import org.apache.commons.lang3.exception.ExceptionUtils;
4344
import org.eclipse.core.resources.IProject;
4445
import org.eclipse.core.resources.ResourcesPlugin;
46+
import org.eclipse.core.runtime.CoreException;
47+
import org.eclipse.jdt.core.JavaCore;
4548
import org.eclipse.jdt.internal.core.JavaProject;
4649
import org.eclipse.jface.viewers.IStructuredSelection;
4750
import org.eclipse.jface.wizard.WizardDialog;
@@ -54,8 +57,10 @@
5457
import org.eclipse.lsp4j.WorkDoneProgressEnd;
5558
import org.eclipse.lsp4j.WorkDoneProgressKind;
5659
import org.eclipse.lsp4j.WorkDoneProgressNotification;
60+
import org.eclipse.lsp4j.WorkspaceFolder;
5761
import org.eclipse.lsp4j.jsonrpc.messages.Either;
5862
import org.eclipse.lsp4j.jsonrpc.services.JsonNotification;
63+
import org.eclipse.lsp4j.jsonrpc.services.JsonRequest;
5964
import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
6065
import org.eclipse.lsp4j.services.LanguageServer;
6166
import org.eclipse.swt.widgets.Display;
@@ -73,6 +78,7 @@
7378
import io.snyk.eclipse.plugin.analytics.AnalyticsEventTask;
7479
import io.snyk.eclipse.plugin.analytics.TaskProcessor;
7580
import io.snyk.eclipse.plugin.properties.preferences.Preferences;
81+
import io.snyk.eclipse.plugin.utils.ResourceUtils;
7682
import io.snyk.eclipse.plugin.utils.SnykLogger;
7783
import io.snyk.eclipse.plugin.views.SnykView;
7884
import io.snyk.eclipse.plugin.views.snyktoolview.FileTreeNode;
@@ -94,6 +100,7 @@
94100
import io.snyk.languageserver.protocolextension.messageObjects.Diagnostic316;
95101
import io.snyk.languageserver.protocolextension.messageObjects.FeatureFlagStatus;
96102
import io.snyk.languageserver.protocolextension.messageObjects.HasAuthenticatedParam;
103+
import io.snyk.languageserver.protocolextension.messageObjects.LsSdk;
97104
import io.snyk.languageserver.protocolextension.messageObjects.PublishDiagnostics316Param;
98105
import io.snyk.languageserver.protocolextension.messageObjects.SnykIsAvailableCliParams;
99106
import io.snyk.languageserver.protocolextension.messageObjects.SnykScanParam;
@@ -749,4 +756,25 @@ public ProgressManager getProgressManager() {
749756
public void setLs(LanguageServer ls) {
750757
this.ls = ls;
751758
}
759+
760+
@JsonRequest(value = "workspace/snyk.sdks")
761+
public CompletableFuture<List<LsSdk>> getSdks(WorkspaceFolder workspaceFolder) {
762+
return CompletableFuture.supplyAsync(() -> {
763+
var uri = URI.create(workspaceFolder.getUri());
764+
var path = Path.of(uri);
765+
var sdkHelper = new SdkHelper();
766+
List<LsSdk> list = new ArrayList<>();
767+
var project = ResourceUtils.getProjectByPath(path);
768+
try {
769+
if (!project.hasNature(JavaCore.NATURE_ID))
770+
return List.of();
771+
772+
list.add(sdkHelper.getJDK(project));
773+
} catch (Exception e) {
774+
SnykLogger.logInfo(ExceptionUtils.getStackTrace(e));
775+
return List.of();
776+
}
777+
return list;
778+
});
779+
}
752780
}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
package io.snyk.languageserver.protocolextension.messageObjects;
2+
3+
public record LsSdk(String type, String path) {
4+
}

tests/src/test/java/io/snyk/eclipse/plugin/properties/preferences/PreferencesTest.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@
1313
import io.snyk.eclipse.plugin.EnvironmentConstants;
1414
import io.snyk.languageserver.LsRuntimeEnvironment;
1515

16-
@SuppressWarnings("restriction")
1716
class PreferencesTest {
1817

1918
@BeforeEach

tests/src/test/java/io/snyk/eclipse/plugin/runner/ProcessRunnerTest.java

Lines changed: 14 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,28 @@
11
package io.snyk.eclipse.plugin.runner;
22

3-
import io.snyk.eclipse.plugin.EnvironmentConstants;
4-
import io.snyk.eclipse.plugin.properties.preferences.Preferences;
5-
import io.snyk.eclipse.plugin.properties.preferences.PreferencesUtils;
6-
import io.snyk.languageserver.LsRuntimeEnvironment;
3+
import static org.junit.jupiter.api.Assertions.assertEquals;
4+
import static org.junit.jupiter.api.Assertions.assertFalse;
5+
import static org.junit.jupiter.api.Assertions.assertTrue;
6+
import static org.mockito.ArgumentMatchers.any;
7+
import static org.mockito.Mockito.mock;
8+
import static org.mockito.Mockito.verify;
9+
import static org.mockito.Mockito.when;
10+
11+
import java.util.List;
12+
import java.util.Optional;
713

814
import org.eclipse.core.net.proxy.IProxyData;
915
import org.eclipse.core.net.proxy.IProxyService;
1016
import org.eclipse.core.runtime.ILog;
1117
import org.junit.jupiter.api.BeforeEach;
1218
import org.junit.jupiter.api.Test;
13-
import org.mockito.Mockito;
1419
import org.osgi.framework.Bundle;
1520
import org.osgi.framework.Version;
1621

17-
import java.util.List;
18-
import java.util.Optional;
19-
20-
import static org.junit.jupiter.api.Assertions.assertEquals;
21-
import static org.junit.jupiter.api.Assertions.assertFalse;
22-
import static org.junit.jupiter.api.Assertions.assertTrue;
23-
import static org.mockito.ArgumentMatchers.any;
24-
import static org.mockito.Mockito.mock;
25-
import static org.mockito.Mockito.verify;
26-
import static org.mockito.Mockito.when;
22+
import io.snyk.eclipse.plugin.EnvironmentConstants;
23+
import io.snyk.eclipse.plugin.properties.preferences.Preferences;
24+
import io.snyk.eclipse.plugin.properties.preferences.PreferencesUtils;
25+
import io.snyk.languageserver.LsRuntimeEnvironment;
2726

2827
class ProcessRunnerTest {
2928
private Preferences preferenceMock;

tests/src/test/java/io/snyk/languageserver/LsBaseTest.java

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
package io.snyk.languageserver;
22

3-
import static org.mockito.ArgumentMatchers.any;
43
import static org.mockito.Mockito.clearAllCaches;
54
import static org.mockito.Mockito.mock;
65
import static org.mockito.Mockito.when;
@@ -16,7 +15,6 @@
1615
import io.snyk.eclipse.plugin.properties.preferences.Preferences;
1716
import io.snyk.eclipse.plugin.properties.preferences.PreferencesUtils;
1817

19-
@SuppressWarnings("ResultOfMethodCallIgnored")
2018
public class LsBaseTest {
2119
protected LsRuntimeEnvironment environment = null;
2220
protected IProxyService proxyServiceMock;

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

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@
1212
import static io.snyk.eclipse.plugin.views.snyktoolview.ISnykToolView.getPlural;
1313
import static org.junit.jupiter.api.Assertions.assertEquals;
1414
import static org.mockito.ArgumentMatchers.any;
15-
import static org.mockito.Mockito.CALLS_REAL_METHODS;
1615
import static org.mockito.Mockito.mock;
1716
import static org.mockito.Mockito.mockStatic;
1817
import static org.mockito.Mockito.reset;
@@ -25,7 +24,6 @@
2524
import java.io.File;
2625
import java.io.IOException;
2726
import java.net.URI;
28-
import java.nio.file.Files;
2927
import java.nio.file.Path;
3028
import java.nio.file.Paths;
3129
import java.util.Collection;

0 commit comments

Comments
 (0)