From 48a5b8688eb08636a60d9133596c3ca1e307a024 Mon Sep 17 00:00:00 2001 From: kerenr-jfrog Date: Tue, 1 Apr 2025 17:23:34 +0300 Subject: [PATCH 1/9] added implementation for ScanMnager, ScanCache and debug logs --- .../configuration/PreferenceConstants.java | 1 + .../XrayGlobalConfiguration.java | 9 +- .../configuration/XrayServerConfigImpl.java | 18 +- .../com/jfrog/ide/eclipse/scan/ScanCache.java | 41 ++++ .../jfrog/ide/eclipse/scan/ScanManager.java | 180 +++++++++++++----- .../scheduling/CliJobEventListener.java | 6 +- .../com/jfrog/ide/eclipse/ui/PartControl.java | 9 - .../jfrog/ide/eclipse/ui/actions/Refresh.java | 5 +- 8 files changed, 198 insertions(+), 71 deletions(-) create mode 100644 bundle/src/main/java/com/jfrog/ide/eclipse/scan/ScanCache.java 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 2b5ed72..faabb0d 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 @@ -2,6 +2,7 @@ import org.eclipse.core.runtime.ICoreRunnable; 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; @@ -11,6 +12,7 @@ import org.eclipse.ui.dialogs.PreferencesUtil; import org.eclipse.ui.preferences.ScopedPreferenceStore; +import com.jfrog.ide.eclipse.scan.ScanManager; import com.jfrog.ide.eclipse.scheduling.CliJob; import com.jfrog.ide.eclipse.ui.ComponentDetails; import com.jfrog.ide.eclipse.ui.issues.ComponentIssueDetails; @@ -40,6 +42,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 @@ -79,7 +85,8 @@ public boolean performOk() { } } if (doQuickScan) { - // TODO: run a scan using the ScanManager + ScanManager.getInstance().startScan(getShell().getParent(), + getPreferenceStore().getBoolean(PreferenceConstants.DEBUG_LOGS)); } 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..9a098b1 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(); @@ -48,6 +46,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)); @@ -110,32 +112,32 @@ 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; } -} +} \ No newline at end of file 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..83e3edc --- /dev/null +++ b/bundle/src/main/java/com/jfrog/ide/eclipse/scan/ScanCache.java @@ -0,0 +1,41 @@ +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); + } + } + + 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 6ce0ff4..5870397 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,65 +1,95 @@ package com.jfrog.ide.eclipse.scan; -import java.io.IOException; -import java.nio.file.Files; +import java.io.File; import java.nio.file.Path; import java.nio.file.Paths; +import java.util.HashMap; +import java.util.Map; import java.util.concurrent.CancellationException; +import java.util.concurrent.atomic.AtomicBoolean; 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.scan.DependencyTree; +import org.jfrog.build.extractor.executor.CommandResults; -import com.fasterxml.jackson.core.JsonProcessingException; 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.scan.ComponentPrefix; -import com.jfrog.ide.eclipse.configuration.XrayServerConfigImpl; +import com.jfrog.ide.common.parse.SarifParser; +import com.jfrog.ide.eclipse.configuration.CliDriverWrapper; import com.jfrog.ide.eclipse.log.Logger; -import com.jfrog.ide.eclipse.log.ProgressIndicatorImpl; import com.jfrog.ide.eclipse.scheduling.CliJob; -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.xray.client.services.summary.Components; import org.jfrog.build.api.util.Log; /** * @author yahavi */ -public abstract class ScanManager { - +public class ScanManager { static final Path HOME_PATH = Paths.get(System.getProperty("user.home"), ".jfrog-eclipse-plugin"); + private static ScanManager instance; private IProgressMonitor monitor; - IProject project; - Log log; - JfrogCliDriver cliDriver; + private IWorkspace iworkspace; + private IProject[] projects; + private Log log; + private JfrogCliDriver cliDriver; + private SarifParser sarifParser; + private AtomicBoolean scanInProgress = new AtomicBoolean(false); + private AtomicBoolean cancellationRequested = new AtomicBoolean(false); - ScanManager(IProject project, ComponentPrefix prefix) throws IOException { - this.project = project; - Files.createDirectories(HOME_PATH); - log = Logger.getInstance(); + private ScanManager() { + this.iworkspace = ResourcesPlugin.getWorkspace(); + this.projects = iworkspace.getRoot().getProjects(); + this.log = Logger.getInstance(); + this.cliDriver = CliDriverWrapper.getInstance().getCliDriver(); + this.sarifParser = new SarifParser(log); + } + + public static synchronized ScanManager getInstance(){ + if (instance == null) { + instance = new ScanManager(); + } + return instance; } - - /** - * 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 IProject getIProject() { - return project; + 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()); + + // 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 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; } @@ -67,44 +97,98 @@ 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 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(boolean quickScan, IssuesTree issuesTree, Composite parent) { - CliJob.doSchedule(project.getName(), new ScanRunnable(parent, issuesTree, quickScan)); + public void scanAndUpdateResults(IssuesTree issuesTree, Composite parent, boolean isDebugLogs, IProject project, Map envVars) { + CliJob.doSchedule(String.format("Performing Scan: %s", project.getName()), new ScanRunnable(parent, issuesTree, isDebugLogs, project, envVars)); } /** - * Start a dependency scan. + * Start an audit scan. */ private class ScanRunnable implements ICoreRunnable { private IssuesTree issuesTree; - private boolean quickScan; private Composite parent; + private IProject project; + private Map envVars; + private boolean isDebugLogs; + - private ScanRunnable(Composite parent, IssuesTree issuesTree, boolean quickScan) { + private ScanRunnable(Composite parent, IssuesTree issuesTree, boolean isDebugLogs, IProject project, Map envVars) { this.parent = parent; this.issuesTree = issuesTree; - this.quickScan = quickScan; + this.project = project; + this.envVars = envVars; + this.isDebugLogs = isDebugLogs; } @Override public void run(IProgressMonitor monitor) throws CoreException { - // TODO: implement scan manager using JfrogCliDriver - } + 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(); + 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())); + + // TODO: update issues tree + } - private void setScanResults() { - // TODO: re implement using SarifParser + } catch (Exception e) { + CliDriverWrapper.getInstance().showCliError("An error occurred while performing audit scan", e); + } finally { + scanFinished(); + } } private boolean isDisposed() { return parent == null || parent.isDisposed(); } + } - -} +} \ No newline at end of file diff --git a/bundle/src/main/java/com/jfrog/ide/eclipse/scheduling/CliJobEventListener.java b/bundle/src/main/java/com/jfrog/ide/eclipse/scheduling/CliJobEventListener.java index 0726f34..da9fab5 100644 --- a/bundle/src/main/java/com/jfrog/ide/eclipse/scheduling/CliJobEventListener.java +++ b/bundle/src/main/java/com/jfrog/ide/eclipse/scheduling/CliJobEventListener.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 CliJobEventListener extends JobChangeAdapter { @Override public void done(IJobChangeEvent event) { Job[] jobs = Job.getJobManager().find(CliJob.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/PartControl.java b/bundle/src/main/java/com/jfrog/ide/eclipse/ui/PartControl.java index 7a8b0b5..41fc114 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 @@ -10,7 +10,6 @@ import org.eclipse.swt.layout.GridData; import org.eclipse.swt.widgets.Composite; -import com.jfrog.ide.eclipse.configuration.XrayServerConfigImpl; import com.jfrog.ide.eclipse.ui.actions.Filter.FilterType; import com.jfrog.ide.eclipse.ui.issues.ComponentIssueDetails; import com.jfrog.ide.eclipse.ui.issues.IssuesTab; @@ -30,7 +29,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 +43,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(); 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..813d013 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 @@ -4,6 +4,7 @@ import org.eclipse.swt.widgets.ToolBar; 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 +23,7 @@ public void execute(SelectionEvent event) { Logger.getInstance().error("Xray server is not configured."); return; } -// ScanManagersFactory.getInstance().startScan(getParent(), false); - // TODO: run a scan + + ScanManager.getInstance().startScan(getParent(), XrayServerConfigImpl.getInstance().getIsDebugLogs()); } } From de30f5ab181d049c177d43523d2915094e1112d3 Mon Sep 17 00:00:00 2001 From: kerenr-jfrog Date: Wed, 2 Apr 2025 11:00:39 +0300 Subject: [PATCH 2/9] final improvements after manual checking --- .../jfrog/ide/eclipse/scan/ScanManager.java | 23 +++++++++++-------- 1 file changed, 13 insertions(+), 10 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 5870397..2352808 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 @@ -40,7 +40,6 @@ 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(); @@ -62,8 +61,7 @@ public void startScan(Composite parent, boolean isDebugLogs) { // 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..."); + log.info("Previous scan still running..."); return; } @@ -71,13 +69,16 @@ public void startScan(Composite parent, boolean isDebugLogs) { resetIssuesView(IssuesTree.getInstance()); // refresh projects list - this.projects = this.iworkspace.getRoot().getProjects(); + projects = iworkspace.getRoot().getProjects(); + if (projects.length == 0) { + log.info("No projects to scan."); + } if (isDebugLogs) { auditEnvVars.put("JFROG_CLI_LOG_LEVEL", "DEBUG"); auditEnvVars.put("CI", "true"); } - + for (IProject project : projects) { scanAndUpdateResults(IssuesTree.getInstance(), parent, isDebugLogs, project, auditEnvVars); } @@ -85,8 +86,7 @@ public void startScan(Composite parent, boolean isDebugLogs) { public void checkCanceled() { if (monitor != null && monitor.isCanceled()) { - cancellationRequested.set(true); - throw new CancellationException("Xray scan was canceled"); // TODO: pop up a message + throw new CancellationException("Xray scan was canceled"); } } @@ -151,7 +151,7 @@ private ScanRunnable(Composite parent, IssuesTree issuesTree, boolean isDebugLog @Override public void run(IProgressMonitor monitor) throws CoreException { ScanManager.this.monitor = monitor; - if (isDisposed() || monitor.isCanceled()) { + if (isDisposed()) { return; } @@ -160,13 +160,15 @@ public void run(IProgressMonitor monitor) throws CoreException { try { if (project.isOpen()) { IPath projectPath = project.getLocation(); - CommandResults auditResults = cliDriver.runCliAudit(new File(projectPath.toString()), null, "eclipse-plugin", null, envVars); + CommandResults auditResults = cliDriver.runCliAudit(new File(projectPath.toString()), null, CliDriverWrapper.CLIENT_ID_SERVER, null, envVars); if (!auditResults.isOk()) { // log the issue to the problems tab log.error("Audit scan failed with an error: " + auditResults.getErr()); return; } + checkCanceled(); + log.info("Finished audit scan successfully.\n" + auditResults.getRes()); if (isDebugLogs) { log.debug(auditResults.getErr()); @@ -178,7 +180,8 @@ public void run(IProgressMonitor monitor) throws CoreException { // TODO: update issues tree } - + } catch (CancellationException ce) { + log.info(ce.getMessage()); } catch (Exception e) { CliDriverWrapper.getInstance().showCliError("An error occurred while performing audit scan", e); } finally { From 2ba9c4b043057dd0bfc3ee4d52ec0c9808776083 Mon Sep 17 00:00:00 2001 From: kerenr-jfrog Date: Wed, 2 Apr 2025 13:27:27 +0300 Subject: [PATCH 3/9] fix CR comments --- .../ide/eclipse/configuration/XrayGlobalConfiguration.java | 6 +++--- .../main/java/com/jfrog/ide/eclipse/scan/ScanManager.java | 1 + 2 files changed, 4 insertions(+), 3 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 faabb0d..1de0866 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 @@ -76,15 +76,15 @@ public boolean performOk() { // Schedule the CliJob to execute the runnable CliJob.doSchedule("Setup Server Configuration", runnable); - boolean doQuickScan = false; + boolean runScan = false; ComponentDetails[] componentsDetails = { ComponentIssueDetails.getInstance()}; for (ComponentDetails componentsDetail : componentsDetails) { if (componentsDetail != null) { componentsDetail.credentialsSet(); - doQuickScan = true; + runScan = true; } } - if (doQuickScan) { + if (runScan) { ScanManager.getInstance().startScan(getShell().getParent(), getPreferenceStore().getBoolean(PreferenceConstants.DEBUG_LOGS)); } 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 2352808..8cba9a8 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 @@ -67,6 +67,7 @@ public void startScan(Composite parent, boolean isDebugLogs) { scanInProgress.compareAndSet(false, true); resetIssuesView(IssuesTree.getInstance()); + ScanCache.getInstance().resetCache(); // refresh projects list projects = iworkspace.getRoot().getProjects(); From 14e90cfa03e86333bca2b6bbdd8c9dda9ccb1ffe Mon Sep 17 00:00:00 2001 From: kerenr-jfrog Date: Wed, 2 Apr 2025 16:01:34 +0300 Subject: [PATCH 4/9] fix in scan manager get instance --- .../main/java/com/jfrog/ide/eclipse/scan/ScanManager.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) 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 8cba9a8..e06f884 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 @@ -51,7 +51,11 @@ private ScanManager() { public static synchronized ScanManager getInstance(){ if (instance == null) { - instance = new ScanManager(); + synchronized (ScanManager.class) { + if (instance == null) { + instance = new ScanManager(); + } + } } return instance; } From 00bd3ac372132b962219e31f47bb95614c035180 Mon Sep 17 00:00:00 2001 From: kerenr-jfrog Date: Wed, 2 Apr 2025 16:02:03 +0300 Subject: [PATCH 5/9] minor fix --- .../src/main/java/com/jfrog/ide/eclipse/scan/ScanManager.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 e06f884..a6aad38 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 @@ -49,7 +49,7 @@ private ScanManager() { this.sarifParser = new SarifParser(log); } - public static synchronized ScanManager getInstance(){ + public static ScanManager getInstance(){ if (instance == null) { synchronized (ScanManager.class) { if (instance == null) { From 584d6ba745a92e0d90feba1e4fefdb7a539362f7 Mon Sep 17 00:00:00 2001 From: kerenr-jfrog Date: Wed, 2 Apr 2025 17:21:01 +0300 Subject: [PATCH 6/9] removed perform scan when configuring server --- .../eclipse/configuration/XrayGlobalConfiguration.java | 10 ++-------- 1 file changed, 2 insertions(+), 8 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 1de0866..e46e325 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 @@ -56,7 +56,7 @@ public boolean performOk() { } // Define the runnable to execute the CLI config command - ICoreRunnable runnable = monitor -> { + ICoreRunnable runnableServerConfig = monitor -> { try { CliDriverWrapper.getInstance().getCliDriver().addCliServerConfig( XrayServerConfigImpl.getInstance().getXrayUrl(), @@ -74,20 +74,14 @@ public boolean performOk() { }; // Schedule the CliJob to execute the runnable - CliJob.doSchedule("Setup Server Configuration", runnable); + CliJob.doSchedule("Setup Server Configuration", runnableServerConfig); - boolean runScan = false; ComponentDetails[] componentsDetails = { ComponentIssueDetails.getInstance()}; for (ComponentDetails componentsDetail : componentsDetails) { if (componentsDetail != null) { componentsDetail.credentialsSet(); - runScan = true; } } - if (runScan) { - ScanManager.getInstance().startScan(getShell().getParent(), - getPreferenceStore().getBoolean(PreferenceConstants.DEBUG_LOGS)); - } return true; } From f667147d6cbf83ddb524de9b9a56a12784befe2f Mon Sep 17 00:00:00 2001 From: kerenr-jfrog Date: Sun, 6 Apr 2025 09:14:08 +0300 Subject: [PATCH 7/9] progress --- .../configuration/PreferenceConstants.java | 14 ++++++- .../XrayGlobalConfiguration.java | 29 ++++++++++---- .../com/jfrog/ide/eclipse/log/Logger.java | 35 ++++++++++++++--- .../jfrog/ide/eclipse/scan/ScanManager.java | 39 +++++++++---------- 4 files changed, 82 insertions(+), 35 deletions(-) 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 6e806be..c08ec71 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 @@ -1,5 +1,8 @@ package com.jfrog.ide.eclipse.configuration; +import java.util.HashMap; +import java.util.Map; + /** * Constant definitions for plug-in preferences * @@ -12,7 +15,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"; + public static final String DEBUG_LOGS = "DebugLogs"; // Connection constants public static final int CONNECTION_TIMEOUT_MILLISECONDS = 300 * 1000; @@ -21,4 +24,13 @@ public class PreferenceConstants { // Eclipse Buildship plugins public static final String GRADLE_PLUGIN_QUALIFIER = "org.eclipse.buildship.core"; public static final String GRADLE_DISTRIBUTION = "gradle.distribution"; + + + public static Map getCliDebugLogsEnvVars(){ + Map envVars = new HashMap<>(); + envVars.put("JFROG_CLI_LOG_LEVEL", "DEBUG"); + envVars.put("CI", "true"); + + return envVars; + } } 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 e46e325..1867577 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,5 +1,8 @@ package com.jfrog.ide.eclipse.configuration; +import java.util.HashMap; +import java.util.Map; + import org.eclipse.core.runtime.ICoreRunnable; import org.eclipse.core.runtime.preferences.ConfigurationScope; import org.eclipse.jface.preference.BooleanFieldEditor; @@ -12,10 +15,12 @@ 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.scheduling.CliJob; 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. @@ -37,15 +42,13 @@ public void createFieldEditors() { StringFieldEditor passwordEditor = new StringFieldEditor(PreferenceConstants.XRAY_PASSWORD, "Password:", getFieldEditorParent()); passwordEditor.getTextControl(getFieldEditorParent()).setEchoChar('*'); + addField(urlEditor); addField(usernameEditor); addField(passwordEditor); addField(new TestConnectionButton(urlEditor, usernameEditor, passwordEditor, getFieldEditorParent())); - - BooleanFieldEditor debugLogsCheckbox = new BooleanFieldEditor(PreferenceConstants.DEBUG_LOGS, "Generate Debug Logs", - getFieldEditorParent()); - addField(debugLogsCheckbox); + addField(new BooleanFieldEditor(PreferenceConstants.DEBUG_LOGS, "Generate Debug Logs", getFieldEditorParent())); } @Override @@ -54,6 +57,17 @@ public boolean performOk() { if (!XrayServerConfigImpl.getInstance().areCredentialsSet()) { return true; } + + final Map configEnv; + + // define log level + if (XrayServerConfigImpl.getInstance().getIsDebugLogs()) { + Logger.getInstance().setLogLevel(Logger.DEBUG); + configEnv = PreferenceConstants.getCliDebugLogsEnvVars(); + } else { + Logger.getInstance().setLogLevel(Logger.INFO); + configEnv = new HashMap<>(); + } // Define the runnable to execute the CLI config command ICoreRunnable runnableServerConfig = monitor -> { @@ -66,7 +80,7 @@ public boolean performOk() { XrayServerConfigImpl.getInstance().getPassword(), XrayServerConfigImpl.getInstance().getAccessToken(), CliDriverWrapper.HOME_PATH.toFile(), - System.getenv() + configEnv ); } catch (Exception e) { CliDriverWrapper.getInstance().showCliError("An error occurred while setting up the server connection:", e); @@ -74,14 +88,15 @@ public boolean performOk() { }; // Schedule the CliJob to execute the runnable - CliJob.doSchedule("Setup Server Configuration", runnableServerConfig); - + CliJob.doSchedule("Setup Server Configuration and Perform Initial Scan", runnableServerConfig); + ComponentDetails[] componentsDetails = { ComponentIssueDetails.getInstance()}; for (ComponentDetails componentsDetail : componentsDetails) { if (componentsDetail != null) { componentsDetail.credentialsSet(); } } + return true; } diff --git a/bundle/src/main/java/com/jfrog/ide/eclipse/log/Logger.java b/bundle/src/main/java/com/jfrog/ide/eclipse/log/Logger.java index 5c10c03..fd2b919 100644 --- a/bundle/src/main/java/com/jfrog/ide/eclipse/log/Logger.java +++ b/bundle/src/main/java/com/jfrog/ide/eclipse/log/Logger.java @@ -12,6 +12,14 @@ public class Logger implements Log { private static Logger instance; private static ProblemsLogger viewLogger; private final String ID = "jfrog-eclipse-plugin"; + + public static final int DEBUG = 1; + public static final int INFO = 2; + public static final int WARN = 3; + public static final int ERROR = 4; + + //set default log level as INFO + private int logLevel = INFO; private Logger() { ilog = ResourcesPlugin.getPlugin().getLog(); @@ -23,16 +31,23 @@ public static Logger getInstance() { } return instance; } + + public void setLogLevel(int logLevel) { + this.logLevel = logLevel; + } + + public int getLogLevel() { + return logLevel; + } @Override public void debug(String message) { - ilog.log(new Status(Status.OK, ID, "[OK] " + message)); + log(DEBUG, Status.OK, "[DEBUG] ", message); } @Override public void error(String message) { - ilog.log(new Status(Status.ERROR, ID, "[ERROR] " + message)); - logToProblemsLogger(message, Status.ERROR); + log(ERROR, Status.ERROR, "[ERROR] ", message); } @Override @@ -43,14 +58,22 @@ public void error(String message, Throwable t) { @Override public void info(String message) { - ilog.log(new Status(Status.INFO, ID, "[INFO] " + message)); + log(INFO, Status.INFO, "[INFO] ", message); } @Override public void warn(String message) { - ilog.log(new Status(Status.WARNING, ID, "[WARN] " + message)); - logToProblemsLogger(message, Status.WARNING); + log(WARN, Status.WARNING, "[WARN] ", message); } + + private void log(int level, int status, String prefix, String message) { + if (logLevel <= level) { + ilog.log(new Status(status, ID, prefix + message)); + if (status == Status.WARNING || status == Status.ERROR) { + logToProblemsLogger(message, status); + } + } + } private void logToProblemsLogger(String message, int status) { if (viewLogger == 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 a6aad38..c4cd81f 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 @@ -21,6 +21,7 @@ import com.jfrog.ide.common.configuration.JfrogCliDriver; import com.jfrog.ide.common.parse.SarifParser; import com.jfrog.ide.eclipse.configuration.CliDriverWrapper; +import com.jfrog.ide.eclipse.configuration.PreferenceConstants; import com.jfrog.ide.eclipse.log.Logger; import com.jfrog.ide.eclipse.scheduling.CliJob; import com.jfrog.ide.eclipse.ui.issues.ComponentIssueDetails; @@ -63,29 +64,29 @@ public static ScanManager getInstance(){ public void startScan(Composite parent, boolean isDebugLogs) { Map auditEnvVars = new HashMap<>(); + // refresh projects list + projects = iworkspace.getRoot().getProjects(); + if (projects.length == 0) { + log.info("No projects to scan."); + return; + } + // If scan is in progress - do not perform another scan if (isScanInProgress()) { log.info("Previous scan still running..."); return; } - scanInProgress.compareAndSet(false, true); + scanInProgress.set(true); resetIssuesView(IssuesTree.getInstance()); ScanCache.getInstance().resetCache(); - - // refresh projects list - projects = iworkspace.getRoot().getProjects(); - if (projects.length == 0) { - log.info("No projects to scan."); - } if (isDebugLogs) { - auditEnvVars.put("JFROG_CLI_LOG_LEVEL", "DEBUG"); - auditEnvVars.put("CI", "true"); + auditEnvVars = PreferenceConstants.getCliDebugLogsEnvVars(); } for (IProject project : projects) { - scanAndUpdateResults(IssuesTree.getInstance(), parent, isDebugLogs, project, auditEnvVars); + scanAndUpdateResults(IssuesTree.getInstance(), parent, project, auditEnvVars); } } @@ -126,12 +127,11 @@ 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 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 isDebugLogs, IProject project, Map envVars) { - CliJob.doSchedule(String.format("Performing Scan: %s", project.getName()), new ScanRunnable(parent, issuesTree, isDebugLogs, project, envVars)); + public void scanAndUpdateResults(IssuesTree issuesTree, Composite parent, IProject project, Map envVars) { + CliJob.doSchedule(String.format("Performing Scan: %s", project.getName()), new ScanRunnable(parent, issuesTree, project, envVars)); } /** @@ -142,20 +142,20 @@ private class ScanRunnable implements ICoreRunnable { private Composite parent; private IProject project; private Map envVars; - private boolean isDebugLogs; - private ScanRunnable(Composite parent, IssuesTree issuesTree, boolean isDebugLogs, IProject project, Map envVars) { + private ScanRunnable(Composite parent, IssuesTree issuesTree, IProject project, Map envVars) { this.parent = parent; this.issuesTree = issuesTree; this.project = project; this.envVars = envVars; - this.isDebugLogs = isDebugLogs; + } @Override public void run(IProgressMonitor monitor) throws CoreException { ScanManager.this.monitor = monitor; + // if the parent process is disposed - do not run the scan if (isDisposed()) { return; } @@ -175,12 +175,9 @@ public void run(IProgressMonitor monitor) throws CoreException { checkCanceled(); log.info("Finished audit scan successfully.\n" + auditResults.getRes()); - if (isDebugLogs) { - log.debug(auditResults.getErr()); - } + log.debug(auditResults.getErr()); - // update scan cache - log.info("Updating scan cache."); + log.debug("Updating scan cache."); ScanCache.getInstance().updateScanResults(sarifParser.parse(auditResults.getRes())); // TODO: update issues tree From 8d7ec9fa1fbde8f0e5002a6e6e192aafdb35bf55 Mon Sep 17 00:00:00 2001 From: kerenr-jfrog Date: Sun, 6 Apr 2025 09:21:04 +0300 Subject: [PATCH 8/9] fix CR comments --- .../ide/eclipse/configuration/XrayGlobalConfiguration.java | 7 +------ 1 file changed, 1 insertion(+), 6 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 1867577..2cbaf45 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 @@ -16,12 +16,9 @@ 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.scheduling.CliJob; 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. * @@ -42,7 +39,6 @@ public void createFieldEditors() { StringFieldEditor passwordEditor = new StringFieldEditor(PreferenceConstants.XRAY_PASSWORD, "Password:", getFieldEditorParent()); passwordEditor.getTextControl(getFieldEditorParent()).setEchoChar('*'); - addField(urlEditor); addField(usernameEditor); @@ -88,7 +84,7 @@ public boolean performOk() { }; // Schedule the CliJob to execute the runnable - CliJob.doSchedule("Setup Server Configuration and Perform Initial Scan", runnableServerConfig); + CliJob.doSchedule("Setup Server Configuration", runnableServerConfig); ComponentDetails[] componentsDetails = { ComponentIssueDetails.getInstance()}; for (ComponentDetails componentsDetail : componentsDetails) { @@ -96,7 +92,6 @@ public boolean performOk() { componentsDetail.credentialsSet(); } } - return true; } From d4a458e65ce9b8134ca786191c7e40c5384147bd Mon Sep 17 00:00:00 2001 From: kerenr-jfrog Date: Sun, 6 Apr 2025 10:23:40 +0300 Subject: [PATCH 9/9] CR fixes --- .../configuration/PreferenceConstants.java | 1 - .../com/jfrog/ide/eclipse/log/Logger.java | 19 ++++++++++--------- 2 files changed, 10 insertions(+), 10 deletions(-) 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 c08ec71..962d99a 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 @@ -2,7 +2,6 @@ import java.util.HashMap; import java.util.Map; - /** * Constant definitions for plug-in preferences * diff --git a/bundle/src/main/java/com/jfrog/ide/eclipse/log/Logger.java b/bundle/src/main/java/com/jfrog/ide/eclipse/log/Logger.java index fd2b919..08eb7aa 100644 --- a/bundle/src/main/java/com/jfrog/ide/eclipse/log/Logger.java +++ b/bundle/src/main/java/com/jfrog/ide/eclipse/log/Logger.java @@ -19,7 +19,7 @@ public class Logger implements Log { public static final int ERROR = 4; //set default log level as INFO - private int logLevel = INFO; + private int minLogLevel = INFO; private Logger() { ilog = ResourcesPlugin.getPlugin().getLog(); @@ -33,11 +33,11 @@ public static Logger getInstance() { } public void setLogLevel(int logLevel) { - this.logLevel = logLevel; + this.minLogLevel = logLevel; } public int getLogLevel() { - return logLevel; + return minLogLevel; } @Override @@ -67,12 +67,13 @@ public void warn(String message) { } private void log(int level, int status, String prefix, String message) { - if (logLevel <= level) { - ilog.log(new Status(status, ID, prefix + message)); - if (status == Status.WARNING || status == Status.ERROR) { - logToProblemsLogger(message, status); - } - } + if (minLogLevel > level) { + return; + } + ilog.log(new Status(status, ID, prefix + message)); + if (status == Status.WARNING || status == Status.ERROR) { + logToProblemsLogger(message, status); + } } private void logToProblemsLogger(String message, int status) {