From ebbf2d7db209b934d1b0c2d6e8812e194fa74ee1 Mon Sep 17 00:00:00 2001 From: kerenr-jfrog Date: Tue, 25 Mar 2025 16:08:47 +0200 Subject: [PATCH 1/7] progress --- .../jfrog/ide/eclipse/scan/ScanManager.java | 42 +++++++++++++------ 1 file changed, 30 insertions(+), 12 deletions(-) diff --git a/bundle/src/main/java/com/jfrog/ide/eclipse/scan/ScanManager.java b/bundle/src/main/java/com/jfrog/ide/eclipse/scan/ScanManager.java index 73723ab..0d604b7 100644 --- a/bundle/src/main/java/com/jfrog/ide/eclipse/scan/ScanManager.java +++ b/bundle/src/main/java/com/jfrog/ide/eclipse/scan/ScanManager.java @@ -1,16 +1,21 @@ package com.jfrog.ide.eclipse.scan; +import java.io.File; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; +import java.util.List; import java.util.concurrent.CancellationException; import org.eclipse.core.resources.IProject; +import org.eclipse.core.resources.IWorkspace; +import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.ICoreRunnable; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.swt.widgets.Composite; +import org.jfrog.build.extractor.executor.CommandResults; import org.jfrog.build.extractor.scan.DependencyTree; import com.fasterxml.jackson.core.JsonProcessingException; @@ -31,18 +36,21 @@ /** * @author yahavi */ -public abstract class ScanManager { +public class ScanManager { static final Path HOME_PATH = Paths.get(System.getProperty("user.home"), ".jfrog-eclipse-plugin"); private IProgressMonitor monitor; - IProject project; + IWorkspace iworkspace; + IProject[] projects; Log log; JfrogCliDriver cliDriver; - ScanManager(IProject project, ComponentPrefix prefix) throws IOException { - this.project = project; + ScanManager(ComponentPrefix prefix) throws IOException { + this.iworkspace = ResourcesPlugin.getWorkspace(); + this.projects = iworkspace.getRoot().getProjects(); Files.createDirectories(HOME_PATH); - log = Logger.getInstance(); + this.log = Logger.getInstance(); + this.cliDriver = new JfrogCliDriver(System.getenv(), HOME_PATH.toString(), log); // TODO: use the singleton implemented by } /** @@ -55,10 +63,7 @@ public abstract class ScanManager { * @throws IOException * @throws JsonProcessingException */ - - public IProject getIProject() { - return project; - } + public void setMonitor(IProgressMonitor monitor) { this.monitor = monitor; @@ -76,11 +81,11 @@ public IProgressMonitor getMonitor(){ * disposed. */ public void scanAndUpdateResults(boolean quickScan, IssuesTree issuesTree, Composite parent) { - ScanJob.doSchedule(project.getName(), new ScanRunnable(parent, issuesTree, quickScan)); +// ScanJob.doSchedule(project.getName(), new ScanRunnable(parent, issuesTree, quickScan)); } /** - * Start a dependency scan. + * Start an audit scan. */ private class ScanRunnable implements ICoreRunnable { private IssuesTree issuesTree; @@ -95,7 +100,20 @@ private ScanRunnable(Composite parent, IssuesTree issuesTree, boolean quickScan) @Override public void run(IProgressMonitor monitor) throws CoreException { - // TODO: implement scan manager using JfrogCliDriver + try { +// (File workingDirectory, List scannedDirectories, String serverId, List extraArgs) + // TODO: get working dir = the root project, scannedDirectories = empty string for now, server-id (from singleton), + CommandResults auditResults = cliDriver.runCliAudit(null, null, null, null); + if (!auditResults.isOk()) { + // log the issue to the problems tab + log.error("Audit scan failed with an error: " + auditResults.getErr()); + return; + } + + + } catch (Exception e) { + e.printStackTrace(); + } } private void setScanResults() { From 1a3dbb2dbed5c14580692c7580b325ac7aa8c5dd Mon Sep 17 00:00:00 2001 From: kerenr-jfrog Date: Wed, 26 Mar 2025 22:10:30 +0200 Subject: [PATCH 2/7] initial implementation --- bundle/pom.xml | 2 +- .../configuration/PreferenceConstants.java | 1 + .../XrayGlobalConfiguration.java | 17 ++++ .../com/jfrog/ide/eclipse/scan/ScanCache.java | 37 +++++++++ .../jfrog/ide/eclipse/scan/ScanManager.java | 82 +++++++++++++++---- .../eclipse/ui/ScanTreeContentProvider.java | 31 +++++-- .../jfrog/ide/eclipse/ui/SearchableTree.java | 11 ++- .../ide/eclipse/ui/issues/IssuesTree.java | 47 ++++++----- 8 files changed, 183 insertions(+), 45 deletions(-) create mode 100644 bundle/src/main/java/com/jfrog/ide/eclipse/scan/ScanCache.java diff --git a/bundle/pom.xml b/bundle/pom.xml index 6b8b9b2..e222ea5 100644 --- a/bundle/pom.xml +++ b/bundle/pom.xml @@ -27,7 +27,7 @@ - 2.4.0 + 2.4.1 diff --git a/bundle/src/main/java/com/jfrog/ide/eclipse/configuration/PreferenceConstants.java b/bundle/src/main/java/com/jfrog/ide/eclipse/configuration/PreferenceConstants.java index 4672d5a..6e806be 100644 --- a/bundle/src/main/java/com/jfrog/ide/eclipse/configuration/PreferenceConstants.java +++ b/bundle/src/main/java/com/jfrog/ide/eclipse/configuration/PreferenceConstants.java @@ -12,6 +12,7 @@ public class PreferenceConstants { public static final String XRAY_URL = "URL"; public static final String XRAY_USERNAME = "Username"; public static final String XRAY_PASSWORD = "Password"; + public static final String DEBUG_LOGS = "checkboxPreference"; // Connection constants public static final int CONNECTION_TIMEOUT_MILLISECONDS = 300 * 1000; diff --git a/bundle/src/main/java/com/jfrog/ide/eclipse/configuration/XrayGlobalConfiguration.java b/bundle/src/main/java/com/jfrog/ide/eclipse/configuration/XrayGlobalConfiguration.java index 8514cbc..977d858 100644 --- a/bundle/src/main/java/com/jfrog/ide/eclipse/configuration/XrayGlobalConfiguration.java +++ b/bundle/src/main/java/com/jfrog/ide/eclipse/configuration/XrayGlobalConfiguration.java @@ -1,6 +1,9 @@ package com.jfrog.ide.eclipse.configuration; +import java.io.IOException; + import org.eclipse.core.runtime.preferences.ConfigurationScope; +import org.eclipse.jface.preference.BooleanFieldEditor; import org.eclipse.jface.preference.FieldEditorPreferencePage; import org.eclipse.jface.preference.PreferenceDialog; import org.eclipse.jface.preference.StringFieldEditor; @@ -10,8 +13,11 @@ import org.eclipse.ui.dialogs.PreferencesUtil; import org.eclipse.ui.preferences.ScopedPreferenceStore; +import com.jfrog.ide.eclipse.log.Logger; +import com.jfrog.ide.eclipse.scan.ScanManager; import com.jfrog.ide.eclipse.ui.ComponentDetails; import com.jfrog.ide.eclipse.ui.issues.ComponentIssueDetails; +import com.jfrog.ide.eclipse.ui.issues.IssuesTree; /** * Panel for configuring Xray URL, username and password. @@ -38,6 +44,10 @@ public void createFieldEditors() { addField(usernameEditor); addField(passwordEditor); addField(new TestConnectionButton(urlEditor, usernameEditor, passwordEditor, getFieldEditorParent())); + + BooleanFieldEditor debugLogsCheckbox = new BooleanFieldEditor(PreferenceConstants.DEBUG_LOGS, "Generate Debug Logs", + getFieldEditorParent()); + addField(debugLogsCheckbox); } @Override @@ -57,6 +67,13 @@ public boolean performOk() { } if (doQuickScan) { // TODO: run a scan using the ScanManager + try { + new ScanManager().scanAndUpdateResults(true, IssuesTree.getInstance(), getShell().getParent(), + getPreferenceStore().getBoolean(PreferenceConstants.DEBUG_LOGS)); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } } return true; } diff --git a/bundle/src/main/java/com/jfrog/ide/eclipse/scan/ScanCache.java b/bundle/src/main/java/com/jfrog/ide/eclipse/scan/ScanCache.java new file mode 100644 index 0000000..0bf09aa --- /dev/null +++ b/bundle/src/main/java/com/jfrog/ide/eclipse/scan/ScanCache.java @@ -0,0 +1,37 @@ +package com.jfrog.ide.eclipse.scan; + +import java.util.ArrayList; +import java.util.List; + +import com.jfrog.ide.common.nodes.FileTreeNode; + +public class ScanCache { + private List scanResults; + + private static ScanCache instance; + + private ScanCache() { + scanResults = new ArrayList(); + } + + public static ScanCache getInstance() { + if (instance == null) { + synchronized (ScanCache.class) { + if (instance == null) { + instance = new ScanCache(); + } + } + } + return instance; + } + + public List getScanResults() { + return scanResults; + } + + public void updateScanResults(List results) { + if (results != null) { + scanResults.addAll(results); + } + } +} \ No newline at end of file diff --git a/bundle/src/main/java/com/jfrog/ide/eclipse/scan/ScanManager.java b/bundle/src/main/java/com/jfrog/ide/eclipse/scan/ScanManager.java index 0d604b7..74cb81c 100644 --- a/bundle/src/main/java/com/jfrog/ide/eclipse/scan/ScanManager.java +++ b/bundle/src/main/java/com/jfrog/ide/eclipse/scan/ScanManager.java @@ -2,19 +2,26 @@ import java.io.File; import java.io.IOException; +import java.lang.reflect.Field; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; +import java.util.Arrays; +import java.util.HashMap; import java.util.List; +import java.util.Map; import java.util.concurrent.CancellationException; +import java.util.stream.Collectors; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IWorkspace; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.ICoreRunnable; +import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.swt.widgets.Composite; +import org.jfrog.build.extractor.executor.CommandExecutor; import org.jfrog.build.extractor.executor.CommandResults; import org.jfrog.build.extractor.scan.DependencyTree; @@ -22,7 +29,10 @@ import com.jfrog.ide.common.configuration.JfrogCliDriver; import com.jfrog.ide.common.filter.FilterManager; import com.jfrog.ide.common.log.ProgressIndicator; +import com.jfrog.ide.common.nodes.FileTreeNode; +import com.jfrog.ide.common.parse.SarifParser; import com.jfrog.ide.common.scan.ComponentPrefix; +import com.jfrog.ide.common.configuration.ServerConfig; import com.jfrog.ide.eclipse.configuration.XrayServerConfigImpl; import com.jfrog.ide.eclipse.log.Logger; import com.jfrog.ide.eclipse.log.ProgressIndicatorImpl; @@ -30,6 +40,7 @@ import com.jfrog.ide.eclipse.ui.FilterManagerSingleton; import com.jfrog.ide.eclipse.ui.issues.IssuesTree; import com.jfrog.ide.eclipse.utils.ProjectsMap; +import com.jfrog.ide.eclipse.utils.ProjectsMap.ProjectKey; import com.jfrog.xray.client.services.summary.Components; import org.jfrog.build.api.util.Log; @@ -37,21 +48,28 @@ * @author yahavi */ public class ScanManager { - static final Path HOME_PATH = Paths.get(System.getProperty("user.home"), ".jfrog-eclipse-plugin"); private IProgressMonitor monitor; IWorkspace iworkspace; IProject[] projects; Log log; JfrogCliDriver cliDriver; + SarifParser sarifParser; - ScanManager(ComponentPrefix prefix) throws IOException { + public ScanManager() throws IOException { this.iworkspace = ResourcesPlugin.getWorkspace(); this.projects = iworkspace.getRoot().getProjects(); Files.createDirectories(HOME_PATH); this.log = Logger.getInstance(); this.cliDriver = new JfrogCliDriver(System.getenv(), HOME_PATH.toString(), log); // TODO: use the singleton implemented by + this.sarifParser = new SarifParser(log); + } + + + public void runScan(boolean isDebugLogs) { + } + /** * Collect and return {@link Components} to be scanned by JFrog Xray. @@ -80,8 +98,8 @@ public IProgressMonitor getMonitor(){ * @param parent - The parent UI composite. Cancel the scan if the parent is * disposed. */ - public void scanAndUpdateResults(boolean quickScan, IssuesTree issuesTree, Composite parent) { -// ScanJob.doSchedule(project.getName(), new ScanRunnable(parent, issuesTree, quickScan)); + public void scanAndUpdateResults(boolean quickScan, IssuesTree issuesTree, Composite parent, boolean isDebugLogs) { + ScanJob.doSchedule("ScanJob", new ScanRunnable(parent, issuesTree, quickScan, isDebugLogs)); //TODO: change name } /** @@ -91,30 +109,65 @@ private class ScanRunnable implements ICoreRunnable { private IssuesTree issuesTree; private boolean quickScan; private Composite parent; + boolean isDebugLogs; - private ScanRunnable(Composite parent, IssuesTree issuesTree, boolean quickScan) { + private ScanRunnable(Composite parent, IssuesTree issuesTree, boolean quickScan, boolean isDebugLogs) { this.parent = parent; this.issuesTree = issuesTree; this.quickScan = quickScan; + this.isDebugLogs = isDebugLogs; } @Override public void run(IProgressMonitor monitor) throws CoreException { + Map auditEnvVars = new HashMap<>(); try { -// (File workingDirectory, List scannedDirectories, String serverId, List extraArgs) - // TODO: get working dir = the root project, scannedDirectories = empty string for now, server-id (from singleton), - CommandResults auditResults = cliDriver.runCliAudit(null, null, null, null); - if (!auditResults.isOk()) { - // log the issue to the problems tab - log.error("Audit scan failed with an error: " + auditResults.getErr()); - return; + if (isDebugLogs) { + auditEnvVars.put("JFROG_CLI_LOG_LEVEL", "DEBUG"); } - - + // TODO: get working dir = the root project, scannedDirectories = empty string for now, server-id (from singleton), +// String workingDir = iworkspace.getRoot().getLocation().toString(); // not working well + ServerConfig server = XrayServerConfigImpl.getInstance(); + cliDriver.addCliServerConfig(server.getXrayUrl(), server.getArtifactoryUrl(), "eclipse-plugin", server.getUsername(), server.getPassword(), server.getAccessToken(), null, null); + List projectsListAsString = Arrays.stream(projects) + .map(IProject::getName) + .collect(Collectors.toList()); + for (IProject project : projects) { + if (project.isOpen()) { + IPath projectPath = project.getLocation(); + log.info(String.format("Performing scan on: %s", project.getName())); + + CommandResults auditResults = cliDriver.runCliAudit(new File(projectPath.toString()), null, "eclipse-plugin", null, auditEnvVars); + if (!auditResults.isOk()) { + // log the issue to the problems tab + log.error("Audit scan failed with an error: " + auditResults.getErr()); + return; + } + log.info("Finished audit scan successfully.\n" + auditResults.getRes()); + + // update scan cache + ScanCache.getInstance().updateScanResults(sarifParser.parse(auditResults.getRes())); + + // update issues tree + issuesTree.setScanResults(); + + parent.getDisplay().syncExec(new Runnable() { + @Override + public void run() { + if (monitor.isCanceled()) { + return; + } + issuesTree.applyFilters(new ProjectKey("KEY", "VALUE")); // TODO: change implementation + } + }); + } + } + } catch (Exception e) { e.printStackTrace(); } } + private void setScanResults() { // TODO: re implement using SarifParser @@ -123,6 +176,7 @@ private void setScanResults() { private boolean isDisposed() { return parent == null || parent.isDisposed(); } + } } diff --git a/bundle/src/main/java/com/jfrog/ide/eclipse/ui/ScanTreeContentProvider.java b/bundle/src/main/java/com/jfrog/ide/eclipse/ui/ScanTreeContentProvider.java index 4f4861d..a068c1e 100644 --- a/bundle/src/main/java/com/jfrog/ide/eclipse/ui/ScanTreeContentProvider.java +++ b/bundle/src/main/java/com/jfrog/ide/eclipse/ui/ScanTreeContentProvider.java @@ -1,15 +1,20 @@ package com.jfrog.ide.eclipse.ui; -import org.eclipse.jface.viewers.ITreeContentProvider; -import org.jfrog.build.extractor.scan.DependencyTree; +import java.util.ArrayList; +import java.util.List; + +import javax.swing.tree.TreeNode; +import org.eclipse.jface.viewers.ITreeContentProvider; +import com.jfrog.ide.common.nodes.FileTreeNode; +import com.jfrog.ide.common.nodes.IssueNode; /** * Content provider for DependenciesTree. * * @author yahavi */ public class ScanTreeContentProvider implements ITreeContentProvider { - private static final DependencyTree[] EMPTY_NODE = new DependencyTree[0]; +// private static final List EMPTY_NODE = new ArrayList(); @Override public Object[] getElements(Object element) { @@ -18,16 +23,30 @@ public Object[] getElements(Object element) { @Override public Object[] getChildren(Object element) { - return (((DependencyTree) element).getChildren()).toArray(EMPTY_NODE); + if (element instanceof FileTreeNode) { + List children = ((FileTreeNode) element).getChildren(); // TODO: check if works + return children.toArray(); + } else if (element instanceof List) { + // If the element is a List (root nodes), return its elements + List list = (List) element; + return list.toArray(); + } + return new Object[0]; } @Override public Object getParent(Object element) { - return ((DependencyTree) element).getParent(); + if (element instanceof FileTreeNode) { + return ((FileTreeNode) element).getParent(); + } + return null; } @Override public boolean hasChildren(Object element) { - return !((DependencyTree) element).isLeaf(); + if (element instanceof FileTreeNode) { + return !((FileTreeNode) element).isLeaf(); + } + return false; } } diff --git a/bundle/src/main/java/com/jfrog/ide/eclipse/ui/SearchableTree.java b/bundle/src/main/java/com/jfrog/ide/eclipse/ui/SearchableTree.java index c51272c..f6ebd99 100644 --- a/bundle/src/main/java/com/jfrog/ide/eclipse/ui/SearchableTree.java +++ b/bundle/src/main/java/com/jfrog/ide/eclipse/ui/SearchableTree.java @@ -19,6 +19,8 @@ import org.jfrog.build.extractor.scan.DependencyTree; import com.google.common.collect.Lists; +import com.jfrog.ide.common.nodes.FileTreeNode; +import com.jfrog.ide.eclipse.scan.ScanCache; import com.jfrog.ide.eclipse.utils.ProjectsMap; /** @@ -28,9 +30,10 @@ */ public abstract class SearchableTree extends FilteredTree { - protected ProjectsMap projects = new ProjectsMap(); +// protected ProjectsMap projects = new ProjectsMap(); protected ComponentDetails componentDetails; private TreeColumnLayout treeLayout = new TreeColumnLayout(); + protected List scanResults; public SearchableTree(Composite parent, ColumnLabelProvider labelProvider) { super(parent, true); @@ -106,11 +109,11 @@ public void expandAll() { } public void reset() { - projects.clear(); + scanResults.clear(); } - public void addScanResults(String projectName, DependencyTree dependencyTree) { - projects.put(projectName, dependencyTree); + public void setScanResults() { + scanResults = ScanCache.getInstance().getScanResults(); } public abstract void applyFilters(ProjectsMap.ProjectKey projectName); diff --git a/bundle/src/main/java/com/jfrog/ide/eclipse/ui/issues/IssuesTree.java b/bundle/src/main/java/com/jfrog/ide/eclipse/ui/issues/IssuesTree.java index 589654d..b02146e 100644 --- a/bundle/src/main/java/com/jfrog/ide/eclipse/ui/issues/IssuesTree.java +++ b/bundle/src/main/java/com/jfrog/ide/eclipse/ui/issues/IssuesTree.java @@ -1,5 +1,6 @@ package com.jfrog.ide.eclipse.ui.issues; +import java.util.List; import java.util.Map.Entry; import org.eclipse.jface.viewers.TreeViewerColumn; @@ -35,7 +36,8 @@ public static IssuesTree getInstance() { private IssuesTree(Composite parent) { super(parent, new IssuesTreeColumnLabelProvider()); issuesCountColumn = createColumn("Issues (0)", new IssueCountColumnLabelProvider(this), SWT.RIGHT, 0); - applyFiltersForAllProjects(); + showScanResults(); + // applyFiltersForAllProjects(); } @Override @@ -50,29 +52,30 @@ public void setComponentIssueTable(ComponentIssueTable componentIssueTable) { @Override public void applyFilters(ProjectKey projectKey) { - DependencyTree project = projects.get(projectKey); - if (project != null) { - FilterManager filterManager = FilterManagerSingleton.getInstance(); - DependencyTree filteredRoot = filterManager.applyFilters(project); - filteredRoot.setIssues(filteredRoot.processTreeIssues()); - root.add(filteredRoot); - if (root.getChildCount() == 1) { - // If there is only one project - Show only its dependencies in the tree viewer. - treeViewer.setInput(filteredRoot); - } else { - treeViewer.setInput(root); - } - long totalIssues = root.getChildren().stream().mapToInt(DependencyTree::getIssueCount).sum(); - issuesCountColumn.getColumn().setText("Issues (" + totalIssues + ")"); - } +// DependencyTree project = projects.get(projectKey); +// if (project != null) { +// FilterManager filterManager = FilterManagerSingleton.getInstance(); +// DependencyTree filteredRoot = filterManager.applyFilters(project); +// filteredRoot.setIssues(filteredRoot.processTreeIssues()); +// root.add(filteredRoot); +// if (root.getChildCount() == 1) { +// // If there is only one project - Show only its dependencies in the tree viewer. +// treeViewer.setInput(filteredRoot); +// } else { +// treeViewer.setInput(root); +// } +// long totalIssues = root.getChildren().stream().mapToInt(DependencyTree::getIssueCount).sum(); +// issuesCountColumn.getColumn().setText("Issues (" + totalIssues + ")"); +// } + treeViewer.setInput(scanResults); } @Override public void applyFiltersForAllProjects() { - root = new DependencyTree(); - for (Entry entry : projects.entrySet()) { - applyFilters(entry.getKey()); - } +// root = new DependencyTree(); +// for (Entry entry : projects.entrySet()) { +// applyFilters(entry.getKey()); +// } } @Override @@ -89,4 +92,8 @@ public static void disposeTree() { instance.dispose(); } } + + private void showScanResults() { + + } } From ecc0a5cb860f717929c7b097b4735f903715927a Mon Sep 17 00:00:00 2001 From: kerenr-jfrog Date: Thu, 27 Mar 2025 18:45:17 +0200 Subject: [PATCH 3/7] scan manager implementation done --- .../XrayGlobalConfiguration.java | 2 +- .../com/jfrog/ide/eclipse/scan/ScanCache.java | 5 ++ .../jfrog/ide/eclipse/scan/ScanManager.java | 61 ++++++++++++------- 3 files changed, 45 insertions(+), 23 deletions(-) diff --git a/bundle/src/main/java/com/jfrog/ide/eclipse/configuration/XrayGlobalConfiguration.java b/bundle/src/main/java/com/jfrog/ide/eclipse/configuration/XrayGlobalConfiguration.java index 977d858..d64ac35 100644 --- a/bundle/src/main/java/com/jfrog/ide/eclipse/configuration/XrayGlobalConfiguration.java +++ b/bundle/src/main/java/com/jfrog/ide/eclipse/configuration/XrayGlobalConfiguration.java @@ -68,7 +68,7 @@ public boolean performOk() { if (doQuickScan) { // TODO: run a scan using the ScanManager try { - new ScanManager().scanAndUpdateResults(true, IssuesTree.getInstance(), getShell().getParent(), + new ScanManager().startScan(getShell().getParent(), getPreferenceStore().getBoolean(PreferenceConstants.DEBUG_LOGS)); } catch (IOException e) { // TODO Auto-generated catch block diff --git a/bundle/src/main/java/com/jfrog/ide/eclipse/scan/ScanCache.java b/bundle/src/main/java/com/jfrog/ide/eclipse/scan/ScanCache.java index 0bf09aa..d79b3f2 100644 --- a/bundle/src/main/java/com/jfrog/ide/eclipse/scan/ScanCache.java +++ b/bundle/src/main/java/com/jfrog/ide/eclipse/scan/ScanCache.java @@ -4,6 +4,7 @@ import java.util.List; import com.jfrog.ide.common.nodes.FileTreeNode; +import com.jfrog.ide.common.utils.XrayConnectionUtils.Results; public class ScanCache { private List scanResults; @@ -34,4 +35,8 @@ public void updateScanResults(List results) { scanResults.addAll(results); } } + + public void resetCache() { + scanResults = new ArrayList(); + } } \ No newline at end of file diff --git a/bundle/src/main/java/com/jfrog/ide/eclipse/scan/ScanManager.java b/bundle/src/main/java/com/jfrog/ide/eclipse/scan/ScanManager.java index 74cb81c..b1f73af 100644 --- a/bundle/src/main/java/com/jfrog/ide/eclipse/scan/ScanManager.java +++ b/bundle/src/main/java/com/jfrog/ide/eclipse/scan/ScanManager.java @@ -66,8 +66,23 @@ public ScanManager() throws IOException { } - public void runScan(boolean isDebugLogs) { - + public void startScan(Composite parent, boolean isDebugLogs) { + Map auditEnvVars = new HashMap<>(); + try { + if (isDebugLogs) { + auditEnvVars.put("JFROG_CLI_LOG_LEVEL", "DEBUG"); + } + ServerConfig server = XrayServerConfigImpl.getInstance(); + cliDriver.addCliServerConfig(server.getXrayUrl(), server.getArtifactoryUrl(), "eclipse-plugin", server.getUsername(), server.getPassword(), server.getAccessToken(), null, null); + List projectsListAsString = Arrays.stream(projects) + .map(IProject::getName) + .collect(Collectors.toList()); + for (IProject project : projects) { + scanAndUpdateResults(IssuesTree.getInstance(), parent, isDebugLogs, project, auditEnvVars); + } + } catch (Exception e) { + e.printStackTrace(); + } } @@ -98,8 +113,8 @@ public IProgressMonitor getMonitor(){ * @param parent - The parent UI composite. Cancel the scan if the parent is * disposed. */ - public void scanAndUpdateResults(boolean quickScan, IssuesTree issuesTree, Composite parent, boolean isDebugLogs) { - ScanJob.doSchedule("ScanJob", new ScanRunnable(parent, issuesTree, quickScan, isDebugLogs)); //TODO: change name + public void scanAndUpdateResults(IssuesTree issuesTree, Composite parent, boolean isDebugLogs, IProject project, Map envVars) { + ScanJob.doSchedule("Performing Scan", new ScanRunnable(parent, issuesTree, isDebugLogs, project, envVars)); } /** @@ -107,37 +122,39 @@ public void scanAndUpdateResults(boolean quickScan, IssuesTree issuesTree, Compo */ private class ScanRunnable implements ICoreRunnable { private IssuesTree issuesTree; - private boolean quickScan; private Composite parent; - boolean isDebugLogs; + private boolean isDebugLogs; + private IProject project; + private Map envVars; + - private ScanRunnable(Composite parent, IssuesTree issuesTree, boolean quickScan, boolean isDebugLogs) { + private ScanRunnable(Composite parent, IssuesTree issuesTree, boolean isDebugLogs, IProject project, Map envVars) { this.parent = parent; this.issuesTree = issuesTree; - this.quickScan = quickScan; this.isDebugLogs = isDebugLogs; + this.project = project; + this.envVars = envVars; } @Override public void run(IProgressMonitor monitor) throws CoreException { - Map auditEnvVars = new HashMap<>(); +// Map auditEnvVars = new HashMap<>(); +// try { +// if (isDebugLogs) { +// auditEnvVars.put("JFROG_CLI_LOG_LEVEL", "DEBUG"); +// } +// ServerConfig server = XrayServerConfigImpl.getInstance(); +// cliDriver.addCliServerConfig(server.getXrayUrl(), server.getArtifactoryUrl(), "eclipse-plugin", server.getUsername(), server.getPassword(), server.getAccessToken(), null, null); +// List projectsListAsString = Arrays.stream(projects) +// .map(IProject::getName) +// .collect(Collectors.toList()); +// for (IProject project : projects) { try { - if (isDebugLogs) { - auditEnvVars.put("JFROG_CLI_LOG_LEVEL", "DEBUG"); - } - // TODO: get working dir = the root project, scannedDirectories = empty string for now, server-id (from singleton), -// String workingDir = iworkspace.getRoot().getLocation().toString(); // not working well - ServerConfig server = XrayServerConfigImpl.getInstance(); - cliDriver.addCliServerConfig(server.getXrayUrl(), server.getArtifactoryUrl(), "eclipse-plugin", server.getUsername(), server.getPassword(), server.getAccessToken(), null, null); - List projectsListAsString = Arrays.stream(projects) - .map(IProject::getName) - .collect(Collectors.toList()); - for (IProject project : projects) { if (project.isOpen()) { IPath projectPath = project.getLocation(); log.info(String.format("Performing scan on: %s", project.getName())); - CommandResults auditResults = cliDriver.runCliAudit(new File(projectPath.toString()), null, "eclipse-plugin", null, auditEnvVars); + CommandResults auditResults = cliDriver.runCliAudit(new File(projectPath.toString()), null, "eclipse-plugin", null, envVars); if (!auditResults.isOk()) { // log the issue to the problems tab log.error("Audit scan failed with an error: " + auditResults.getErr()); @@ -161,7 +178,7 @@ public void run() { } }); } - } +// } } catch (Exception e) { e.printStackTrace(); From e11e4eed5c5f5bf8fa14968d033dcf6ae601903b Mon Sep 17 00:00:00 2001 From: kerenr-jfrog Date: Sun, 30 Mar 2025 21:43:06 +0300 Subject: [PATCH 4/7] finished implementation for ScanManager --- .../XrayGlobalConfiguration.java | 8 +- .../configuration/XrayServerConfigImpl.java | 4 + .../jfrog/ide/eclipse/scan/ScanManager.java | 106 +++++++++++------- .../scheduling/XrayJobEventListener.java | 6 +- .../jfrog/ide/eclipse/ui/actions/Refresh.java | 15 ++- 5 files changed, 84 insertions(+), 55 deletions(-) diff --git a/bundle/src/main/java/com/jfrog/ide/eclipse/configuration/XrayGlobalConfiguration.java b/bundle/src/main/java/com/jfrog/ide/eclipse/configuration/XrayGlobalConfiguration.java index d64ac35..c46313c 100644 --- a/bundle/src/main/java/com/jfrog/ide/eclipse/configuration/XrayGlobalConfiguration.java +++ b/bundle/src/main/java/com/jfrog/ide/eclipse/configuration/XrayGlobalConfiguration.java @@ -66,14 +66,8 @@ public boolean performOk() { } } if (doQuickScan) { - // TODO: run a scan using the ScanManager - try { - new ScanManager().startScan(getShell().getParent(), + ScanManager.getInstance().startScan(getShell().getParent(), getPreferenceStore().getBoolean(PreferenceConstants.DEBUG_LOGS)); - } catch (IOException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } } return true; } diff --git a/bundle/src/main/java/com/jfrog/ide/eclipse/configuration/XrayServerConfigImpl.java b/bundle/src/main/java/com/jfrog/ide/eclipse/configuration/XrayServerConfigImpl.java index d8330b2..bea3fdd 100644 --- a/bundle/src/main/java/com/jfrog/ide/eclipse/configuration/XrayServerConfigImpl.java +++ b/bundle/src/main/java/com/jfrog/ide/eclipse/configuration/XrayServerConfigImpl.java @@ -48,6 +48,10 @@ public String getUsername() { public String getPassword() { return getValue(PreferenceConstants.XRAY_PASSWORD); } + + public boolean getIsDebugLogs() { + return getValue(PreferenceConstants.DEBUG_LOGS) == "true"; + } private String getValue(String key) { return trim(service.getString(PreferenceConstants.XRAY_QUALIFIER, key, "", null)); diff --git a/bundle/src/main/java/com/jfrog/ide/eclipse/scan/ScanManager.java b/bundle/src/main/java/com/jfrog/ide/eclipse/scan/ScanManager.java index b1f73af..7030cb7 100644 --- a/bundle/src/main/java/com/jfrog/ide/eclipse/scan/ScanManager.java +++ b/bundle/src/main/java/com/jfrog/ide/eclipse/scan/ScanManager.java @@ -11,8 +11,10 @@ import java.util.List; import java.util.Map; import java.util.concurrent.CancellationException; +import java.util.concurrent.atomic.AtomicBoolean; import java.util.stream.Collectors; +import org.apache.commons.lang3.ArrayUtils; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IWorkspace; import org.eclipse.core.resources.ResourcesPlugin; @@ -20,6 +22,7 @@ import org.eclipse.core.runtime.ICoreRunnable; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.core.runtime.jobs.Job; import org.eclipse.swt.widgets.Composite; import org.jfrog.build.extractor.executor.CommandExecutor; import org.jfrog.build.extractor.executor.CommandResults; @@ -38,6 +41,7 @@ import com.jfrog.ide.eclipse.log.ProgressIndicatorImpl; import com.jfrog.ide.eclipse.scheduling.ScanJob; import com.jfrog.ide.eclipse.ui.FilterManagerSingleton; +import com.jfrog.ide.eclipse.ui.issues.ComponentIssueDetails; import com.jfrog.ide.eclipse.ui.issues.IssuesTree; import com.jfrog.ide.eclipse.utils.ProjectsMap; import com.jfrog.ide.eclipse.utils.ProjectsMap.ProjectKey; @@ -49,55 +53,64 @@ */ public class ScanManager { static final Path HOME_PATH = Paths.get(System.getProperty("user.home"), ".jfrog-eclipse-plugin"); + private static ScanManager instance; private IProgressMonitor monitor; IWorkspace iworkspace; IProject[] projects; Log log; JfrogCliDriver cliDriver; SarifParser sarifParser; + private AtomicBoolean scanInProgress = new AtomicBoolean(false); - public ScanManager() throws IOException { + private ScanManager() { + try { this.iworkspace = ResourcesPlugin.getWorkspace(); this.projects = iworkspace.getRoot().getProjects(); Files.createDirectories(HOME_PATH); this.log = Logger.getInstance(); - this.cliDriver = new JfrogCliDriver(System.getenv(), HOME_PATH.toString(), log); // TODO: use the singleton implemented by + this.cliDriver = new JfrogCliDriver(System.getenv(), HOME_PATH.toString(), log); // TODO: use the singleton implemented for clidriver this.sarifParser = new SarifParser(log); + }catch (Exception e) { + log.error(e.getMessage()); // TODO: remove after merging CLI config PR + } } + public static synchronized ScanManager getInstance(){ + if (instance == null) { + instance = new ScanManager(); + } + return instance; + } - public void startScan(Composite parent, boolean isDebugLogs) { + public void startScan(Composite parent, boolean debugLogs) { Map auditEnvVars = new HashMap<>(); + + // If scan is in progress - do not perform another scan + if (isScanInProgress()) { + Logger.getInstance().info("Previous scan still running..."); + return; + } + + scanInProgress.compareAndSet(false, true); + + resetIssuesView(IssuesTree.getInstance()); + try { - if (isDebugLogs) { + if (debugLogs) { auditEnvVars.put("JFROG_CLI_LOG_LEVEL", "DEBUG"); + auditEnvVars.put("CI", "true"); } ServerConfig server = XrayServerConfigImpl.getInstance(); + // TODO: this server config should be removed since it will be done at settings panel. also remove the try catch cliDriver.addCliServerConfig(server.getXrayUrl(), server.getArtifactoryUrl(), "eclipse-plugin", server.getUsername(), server.getPassword(), server.getAccessToken(), null, null); - List projectsListAsString = Arrays.stream(projects) - .map(IProject::getName) - .collect(Collectors.toList()); for (IProject project : projects) { - scanAndUpdateResults(IssuesTree.getInstance(), parent, isDebugLogs, project, auditEnvVars); + scanAndUpdateResults(IssuesTree.getInstance(), parent, debugLogs, project, auditEnvVars); } } catch (Exception e) { - e.printStackTrace(); + e.printStackTrace(); // TODO: remove try catch } } - - /** - * Collect and return {@link Components} to be scanned by JFrog Xray. - * Implementation should be project type specific. - * - * @return - * - * @throws CoreException - * @throws IOException - * @throws JsonProcessingException - */ - - public void setMonitor(IProgressMonitor monitor) { this.monitor = monitor; } @@ -105,16 +118,36 @@ public void setMonitor(IProgressMonitor monitor) { public IProgressMonitor getMonitor(){ return monitor; } + + public boolean isScanInProgress() { + return scanInProgress.get(); + } + + public void scanFinished() { + scanInProgress.set(false); + } + + public AtomicBoolean getScanInProgress() { + return scanInProgress; + } + + private void resetIssuesView(IssuesTree issuesTree) { + ComponentIssueDetails.getInstance().recreateComponentDetails(); + issuesTree.reset(); + } /** - * Schedule a dependency scan. + * Schedule an audit scan. * - * @param quickScan - True iff this is a quick scan. + * @param issuesTree - The issues tree object to present the issues found by the scan. * @param parent - The parent UI composite. Cancel the scan if the parent is * disposed. + * @param debugLogs - If set to True, generate debug logs from the audit command. + * @param project - The scanned project object. + * @param envVars = The environment variables for running the audit command. */ - public void scanAndUpdateResults(IssuesTree issuesTree, Composite parent, boolean isDebugLogs, IProject project, Map envVars) { - ScanJob.doSchedule("Performing Scan", new ScanRunnable(parent, issuesTree, isDebugLogs, project, envVars)); + public void scanAndUpdateResults(IssuesTree issuesTree, Composite parent, boolean debugLogs, IProject project, Map envVars) { + ScanJob.doSchedule(String.format("Performing Scan: %s", project.getName()), new ScanRunnable(parent, issuesTree, debugLogs, project, envVars)); } /** @@ -123,32 +156,19 @@ public void scanAndUpdateResults(IssuesTree issuesTree, Composite parent, boolea private class ScanRunnable implements ICoreRunnable { private IssuesTree issuesTree; private Composite parent; - private boolean isDebugLogs; private IProject project; private Map envVars; - private ScanRunnable(Composite parent, IssuesTree issuesTree, boolean isDebugLogs, IProject project, Map envVars) { + private ScanRunnable(Composite parent, IssuesTree issuesTree, boolean debugLogs, IProject project, Map envVars) { this.parent = parent; this.issuesTree = issuesTree; - this.isDebugLogs = isDebugLogs; this.project = project; this.envVars = envVars; } @Override public void run(IProgressMonitor monitor) throws CoreException { -// Map auditEnvVars = new HashMap<>(); -// try { -// if (isDebugLogs) { -// auditEnvVars.put("JFROG_CLI_LOG_LEVEL", "DEBUG"); -// } -// ServerConfig server = XrayServerConfigImpl.getInstance(); -// cliDriver.addCliServerConfig(server.getXrayUrl(), server.getArtifactoryUrl(), "eclipse-plugin", server.getUsername(), server.getPassword(), server.getAccessToken(), null, null); -// List projectsListAsString = Arrays.stream(projects) -// .map(IProject::getName) -// .collect(Collectors.toList()); -// for (IProject project : projects) { try { if (project.isOpen()) { IPath projectPath = project.getLocation(); @@ -178,16 +198,16 @@ public void run() { } }); } -// } } catch (Exception e) { - e.printStackTrace(); + // TODO: pop an error message window + log.error(e.getMessage()); } } private void setScanResults() { - // TODO: re implement using SarifParser + // TODO: re implement using SarifParser - delete? } private boolean isDisposed() { diff --git a/bundle/src/main/java/com/jfrog/ide/eclipse/scheduling/XrayJobEventListener.java b/bundle/src/main/java/com/jfrog/ide/eclipse/scheduling/XrayJobEventListener.java index 04bcdec..47d8520 100644 --- a/bundle/src/main/java/com/jfrog/ide/eclipse/scheduling/XrayJobEventListener.java +++ b/bundle/src/main/java/com/jfrog/ide/eclipse/scheduling/XrayJobEventListener.java @@ -5,15 +5,15 @@ import org.eclipse.core.runtime.jobs.Job; import org.eclipse.core.runtime.jobs.JobChangeAdapter; +import com.jfrog.ide.eclipse.scan.ScanManager; + public class XrayJobEventListener extends JobChangeAdapter { @Override public void done(IJobChangeEvent event) { Job[] jobs = Job.getJobManager().find(ScanJob.FAMILY); - // TODO: implement a listener for the audit scan -// ScanManagersFactory scanManagersFactory = ScanManagersFactory.getInstance(); if (ArrayUtils.isEmpty(jobs)) { -// scanManagersFactory.scanFinished(); + ScanManager.getInstance().scanFinished(); } } } diff --git a/bundle/src/main/java/com/jfrog/ide/eclipse/ui/actions/Refresh.java b/bundle/src/main/java/com/jfrog/ide/eclipse/ui/actions/Refresh.java index a3b377d..71d5688 100644 --- a/bundle/src/main/java/com/jfrog/ide/eclipse/ui/actions/Refresh.java +++ b/bundle/src/main/java/com/jfrog/ide/eclipse/ui/actions/Refresh.java @@ -1,9 +1,14 @@ package com.jfrog.ide.eclipse.ui.actions; +import java.io.IOException; + import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.widgets.ToolBar; + +import com.jfrog.ide.eclipse.configuration.PreferenceConstants; import com.jfrog.ide.eclipse.configuration.XrayServerConfigImpl; import com.jfrog.ide.eclipse.log.Logger; +import com.jfrog.ide.eclipse.scan.ScanManager; /** * Start a new slow scan. @@ -22,7 +27,13 @@ public void execute(SelectionEvent event) { Logger.getInstance().error("Xray server is not configured."); return; } -// ScanManagersFactory.getInstance().startScan(getParent(), false); - // TODO: run a scan + + try { + ScanManager.getInstance().startScan(getParent(), XrayServerConfigImpl.getInstance().getIsDebugLogs()); + } catch (Exception e) { + // TODO: pop an error message window + Logger.getInstance().error(e.getMessage()); + } } + } From b3ec573096fc7cba74a2f145ead8770d85f21b4b Mon Sep 17 00:00:00 2001 From: kerenr-jfrog Date: Mon, 31 Mar 2025 16:52:26 +0300 Subject: [PATCH 5/7] improvements --- .../XrayGlobalConfiguration.java | 1 - .../configuration/XrayServerConfigImpl.java | 12 ++-- .../jfrog/ide/eclipse/scan/ScanManager.java | 70 ++++++++----------- .../com/jfrog/ide/eclipse/ui/PartControl.java | 8 --- 4 files changed, 36 insertions(+), 55 deletions(-) diff --git a/bundle/src/main/java/com/jfrog/ide/eclipse/configuration/XrayGlobalConfiguration.java b/bundle/src/main/java/com/jfrog/ide/eclipse/configuration/XrayGlobalConfiguration.java index c46313c..4ad6adb 100644 --- a/bundle/src/main/java/com/jfrog/ide/eclipse/configuration/XrayGlobalConfiguration.java +++ b/bundle/src/main/java/com/jfrog/ide/eclipse/configuration/XrayGlobalConfiguration.java @@ -52,7 +52,6 @@ public void createFieldEditors() { @Override public boolean performOk() { - // TODO: This code runs when clicking the 'Apply' button in the settings panel. Implement server configuration using CliDriver here super.performOk(); if (!XrayServerConfigImpl.getInstance().areCredentialsSet()) { return true; diff --git a/bundle/src/main/java/com/jfrog/ide/eclipse/configuration/XrayServerConfigImpl.java b/bundle/src/main/java/com/jfrog/ide/eclipse/configuration/XrayServerConfigImpl.java index bea3fdd..5e8a99a 100644 --- a/bundle/src/main/java/com/jfrog/ide/eclipse/configuration/XrayServerConfigImpl.java +++ b/bundle/src/main/java/com/jfrog/ide/eclipse/configuration/XrayServerConfigImpl.java @@ -22,8 +22,6 @@ */ @SuppressWarnings("restriction") public class XrayServerConfigImpl implements ServerConfig { - // TODO: adjust implementation for configuring server using JfrogCliDriver - private static XrayServerConfigImpl instance; private IPreferencesService service = Platform.getPreferencesService(); @@ -114,31 +112,31 @@ public boolean isInsecureTls() { @Override public String getAccessToken() { - // TODO Auto-generated method stub + // This functionality is not yet implemented by the plug-in. return null; } @Override public String getExternalResourcesRepo() { - // TODO Auto-generated method stub + // This functionality is not yet implemented by the plug-in. return null; } @Override public PolicyType getPolicyType() { - // TODO Auto-generated method stub + // This functionality is not yet implemented by the plug-in. return null; } @Override public String getProject() { - // TODO Auto-generated method stub + // This functionality is not yet implemented by the plug-in. return null; } @Override public String getWatches() { - // TODO Auto-generated method stub + // This functionality is not yet implemented by the plug-in. return null; } diff --git a/bundle/src/main/java/com/jfrog/ide/eclipse/scan/ScanManager.java b/bundle/src/main/java/com/jfrog/ide/eclipse/scan/ScanManager.java index 7030cb7..2f668de 100644 --- a/bundle/src/main/java/com/jfrog/ide/eclipse/scan/ScanManager.java +++ b/bundle/src/main/java/com/jfrog/ide/eclipse/scan/ScanManager.java @@ -36,6 +36,7 @@ import com.jfrog.ide.common.parse.SarifParser; import com.jfrog.ide.common.scan.ComponentPrefix; import com.jfrog.ide.common.configuration.ServerConfig; +import com.jfrog.ide.eclipse.configuration.CliDriverWrapper; import com.jfrog.ide.eclipse.configuration.XrayServerConfigImpl; import com.jfrog.ide.eclipse.log.Logger; import com.jfrog.ide.eclipse.log.ProgressIndicatorImpl; @@ -54,25 +55,20 @@ public class ScanManager { static final Path HOME_PATH = Paths.get(System.getProperty("user.home"), ".jfrog-eclipse-plugin"); private static ScanManager instance; - private IProgressMonitor monitor; - IWorkspace iworkspace; - IProject[] projects; - Log log; - JfrogCliDriver cliDriver; - SarifParser sarifParser; + private IProgressMonitor monitor; // TODO: validate if necessary + private IWorkspace iworkspace; + private IProject[] projects; + private Log log; + private JfrogCliDriver cliDriver; + private SarifParser sarifParser; private AtomicBoolean scanInProgress = new AtomicBoolean(false); private ScanManager() { - try { this.iworkspace = ResourcesPlugin.getWorkspace(); this.projects = iworkspace.getRoot().getProjects(); - Files.createDirectories(HOME_PATH); this.log = Logger.getInstance(); - this.cliDriver = new JfrogCliDriver(System.getenv(), HOME_PATH.toString(), log); // TODO: use the singleton implemented for clidriver + this.cliDriver = CliDriverWrapper.getInstance().getCliDriver(); this.sarifParser = new SarifParser(log); - }catch (Exception e) { - log.error(e.getMessage()); // TODO: remove after merging CLI config PR - } } public static synchronized ScanManager getInstance(){ @@ -82,33 +78,30 @@ public static synchronized ScanManager getInstance(){ return instance; } - public void startScan(Composite parent, boolean debugLogs) { + public void startScan(Composite parent, boolean isDebugLogs) { Map auditEnvVars = new HashMap<>(); // If scan is in progress - do not perform another scan if (isScanInProgress()) { + // TODO: pop up a window message Logger.getInstance().info("Previous scan still running..."); return; } scanInProgress.compareAndSet(false, true); - resetIssuesView(IssuesTree.getInstance()); - try { - if (debugLogs) { - auditEnvVars.put("JFROG_CLI_LOG_LEVEL", "DEBUG"); - auditEnvVars.put("CI", "true"); - } - ServerConfig server = XrayServerConfigImpl.getInstance(); - // TODO: this server config should be removed since it will be done at settings panel. also remove the try catch - cliDriver.addCliServerConfig(server.getXrayUrl(), server.getArtifactoryUrl(), "eclipse-plugin", server.getUsername(), server.getPassword(), server.getAccessToken(), null, null); - for (IProject project : projects) { - scanAndUpdateResults(IssuesTree.getInstance(), parent, debugLogs, project, auditEnvVars); - } - } catch (Exception e) { - e.printStackTrace(); // TODO: remove try catch - } + // refresh projects list + this.projects = this.iworkspace.getRoot().getProjects(); + + if (isDebugLogs) { + auditEnvVars.put("JFROG_CLI_LOG_LEVEL", "DEBUG"); + auditEnvVars.put("CI", "true"); + } + + for (IProject project : projects) { + scanAndUpdateResults(IssuesTree.getInstance(), parent, isDebugLogs, project, auditEnvVars); + } } public void setMonitor(IProgressMonitor monitor) { @@ -142,12 +135,12 @@ private void resetIssuesView(IssuesTree issuesTree) { * @param issuesTree - The issues tree object to present the issues found by the scan. * @param parent - The parent UI composite. Cancel the scan if the parent is * disposed. - * @param debugLogs - If set to True, generate debug logs from the audit command. + * @param isDebugLogs - If set to True, generate debug logs from the audit command. * @param project - The scanned project object. * @param envVars = The environment variables for running the audit command. */ - public void scanAndUpdateResults(IssuesTree issuesTree, Composite parent, boolean debugLogs, IProject project, Map envVars) { - ScanJob.doSchedule(String.format("Performing Scan: %s", project.getName()), new ScanRunnable(parent, issuesTree, debugLogs, project, envVars)); + public void scanAndUpdateResults(IssuesTree issuesTree, Composite parent, boolean isDebugLogs, IProject project, Map envVars) { + ScanJob.doSchedule(String.format("Performing Scan: %s", project.getName()), new ScanRunnable(parent, issuesTree, isDebugLogs, project, envVars)); } /** @@ -158,13 +151,15 @@ private class ScanRunnable implements ICoreRunnable { private Composite parent; private IProject project; private Map envVars; + private boolean isDebugLogs; - private ScanRunnable(Composite parent, IssuesTree issuesTree, boolean debugLogs, IProject project, Map envVars) { + private ScanRunnable(Composite parent, IssuesTree issuesTree, boolean isDebugLogs, IProject project, Map envVars) { this.parent = parent; this.issuesTree = issuesTree; this.project = project; this.envVars = envVars; + this.isDebugLogs = isDebugLogs; } @Override @@ -181,6 +176,9 @@ public void run(IProgressMonitor monitor) throws CoreException { return; } log.info("Finished audit scan successfully.\n" + auditResults.getRes()); + if (isDebugLogs) { + log.debug(auditResults.getErr()); + } // update scan cache ScanCache.getInstance().updateScanResults(sarifParser.parse(auditResults.getRes())); @@ -200,15 +198,9 @@ public void run() { } } catch (Exception e) { - // TODO: pop an error message window - log.error(e.getMessage()); + CliDriverWrapper.getInstance().showCliError("An error occurred while performing audit scan", e);; } } - - - private void setScanResults() { - // TODO: re implement using SarifParser - delete? - } private boolean isDisposed() { return parent == null || parent.isDisposed(); diff --git a/bundle/src/main/java/com/jfrog/ide/eclipse/ui/PartControl.java b/bundle/src/main/java/com/jfrog/ide/eclipse/ui/PartControl.java index 7a8b0b5..091a73e 100644 --- a/bundle/src/main/java/com/jfrog/ide/eclipse/ui/PartControl.java +++ b/bundle/src/main/java/com/jfrog/ide/eclipse/ui/PartControl.java @@ -30,7 +30,6 @@ public void createPartControl(Composite parent) { XrayScanToolbar xrayScanToolbar = new XrayScanToolbar(parent); createTabs(parent, xrayScanToolbar); - doQuickScan(parent); } private void createTabs(Composite parent, XrayScanToolbar xrayScanToolbar) { @@ -45,13 +44,6 @@ public void widgetSelected(SelectionEvent event) { }); } - private void doQuickScan(Composite parent) { - if (XrayServerConfigImpl.getInstance().areCredentialsSet()) { -// ScanManagersFactory.getInstance().startScan(parent, true); - // TODO: run a scan - } - } - @PreDestroy public void dispose() { ComponentIssueDetails.disposeComponentDetails(); From 3c85c973225ff07978bab77886bd54092f5a0e56 Mon Sep 17 00:00:00 2001 From: kerenr-jfrog Date: Tue, 1 Apr 2025 15:24:10 +0300 Subject: [PATCH 6/7] include UI changes in tree view --- bundle/icons/critical.png | Bin 425 -> 339 bytes bundle/icons/criticalnotapplic.png | Bin 0 -> 1082 bytes bundle/icons/high.png | Bin 396 -> 367 bytes bundle/icons/highnotapplic.png | Bin 0 -> 1105 bytes bundle/icons/low.png | Bin 290 -> 290 bytes bundle/icons/lownotapplic.png | Bin 0 -> 1076 bytes bundle/icons/medium.png | Bin 417 -> 399 bytes bundle/icons/mediumnotapplic.png | Bin 0 -> 1059 bytes bundle/icons/unknowm.png | Bin 0 -> 329 bytes bundle/icons/unknown.png | Bin 426 -> 0 bytes bundle/icons/unknownnotapplic.png | Bin 0 -> 1074 bytes .../configuration/CliDriverWrapper.java | 68 ++++++++++++++++++ .../jfrog/ide/eclipse/scan/ScanManager.java | 24 +++++-- .../ide/eclipse/ui/ComponentDetails.java | 26 +++---- .../eclipse/ui/ScanTreeContentProvider.java | 11 ++- .../jfrog/ide/eclipse/ui/SearchableTree.java | 33 ++++----- .../ui/issues/ComponentIssueDetails.java | 11 +-- .../ui/issues/ComponentIssueTable.java | 17 ++--- .../issues/IssueCountColumnLabelProvider.java | 10 ++- .../ide/eclipse/ui/issues/IssuesTree.java | 15 ++-- .../issues/IssuesTreeColumnLabelProvider.java | 26 +++++-- 21 files changed, 178 insertions(+), 63 deletions(-) create mode 100644 bundle/icons/criticalnotapplic.png create mode 100644 bundle/icons/highnotapplic.png create mode 100644 bundle/icons/lownotapplic.png create mode 100644 bundle/icons/mediumnotapplic.png create mode 100644 bundle/icons/unknowm.png delete mode 100755 bundle/icons/unknown.png create mode 100644 bundle/icons/unknownnotapplic.png create mode 100644 bundle/src/main/java/com/jfrog/ide/eclipse/configuration/CliDriverWrapper.java diff --git a/bundle/icons/critical.png b/bundle/icons/critical.png index 9e61d5cad9abd144bb94bad9859007be6b33a408..8e9115353c99a07ce31ae3d0beb56089bb9b9947 100644 GIT binary patch delta 313 zcmV-90mlBR1JeSKBYy!JNklVenNDW z-IGS+@ltEO*5FC0=20B`#N21VcZBaC8eB{!VWq)qyWI!#J%2MdQCl-nQfTJ6rfY9^=OtH$Skqvb4&hRx3;=dW|ZW z2i@uP#txPCATkrAJqB((i@C{_6)bpBO3{3No33XBA;MLkX>a}jbM;zBgU#^p00000 LNkvXXu0mjf-eQk$ delta 400 zcmV;B0dM}(0;vO#BYyw^b5ch_0Itp)=>Px$V@X6oR5%f(ld(<$VGPIHf|@8|faqY1 zVRg_!Cyf{e7JLU+6BFM-UI14{AHZGRHJUiO5C<1yqER^vUuRH0D43q6W$O1o@c_YNznV`uv+N@N{ayd#N01)AREKa%5o_M-m z>Cy}o?_y+MVc`djt^EDdjY&#X~juzw(p-Rq~onhjo>*>b&I7k!AGR4BmNEPMzK^TgmibKaFH;Ls4>N>Q#{`4 zCWL2^sU__iVR6K3HNqWalGY#|-x*+GvwiIl-Xlhd|m7~AA?bXkm9&K94GWTUT{BeT$yX@}{hrb^Whx<=Redbkr zlHcCr{7+K56D{+IrQ5uCJ<+Q7czK6opE{Lp1*8zx>wJI4Vu>SfIdpy0+j#Ej2R3$C zf5U@^oNTakW5(YHr+fRaXWZW(RZnu8CN>_40007QNklcE4I zTAh!m!n=Mn+AK%U@3=hQP`i0-AcZSMRetci)jsP}w0f+@hPF+r1Jq&|%X4;b{KAK- z+G%uq#m=Lr%N=;;W`Ov%!D>B*p)=btQ~?44Pyw$bqfb5mywO?MweoQ7_aC2p4B!AT z9RL#`9R&eSnCycj zOEb%vfz34kS>1pJMmISPoYS^qyq=<625kWmQO*sV7@9FX0wiF`(9h=i2A4?DeL~c# z#3tZ@G8x0;H;8(wWJ5%L6#mT|U!v$;WQ}B(n1w+ql+uuCxiJS!J6S(v{=PzbBRc=9 zIo736cgbBP`fZro;X>@jqW+*-YWL?YOiwkjk$&(4otDyV5h|Jc%#sF(KZLD-46~CK z?OEB(zYdE9bA#bRkN(B;gHB%Fe0}3dbx5`*^Jj!z5a~UkQIcCquC`a6YTXL$dg-R& z7?9+dW;yv}msd|NwzEz*iy_pG?p>75WYvCudB0k>X6sLL|5+wsxRgkTQ#k$FX4YHy zqWo+7n()^oEPDT)pT_SO4)$WQ<$sNgUUr@T2LI4xN(?NZlGkTwtdKYX#3xzr_xqlm*Z?PjWfi`KkjU7b z_ScAyu2R8Xfj243m&>JOh+PDbiN=x1V?p&nzMoy!5hWG&a@NSjrTLm;eh49JTXOM?P?!*(R->4htqIk)CxSiZd<})AD nhY%IUSdY#-r_j%OOefPx$MoC0LR5%f(Q?W_|K@go;_D%?-Ol1*8 z%YYvsSctV&V(&Kywug{H$T#F4Of43H_z70AxWdXt6a>A?jx%?=>t?+LAp^(m%)Iwz zZg&=7L&KO)w}<`jPq^a5Dd+ZWen|kcyayA!UVMa{HG!%)I)65%o-$w;d-{TcylyhA;1AI?hEnY^^}dw7w#< zQxm>%2ML4|AZvJL#6gT&t;`q^t2l1`rL65OAl!9=w7$qN>pUOsY32oF!q_Qe5oKUd zDH_Ca!CKDm;cPTWQb8t5CQQ`DPgogFpt<807*qoM6N<$f`oIZPXGV_ diff --git a/bundle/icons/highnotapplic.png b/bundle/icons/highnotapplic.png new file mode 100644 index 0000000000000000000000000000000000000000..4336456cd3d9cb19b2b2b1df57b3a09801efd54f GIT binary patch literal 1105 zcmV-X1g`suP)t^EDdjY&#X~juzw(p-Rq~onhjo>*>b&I7k!AGR4BmNEPMzK^TgmibKaFH;Ls4>N>Q#{`4 zCWL2^sU__iVR6K3HNqWalGY#|-x*+GvwiIl-Xlhd|m7~AA?bXkm9&K94GWTUT{BeT$yX@}{hrb^Whx<=Redbkr zlHcCr{7+K56D{+IrQ5uCJ<+Q7czK6opE{Lp1*8zx>wJI4Vu>SfIdpy0+j#Ej2R3$C zf5U@^oNTakW5(YHr+fRaXWZW(RZnu8CN>_40007nNklKX}RG;A`fQKE!sv@)^r4=^T_#%N+sNn&BN@gFc2_IAbw2$cl0E{ltR0T+mb z%s9)8FgsuO-uHbhX0vY3(>={E=j5CtGvjG426*(*#}xemwKHePw{GEke=kKxUwSj! z{QWh6(yN^<`ondb?CwPMGPCZGrB|M(^vzcb01i~CDF5^JY8X#W`u>yEqW4?NEw!fz zn{QnGP)X^%xYg(uqw!CQ-5r&Z{}te)H&k!GKVRQ`L1~(+*+>*ZhWGyppwX0xV_`NY zNJ@bUSly&~z|9T&0$B%X0GOe2EI%l_*`0kr``EMF zX}i8r6#hlI=%zDW!~#%!BK(QM#S?Q$11u!u&EdFub$hU~y>FqqatM6(>+FeJk?BW6 zIoRh$=t$g{1%2S~hFO#(+?&!m-^-31DAL9?s+IDi%H6H+MvwFQ`0aPkMzirz%({R% zxzwi9BgJTUM{6&C-{~x6tMlmrK%PUbhI(DfwN`yvEthOElB6aeo6T!(`MF!I*V{kn zpND-)5z!*WJwP0Tb5MAaMzyO-Y8&m6u|I&s|R_x^$+EP4v)Y3KYO XpIa`P4oUJ^00000NkvXXu0mjf=AIA{ literal 0 HcmV?d00001 diff --git a/bundle/icons/low.png b/bundle/icons/low.png index d35134d18b1b6c2c699826c704e3f1206b80cf62..c33f95953e782beb2d9410d059550b5652d48b27 100755 GIT binary patch delta 262 zcmV+h0r~!-0-^$tB!B5iL_t(|0i~1A4T3Nj#a|)uqzUop!8ihq48Q;;jvyQ82rz-V z0gm7XdN-C47{NrZwtmoq{At0+OB&kp-mlPp1qO=QUMLZSaOAoiNO@#D%Xas^(z^0A~kKz3|*n|xL+U@|PKu%u( z#SXZY;944au>b%7 M07*qoM6N<$f?;`StN;K2 diff --git a/bundle/icons/lownotapplic.png b/bundle/icons/lownotapplic.png new file mode 100644 index 0000000000000000000000000000000000000000..216c97d542050d8e57b4555f822b1939dffd4e51 GIT binary patch literal 1076 zcmV-41k3x0P)t^EDdjY&#X~juzw(p-Rq~onhjo>*>b&I7k!AGR4BmNEPMzK^TgmibKaFH;Ls4>N>Q#{`4 zCWL2^sU__iVR6K3HNqWalGY#|-x*+GvwiIl-Xlhd|m7~AA?bXkm9&K94GWTUT{BeT$yX@}{hrb^Whx<=Redbkr zlHcCr{7+K56D{+IrQ5uCJ<+Q7czK6opE{Lp1*8zx>wJI4Vu>SfIdpy0+j#Ej2R3$C zf5U@^oNTakW5(YHr+fRaXWZW(RZnu8CN>_40007KNklEX8{tdHMT? z4luEJU+dR*MEaYa}1aJO*HkFx5j?uxb#}$~KdUBIn=jV-&0_ zKs3&~$FmZqx}vR3umboM_!*c4j(KEFRKHGJ>9$w#t7dcSV*uTAFaY|1?fRh&JOH@| zoN)7JD)N0urHRp(quC;9=#2?PaNx~zm^(+@*ac@=$H=l7iy~|Y)cXqD>jT^OQl+CR zPgLbf$dbyUEt~nG2!8_+sKy}*+I4)i2Q;7npHbzN1kJ38Uzqu65nccRs7$0A#tNeU zMYJwL3z&2FM`FoO;)0j)6C1`OI8Ol;mz)s0RW@4Pw{T*9O%6@1cw?uC`c#FhAxTE4 z&g0GPMC?0+=Ll`ndRltzyZOuGYhw#KahSMM-Dc1~9&@`9L`$dsylLVoDZ&i1CIlcBYy!_NklBb6r5cag+Oto70}rD2dqp;tV}fi01HJr z8~6#(*@=yv-kDg~8cl39`~hQOV*@l=8H@)c=Gez_z|M&iAY?gOWoE|12PSxk71EPR)|mx2^n6b#BH|Rv$O_%Gk;x?#A}K$uox}Q$V!*` z_3?pw-HA75#e8E2ESvYctQjshML`m)%?@1GVtw}>$*nW*oZLP~YVTPm)f?dd7m56V zpFpLNc3UeIf$uH?^AFpPUTpenE0Y|SBw(%Jh0}S0$n8UH9>Mvziq^fw3?$(psF2@H zcMLcF&wHqvz;0e+1`ZbuPcWU=`MiVtYEDSI;~6BFuMI7deVwVQg}J~Y5UXd(c1>&G zn%rb8MILKwp*HcfcM{}czi}*3i&BsBV=h{(O)$g2OcjPCs_IR21sB%5$Fwp=92#zD TNC+^G00000NkvXXu0mjfajvUA delta 392 zcmV;30eAk71EB+uBYyw^b5ch_0Itp)=>Px$TS-JgR5%f}Qok=mK@k3y3lbD6G#sH( zh(sZmD-?QBC`3bZoe;HXNT@Dxe}F$iLZkDe5S@fdualRkoa8dT+4pwe?!9}J*yO#P z@0)LCXJ!}p&m|8yk~<{wi0!g-OqoOOu>ipf{S_D_7{t6;!GCABzOS3`Sa4y3l@N^K z8zoXv)Vx=W?L zm)Y&EbJ*RWYJYdZbi{-2;~5jm`2@_|;+NwzqQ-}G%f!_b`u_;8^<0q+;9#~GT=(wW zxMa7Rgf}_mtsTy6F+EXm>gm`RCe*t^EDdjY&#X~juzw(p-Rq~onhjo>*>b&I7k!AGR4BmNEPMzK^TgmibKaFH;Ls4>N>Q#{`4 zCWL2^sU__iVR6K3HNqWalGY#|-x*+GvwiIl-Xlhd|m7~AA?bXkm9&K94GWTUT{BeT$yX@}{hrb^Whx<=Redbkr zlHcCr{7+K56D{+IrQ5uCJ<+Q7czK6opE{Lp1*8zx>wJI4Vu>SfIdpy0+j#Ej2R3$C zf5U@^oNTakW5(YHr+fRaXWZW(RZnu8CN>_400073Nkl10L7{Kx0xifd> zPBYWIwAxaV>Y~;LS_%=BLcx{b#)aTUK|g?>K$n6mSAy%V1V4aKM3D+E1cSy`R5T6E z!er7+CUG*E$;_R5kBg2Z`yO}}2Oj?XpSKWW^f<2yK7Ny7hud$n^*j4p^Ugi>yv?6) zinx69SL2=UZ4Wxk)7quG$h#j-0Z?lM?Z1`{`_Jj^Ej#GUnwc9Sdho-m()1tg&3D>y&(>q&j8sN7Q+GI?Lt*~do-h=%AR6T&~#z9y{VEb&Q_RY`hRr8-i?cNFo4 zN%asO0fLA)g%uJFX?0tO#IQl}jd4MYuZdv=ZHfG(2QlQta;iHL^D7c(6yY;P^(W0D z7?({kB!U3~#-|Os7)}2`!yXgzgETI9^v2-DwYIh0335 z?m6FLrZ;O8ui*ft7&A%ImDbl!N?3gQzJGgby1f^rl}uLdNRv6+S<`V`HrG2RR!c!D zBrQk%ALXNs6Ts3%D*3AI-X)dzxk;q(mhxyxS~*n4hm^02@uIZ;i(&bd(csh~ZLTqB z?0MzyJBne`m$%1b@BZ_wV343k!_Uthh4AwxdNY~dD#d z46NU5)Z9#g-=WtbLKlQG&NuBd2DkZG>qQ=q!zAJ4llPewBI?E-M?n-85D7a_XFq~@ ze}~(f<7w8L0JFvFtbni1Lu7bMJu!tvY#bhu=nEHufQcrsEeYpBK166Zn!roF8bH!} z9$9tTv+cuHYODP7=ea8SdV=3?HOzK0pnYTO$!teevMQ&^nH|I!4Ca+B3*W#f5K_3w bwy%mEr`lD~4&v`_00000NkvXXu0mjfA|{cK literal 0 HcmV?d00001 diff --git a/bundle/icons/unknown.png b/bundle/icons/unknown.png deleted file mode 100755 index ea573269d6446d9a8de685fb2af188b916e2e436..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 426 zcmV;b0agBqP)Px$WJyFpR5%f(k~>brKoEv^HV7m{kSJ-ONSg!D!UgCkDeN+W*nv|Zh#gQ$yP%{@ zjiBWKsSph`lt>ARcx8wEZSTslV<}QnWXHQR-@JYymi$pMzTdywn0}8urD$KjHHmng zS-fa_P~W0U*LBDFm>B?qf4@f0g2i^;$=D?5Ro2Kk@tp^ACymkT-R`tnN1syAg}E!9 zEO=KbzP}0L1M`*ukeUB}p2BYIpPsp)B=U_z@nmLFQ;wr3s^cvIpy#A)rMe42bS2{t zKDU5uU}-W9xxR`#R3fD8q?hG?B097HZ8Y;Pia7wp>o`F*gc}xsRpkM&0YN)e5Iu^C z1!Q|JGBhQf2_SO@JG20849d~jO~qiP8{RYyeB2|22uP U3;lct^EDdjY&#X~juzw(p-Rq~onhjo>*>b&I7k!AGR4BmNEPMzK^TgmibKaFH;Ls4>N>Q#{`4 zCWL2^sU__iVR6K3HNqWalGY#|-x*+GvwiIl-Xlhd|m7~AA?bXkm9&K94GWTUT{BeT$yX@}{hrb^Whx<=Redbkr zlHcCr{7+K56D{+IrQ5uCJ<+Q7czK6opE{Lp1*8zx>wJI4Vu>SfIdpy0+j#Ej2R3$C zf5U@^oNTakW5(YHr+fRaXWZW(RZnu8CN>_40007INklDfk2Qq@YEiru9!iNc;d&(NQA>A|ioAK`cvAqOihd z{IR<;o}In-r5I-ov^mnL?s?C7pQCe45-$@0;K9$kocbBBZ(d|PZJ0LIE9=?dy`%Bu zZ3Jtpz2EB7_F2(bRc<*g8t*@sU@2KW_S&i4S%-3K#JgM#& z_F)KaG@Ulzd+&Dt<{txxlq_pQUzFh8yqZre@XQRVU09-eNS}*|;VE+;d7$QA$ zrX8QzJkITI5;yZaj28%Jg)h>84Il>!q~8hJab{67`&@~)Fh*vb%Rr}S)lJXo9==61 zh)Xy05T3NB?GLBT z@%bSg-@niE@%Zm|x3|CExV$;|v!WMaFZ-SU0ix|Gf0QfaF#rGn07*qoM6N<$f}vRn0{{R3 literal 0 HcmV?d00001 diff --git a/bundle/src/main/java/com/jfrog/ide/eclipse/configuration/CliDriverWrapper.java b/bundle/src/main/java/com/jfrog/ide/eclipse/configuration/CliDriverWrapper.java new file mode 100644 index 0000000..5af09da --- /dev/null +++ b/bundle/src/main/java/com/jfrog/ide/eclipse/configuration/CliDriverWrapper.java @@ -0,0 +1,68 @@ +package com.jfrog.ide.eclipse.configuration; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import org.eclipse.jface.dialogs.ErrorDialog; +import org.eclipse.swt.widgets.Display; +import org.eclipse.swt.widgets.Shell; +import org.eclipse.core.runtime.IStatus; +import org.eclipse.core.runtime.Status; + +import com.jfrog.ide.common.configuration.JfrogCliDriver; +import com.jfrog.ide.eclipse.log.Logger; + +public class CliDriverWrapper { + + private static CliDriverWrapper instance; + + public static final String CLIENT_ID_SERVER = "eclipse"; + public static final String CLI_VERSION = "2.74.1"; + public static final Path HOME_PATH = Paths.get(System.getProperty("user.home"), ".jfrog-eclipse-plugin"); + + private JfrogCliDriver cliDriver; + + private CliDriverWrapper() { + try { + Files.createDirectories(HOME_PATH); + } catch (Exception e) { + showCliError("An error occurred while creating the JFrog Eclipse plugin directory:",e); + } + // Initialize the cliDriver and download CLI if needed + this.cliDriver = new JfrogCliDriver(null, Logger.getInstance()); + try { + this.cliDriver.downloadCliIfNeeded(HOME_PATH.toString(), CLI_VERSION); + } catch (IOException e) { + showCliError("An error occurred while downloading the JFrog CLI:",e); + } + } + + public static CliDriverWrapper getInstance() { + if (instance == null) { + synchronized (CliDriverWrapper.class) { + if (instance == null) { + instance = new CliDriverWrapper(); + } + } + } + return instance; + } + + public JfrogCliDriver getCliDriver() { + return cliDriver; + } + + public void showCliError(String errorTitle,Exception e) { + Logger.getInstance().error(e.getMessage(), e); + IStatus status = new Status(IStatus.ERROR, "jfrog-eclipse-plugin",e.getMessage(), e); + + // Run UI-related code on the main UI thread + Display.getDefault().asyncExec(() -> { + Shell shell = Display.getDefault().getActiveShell(); + if (shell != null) { + ErrorDialog.openError(shell, "Error", errorTitle, status); + } + }); + } +} \ No newline at end of file diff --git a/bundle/src/main/java/com/jfrog/ide/eclipse/scan/ScanManager.java b/bundle/src/main/java/com/jfrog/ide/eclipse/scan/ScanManager.java index 2f668de..5ae0fa3 100644 --- a/bundle/src/main/java/com/jfrog/ide/eclipse/scan/ScanManager.java +++ b/bundle/src/main/java/com/jfrog/ide/eclipse/scan/ScanManager.java @@ -62,6 +62,7 @@ public class ScanManager { private JfrogCliDriver cliDriver; private SarifParser sarifParser; private AtomicBoolean scanInProgress = new AtomicBoolean(false); + private AtomicBoolean cancellationRequested = new AtomicBoolean(false); private ScanManager() { this.iworkspace = ResourcesPlugin.getWorkspace(); @@ -103,6 +104,13 @@ public void startScan(Composite parent, boolean isDebugLogs) { scanAndUpdateResults(IssuesTree.getInstance(), parent, isDebugLogs, project, auditEnvVars); } } + + public void checkCanceled() { + if (monitor != null && monitor.isCanceled()) { + cancellationRequested.set(true); + throw new CancellationException("Xray scan was canceled"); // TODO: pop up a message + } + } public void setMonitor(IProgressMonitor monitor) { this.monitor = monitor; @@ -164,23 +172,30 @@ private ScanRunnable(Composite parent, IssuesTree issuesTree, boolean isDebugLog @Override public void run(IProgressMonitor monitor) throws CoreException { + ScanManager.this.monitor = monitor; + if (isDisposed() || monitor.isCanceled()) { + return; + } + + log.info(String.format("Performing scan on: %s", project.getName())); + try { if (project.isOpen()) { IPath projectPath = project.getLocation(); - log.info(String.format("Performing scan on: %s", project.getName())); - CommandResults auditResults = cliDriver.runCliAudit(new File(projectPath.toString()), null, "eclipse-plugin", null, envVars); if (!auditResults.isOk()) { // log the issue to the problems tab log.error("Audit scan failed with an error: " + auditResults.getErr()); return; } + log.info("Finished audit scan successfully.\n" + auditResults.getRes()); if (isDebugLogs) { log.debug(auditResults.getErr()); } // update scan cache + log.info("Updating scan cache."); ScanCache.getInstance().updateScanResults(sarifParser.parse(auditResults.getRes())); // update issues tree @@ -198,7 +213,9 @@ public void run() { } } catch (Exception e) { - CliDriverWrapper.getInstance().showCliError("An error occurred while performing audit scan", e);; + CliDriverWrapper.getInstance().showCliError("An error occurred while performing audit scan", e); + } finally { + scanFinished(); } } @@ -207,5 +224,4 @@ private boolean isDisposed() { } } - } diff --git a/bundle/src/main/java/com/jfrog/ide/eclipse/ui/ComponentDetails.java b/bundle/src/main/java/com/jfrog/ide/eclipse/ui/ComponentDetails.java index 1f22881..d271214 100644 --- a/bundle/src/main/java/com/jfrog/ide/eclipse/ui/ComponentDetails.java +++ b/bundle/src/main/java/com/jfrog/ide/eclipse/ui/ComponentDetails.java @@ -14,9 +14,8 @@ import org.eclipse.ui.forms.events.HyperlinkAdapter; import org.eclipse.ui.forms.events.HyperlinkEvent; import org.eclipse.ui.forms.widgets.Hyperlink; -import org.jfrog.build.extractor.scan.DependencyTree; -import org.jfrog.build.extractor.scan.GeneralInfo; +import com.jfrog.ide.common.nodes.FileTreeNode; import com.jfrog.ide.eclipse.configuration.XrayGlobalConfiguration; import com.jfrog.ide.eclipse.configuration.XrayServerConfigImpl; @@ -40,7 +39,7 @@ public ComponentDetails(Composite parent, String title) { recreateComponentDetails(); } - public abstract void createDetailsView(DependencyTree node); + public abstract void createDetailsView(FileTreeNode node); public void recreateComponentDetails() { if (isDisposed()) { @@ -100,19 +99,20 @@ protected void createComponentsPanel() { * * @param node - Extract the component information from this node. */ - protected void createCommonInfo(DependencyTree node) { + protected void createCommonInfo(FileTreeNode node) { for (Control control : componentDetailsPanel.getChildren()) { control.dispose(); } - GeneralInfo generalInfo = ObjectUtils.defaultIfNull(node.getGeneralInfo(), new GeneralInfo()); - if (!StringUtils.equalsIgnoreCase("Npm", generalInfo.getPkgType())) { - addSection("Group:", generalInfo.getGroupId()); - } - - addSection("Artifact:", generalInfo.getArtifactId()); - addSection("Version:", generalInfo.getVersion()); - addSection("Type:", StringUtils.capitalize(generalInfo.getPkgType())); - addSection("Path:", generalInfo.getPath()); + // TODO: implement extraction of data +// GeneralInfo generalInfo = ObjectUtils.defaultIfNull(node.getGeneralInfo(), new GeneralInfo()); +// if (!StringUtils.equalsIgnoreCase("Npm", generalInfo.getPkgType())) { +// addSection("Group:", generalInfo.getGroupId()); +// } +// +// addSection("Artifact:", generalInfo.getArtifactId()); +// addSection("Version:", generalInfo.getVersion()); +// addSection("Type:", StringUtils.capitalize(generalInfo.getPkgType())); +// addSection("Path:", generalInfo.getPath()); refreshPanel(); } diff --git a/bundle/src/main/java/com/jfrog/ide/eclipse/ui/ScanTreeContentProvider.java b/bundle/src/main/java/com/jfrog/ide/eclipse/ui/ScanTreeContentProvider.java index a068c1e..637b887 100644 --- a/bundle/src/main/java/com/jfrog/ide/eclipse/ui/ScanTreeContentProvider.java +++ b/bundle/src/main/java/com/jfrog/ide/eclipse/ui/ScanTreeContentProvider.java @@ -6,8 +6,9 @@ import javax.swing.tree.TreeNode; import org.eclipse.jface.viewers.ITreeContentProvider; + +import com.jfrog.ide.common.nodes.FileIssueNode; import com.jfrog.ide.common.nodes.FileTreeNode; -import com.jfrog.ide.common.nodes.IssueNode; /** * Content provider for DependenciesTree. * @@ -24,7 +25,7 @@ public Object[] getElements(Object element) { @Override public Object[] getChildren(Object element) { if (element instanceof FileTreeNode) { - List children = ((FileTreeNode) element).getChildren(); // TODO: check if works + List children = ((FileTreeNode) element).getChildren(); return children.toArray(); } else if (element instanceof List) { // If the element is a List (root nodes), return its elements @@ -39,6 +40,9 @@ public Object getParent(Object element) { if (element instanceof FileTreeNode) { return ((FileTreeNode) element).getParent(); } + if (element instanceof FileIssueNode) { + return ((FileIssueNode) element).getParent(); + } return null; } @@ -47,6 +51,9 @@ public boolean hasChildren(Object element) { if (element instanceof FileTreeNode) { return !((FileTreeNode) element).isLeaf(); } + if (element instanceof FileIssueNode) { + return ((FileIssueNode) element).isLeaf(); + } return false; } } diff --git a/bundle/src/main/java/com/jfrog/ide/eclipse/ui/SearchableTree.java b/bundle/src/main/java/com/jfrog/ide/eclipse/ui/SearchableTree.java index f6ebd99..97447d0 100644 --- a/bundle/src/main/java/com/jfrog/ide/eclipse/ui/SearchableTree.java +++ b/bundle/src/main/java/com/jfrog/ide/eclipse/ui/SearchableTree.java @@ -1,5 +1,6 @@ package com.jfrog.ide.eclipse.ui; +import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; @@ -16,7 +17,6 @@ import org.eclipse.swt.widgets.Control; import org.eclipse.ui.dialogs.FilteredTree; import org.eclipse.ui.dialogs.PatternFilter; -import org.jfrog.build.extractor.scan.DependencyTree; import com.google.common.collect.Lists; import com.jfrog.ide.common.nodes.FileTreeNode; @@ -33,7 +33,7 @@ public abstract class SearchableTree extends FilteredTree { // protected ProjectsMap projects = new ProjectsMap(); protected ComponentDetails componentDetails; private TreeColumnLayout treeLayout = new TreeColumnLayout(); - protected List scanResults; + protected List scanResults = new ArrayList(); public SearchableTree(Composite parent, ColumnLabelProvider labelProvider) { super(parent, true); @@ -65,23 +65,24 @@ public TreeViewerColumn createColumn(String title, ColumnLabelProvider labelProv } private void registerListeners() { - treeViewer.addSelectionChangedListener(new ISelectionChangedListener() { - @Override - public void selectionChanged(SelectionChangedEvent event) { - if (event.getSelection().isEmpty()) { - return; - } - DependencyTree selection = (DependencyTree) treeViewer.getStructuredSelection().getFirstElement(); - onClick(selection); - } - }); + // TODO: implement using FileIssueNode and FileTreeNode +// treeViewer.addSelectionChangedListener(new ISelectionChangedListener() { +// @Override +// public void selectionChanged(SelectionChangedEvent event) { +// if (event.getSelection().isEmpty()) { +// return; +// } +// DependencyTree selection = (DependencyTree) treeViewer.getStructuredSelection().getFirstElement(); +// onClick(selection); +// } +// }); } public void setComponentDetails(ComponentDetails componentDetails) { this.componentDetails = componentDetails; } - protected abstract void onClick(DependencyTree selection); + protected abstract void onClick(FileTreeNode selection); private static PatternFilter createFilter() { PatternFilter patternFilter = new PatternFilter(); @@ -89,12 +90,12 @@ private static PatternFilter createFilter() { return patternFilter; } - public List getSelectedNodes() { - List selectedNodes = Lists.newArrayList(); + public List getSelectedNodes() { + List selectedNodes = Lists.newArrayList(); TreePath[] selectionPaths = treeViewer.getStructuredSelection().getPaths(); if (selectionPaths != null) { selectedNodes = Arrays.stream(selectionPaths) - .map(selectedPath -> (DependencyTree) selectedPath.getLastSegment()).collect(Collectors.toList()); + .map(selectedPath -> (FileTreeNode) selectedPath.getLastSegment()).collect(Collectors.toList()); } return selectedNodes; diff --git a/bundle/src/main/java/com/jfrog/ide/eclipse/ui/issues/ComponentIssueDetails.java b/bundle/src/main/java/com/jfrog/ide/eclipse/ui/issues/ComponentIssueDetails.java index 389b5fd..be70958 100644 --- a/bundle/src/main/java/com/jfrog/ide/eclipse/ui/issues/ComponentIssueDetails.java +++ b/bundle/src/main/java/com/jfrog/ide/eclipse/ui/issues/ComponentIssueDetails.java @@ -2,8 +2,9 @@ import org.apache.commons.lang3.StringUtils; import org.eclipse.swt.widgets.Composite; -import org.jfrog.build.extractor.scan.DependencyTree; import org.jfrog.build.extractor.scan.Issue; + +import com.jfrog.ide.common.nodes.FileTreeNode; import com.jfrog.ide.eclipse.ui.ComponentDetails; /** @@ -27,11 +28,11 @@ private ComponentIssueDetails(Composite parent) { } @Override - public void createDetailsView(DependencyTree node) { + public void createDetailsView(FileTreeNode node) { createCommonInfo(node); - Issue topIssue = node.getTopIssue(); - addSection("Top Issue Severity:", StringUtils.capitalize(topIssue.getSeverity().toString())); - addSection("Issues Count:", String.valueOf(node.getIssueCount())); +// Issue topIssue = node.getTopIssue(); +// addSection("Top Issue Severity:", StringUtils.capitalize(topIssue.getSeverity().toString())); +// addSection("Issues Count:", String.valueOf(node.getIssueCount())); refreshPanel(); } diff --git a/bundle/src/main/java/com/jfrog/ide/eclipse/ui/issues/ComponentIssueTable.java b/bundle/src/main/java/com/jfrog/ide/eclipse/ui/issues/ComponentIssueTable.java index b7b5eef..c6723ad 100644 --- a/bundle/src/main/java/com/jfrog/ide/eclipse/ui/issues/ComponentIssueTable.java +++ b/bundle/src/main/java/com/jfrog/ide/eclipse/ui/issues/ComponentIssueTable.java @@ -21,11 +21,11 @@ import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Table; import org.eclipse.swt.widgets.TableColumn; -import org.jfrog.build.extractor.scan.DependencyTree; import org.jfrog.build.extractor.scan.Issue; import org.jfrog.build.extractor.scan.Severity; import com.jfrog.ide.common.filter.FilterManager; +import com.jfrog.ide.common.nodes.FileTreeNode; import com.jfrog.ide.eclipse.ui.FilterManagerSingleton; import com.jfrog.ide.eclipse.ui.IconManager; import com.jfrog.ide.eclipse.ui.Panel; @@ -114,12 +114,13 @@ private TableViewerColumn createTableViewerColumn(String title, int weight, Colu return viewerColumn; } - public void updateIssuesTable(List selectedNodes) { - Set issuesSet = Sets.newHashSet(); - FilterManager filterManager = FilterManagerSingleton.getInstance(); - issuesSet.addAll(filterManager.getFilteredScanIssues(selectedNodes)); - tableViewer.setInput( - issuesSet.stream().sorted(Comparator.comparing(issue -> ((Issue) issue).getSeverity()).reversed()) - .collect(Collectors.toList())); + public void updateIssuesTable(List selectedNodes) { + // TODO: implement correctly +// Set issuesSet = Sets.newHashSet(); +// FilterManager filterManager = FilterManagerSingleton.getInstance(); +// issuesSet.addAll(filterManager.getFilteredScanIssues(selectedNodes)); +// tableViewer.setInput( +// issuesSet.stream().sorted(Comparator.comparing(issue -> ((Issue) issue).getSeverity()).reversed()) +// .collect(Collectors.toList())); } } diff --git a/bundle/src/main/java/com/jfrog/ide/eclipse/ui/issues/IssueCountColumnLabelProvider.java b/bundle/src/main/java/com/jfrog/ide/eclipse/ui/issues/IssueCountColumnLabelProvider.java index 93138d3..3191d85 100644 --- a/bundle/src/main/java/com/jfrog/ide/eclipse/ui/issues/IssueCountColumnLabelProvider.java +++ b/bundle/src/main/java/com/jfrog/ide/eclipse/ui/issues/IssueCountColumnLabelProvider.java @@ -1,11 +1,14 @@ package com.jfrog.ide.eclipse.ui.issues; +import java.util.List; + import org.eclipse.jface.resource.FontDescriptor; import org.eclipse.jface.viewers.ColumnLabelProvider; import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.Font; import org.eclipse.swt.widgets.Composite; -import org.jfrog.build.extractor.scan.DependencyTree; + +import com.jfrog.ide.common.nodes.FileTreeNode; /** * The issues count component in the issues tree. @@ -22,7 +25,10 @@ public IssueCountColumnLabelProvider(Composite parent) { @Override public String getText(Object element) { - int issueCount = ((DependencyTree) element).getIssueCount(); + int issueCount = 0; + if (element instanceof FileTreeNode) { + issueCount = ((FileTreeNode) element).getChildCount(); + } return issueCount == 0 ? "" : "(" + issueCount + ")"; } diff --git a/bundle/src/main/java/com/jfrog/ide/eclipse/ui/issues/IssuesTree.java b/bundle/src/main/java/com/jfrog/ide/eclipse/ui/issues/IssuesTree.java index b02146e..7cc2055 100644 --- a/bundle/src/main/java/com/jfrog/ide/eclipse/ui/issues/IssuesTree.java +++ b/bundle/src/main/java/com/jfrog/ide/eclipse/ui/issues/IssuesTree.java @@ -1,15 +1,17 @@ package com.jfrog.ide.eclipse.ui.issues; +import java.util.ArrayList; import java.util.List; import java.util.Map.Entry; import org.eclipse.jface.viewers.TreeViewerColumn; import org.eclipse.swt.SWT; import org.eclipse.swt.widgets.Composite; -import org.jfrog.build.extractor.scan.DependencyTree; import com.google.common.collect.Lists; import com.jfrog.ide.common.filter.FilterManager; +import com.jfrog.ide.common.nodes.FileTreeNode; +import com.jfrog.ide.eclipse.scan.ScanCache; import com.jfrog.ide.eclipse.ui.FilterManagerSingleton; import com.jfrog.ide.eclipse.ui.SearchableTree; import com.jfrog.ide.eclipse.utils.ProjectsMap.ProjectKey; @@ -20,8 +22,6 @@ public class IssuesTree extends SearchableTree { private static IssuesTree instance; - - private DependencyTree root = new DependencyTree(); private ComponentIssueTable componentIssueTable; private TreeViewerColumn issuesCountColumn; @@ -35,13 +35,13 @@ public static IssuesTree getInstance() { private IssuesTree(Composite parent) { super(parent, new IssuesTreeColumnLabelProvider()); - issuesCountColumn = createColumn("Issues (0)", new IssueCountColumnLabelProvider(this), SWT.RIGHT, 0); + issuesCountColumn = createColumn("Issues", new IssueCountColumnLabelProvider(this), SWT.RIGHT, 0); showScanResults(); // applyFiltersForAllProjects(); } @Override - protected void onClick(DependencyTree selection) { + protected void onClick(FileTreeNode selection) { componentDetails.createDetailsView(selection); componentIssueTable.updateIssuesTable(getSelectedNodes()); } @@ -82,9 +82,8 @@ public void applyFiltersForAllProjects() { public void reset() { super.reset(); componentIssueTable.updateIssuesTable(Lists.newArrayList()); - issuesCountColumn.getColumn().setText("Issues (0)"); - root = new DependencyTree(); - treeViewer.setInput(root); + issuesCountColumn.getColumn().setText("Issues"); + treeViewer.setInput(new ArrayList()); } public static void disposeTree() { diff --git a/bundle/src/main/java/com/jfrog/ide/eclipse/ui/issues/IssuesTreeColumnLabelProvider.java b/bundle/src/main/java/com/jfrog/ide/eclipse/ui/issues/IssuesTreeColumnLabelProvider.java index fa725a7..55afe19 100644 --- a/bundle/src/main/java/com/jfrog/ide/eclipse/ui/issues/IssuesTreeColumnLabelProvider.java +++ b/bundle/src/main/java/com/jfrog/ide/eclipse/ui/issues/IssuesTreeColumnLabelProvider.java @@ -2,8 +2,14 @@ import org.eclipse.jface.viewers.ColumnLabelProvider; import org.eclipse.swt.graphics.Image; -import org.jfrog.build.extractor.scan.DependencyTree; -import org.jfrog.build.extractor.scan.Severity; +import org.eclipse.swt.graphics.ImageData; +import org.eclipse.swt.widgets.Display; + +import com.jfrog.ide.common.nodes.FileIssueNode; +import com.jfrog.ide.common.nodes.FileTreeNode; +import com.jfrog.ide.common.nodes.ScaIssueNode; +import com.jfrog.ide.common.nodes.subentities.Severity; +import com.jfrog.ide.common.parse.Applicability; import com.jfrog.ide.eclipse.ui.IconManager; /** @@ -15,8 +21,18 @@ public class IssuesTreeColumnLabelProvider extends ColumnLabelProvider { @Override public Image getImage(Object element) { - DependencyTree scanTreeNode = (DependencyTree) element; - Severity severity = scanTreeNode.getTopIssue().getSeverity(); - return IconManager.load(severity.name().toLowerCase()); + Severity severity = null; + if (element instanceof FileTreeNode) { + severity = ((FileTreeNode) element).getSeverity(); + } else if (element instanceof ScaIssueNode) { + ScaIssueNode issueNode = (ScaIssueNode) element; + severity = issueNode.getSeverity(); + if (Applicability.NOT_APPLICABLE.equals(issueNode.getApplicability())) { + severity = Severity.getNotApplicableSeverity(severity); + } + } else if (element instanceof FileIssueNode) { + severity = ((FileIssueNode) element).getSeverity(); + } + return IconManager.load(severity.name().toLowerCase()); } } From 4e5069ca860acb5f46aa1b1ee466fd8803e04ddf Mon Sep 17 00:00:00 2001 From: kerenr-jfrog Date: Tue, 1 Apr 2025 16:27:56 +0300 Subject: [PATCH 7/7] icons --- bundle/icons/.gitignore | 0 bundle/icons/unknowm.png | Bin 329 -> 0 bytes bundle/icons/unknown.png | Bin 0 -> 327 bytes 3 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 bundle/icons/.gitignore delete mode 100644 bundle/icons/unknowm.png create mode 100644 bundle/icons/unknown.png diff --git a/bundle/icons/.gitignore b/bundle/icons/.gitignore new file mode 100644 index 0000000..e69de29 diff --git a/bundle/icons/unknowm.png b/bundle/icons/unknowm.png deleted file mode 100644 index 95ead87944416fbf83cb4ff9263401467e27adce..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 329 zcmV-P0k-~$P)1b@BZ_wV343k!_Uthh4AwxdNY~dD#d z46NU5)Z9#g-=WtbLKlQG&NuBd2DkZG>qQ=q!zAJ4llPewBI?E-M?n-85D7a_XFq~@ ze}~(f<7w8L0JFvFtbni1Lu7bMJu!tvY#bhu=nEHufQcrsEeYpBK166Zn!roF8bH!} z9$9tTv+cuHYODP7=ea8SdV=3?HOzK0pnYTO$!teevMQ&^nH|I!4Ca+B3*W#f5K_3w bwy%mEr`lD~4&v`_00000NkvXXu0mjfA|{cK diff --git a/bundle/icons/unknown.png b/bundle/icons/unknown.png new file mode 100644 index 0000000000000000000000000000000000000000..2014d4d899bf92c0aec77ebeb299cf207dc1b96c GIT binary patch literal 327 zcmV-N0l5B&P)B0CD?UhEW8+hA1-qo}d@D{(5Me$)lupe510zpJVaH>? Z6la9OSw2UKZ1eyC002ovPDHLkV1gdZky`)& literal 0 HcmV?d00001