diff --git a/bundle/icons/.gitignore b/bundle/icons/.gitignore
new file mode 100644
index 0000000..e69de29
diff --git a/bundle/icons/critical.png b/bundle/icons/critical.png
index 9e61d5c..8e91153 100644
Binary files a/bundle/icons/critical.png and b/bundle/icons/critical.png differ
diff --git a/bundle/icons/criticalnotapplic.png b/bundle/icons/criticalnotapplic.png
new file mode 100644
index 0000000..5787fa9
Binary files /dev/null and b/bundle/icons/criticalnotapplic.png differ
diff --git a/bundle/icons/high.png b/bundle/icons/high.png
index 14dfcb9..be7fe53 100755
Binary files a/bundle/icons/high.png and b/bundle/icons/high.png differ
diff --git a/bundle/icons/highnotapplic.png b/bundle/icons/highnotapplic.png
new file mode 100644
index 0000000..4336456
Binary files /dev/null and b/bundle/icons/highnotapplic.png differ
diff --git a/bundle/icons/low.png b/bundle/icons/low.png
index d35134d..c33f959 100755
Binary files a/bundle/icons/low.png and b/bundle/icons/low.png differ
diff --git a/bundle/icons/lownotapplic.png b/bundle/icons/lownotapplic.png
new file mode 100644
index 0000000..216c97d
Binary files /dev/null and b/bundle/icons/lownotapplic.png differ
diff --git a/bundle/icons/medium.png b/bundle/icons/medium.png
index 05c75df..940053a 100755
Binary files a/bundle/icons/medium.png and b/bundle/icons/medium.png differ
diff --git a/bundle/icons/mediumnotapplic.png b/bundle/icons/mediumnotapplic.png
new file mode 100644
index 0000000..e7a941e
Binary files /dev/null and b/bundle/icons/mediumnotapplic.png differ
diff --git a/bundle/icons/unknown.png b/bundle/icons/unknown.png
old mode 100755
new mode 100644
index ea57326..2014d4d
Binary files a/bundle/icons/unknown.png and b/bundle/icons/unknown.png differ
diff --git a/bundle/icons/unknownnotapplic.png b/bundle/icons/unknownnotapplic.png
new file mode 100644
index 0000000..763d0a2
Binary files /dev/null and b/bundle/icons/unknownnotapplic.png differ
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/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/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..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
@@ -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,11 +44,14 @@ 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
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;
@@ -56,7 +65,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..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();
@@ -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,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/ScanCache.java b/bundle/src/main/java/com/jfrog/ide/eclipse/scan/ScanCache.java
new file mode 100644
index 0000000..d79b3f2
--- /dev/null
+++ b/bundle/src/main/java/com/jfrog/ide/eclipse/scan/ScanCache.java
@@ -0,0 +1,42 @@
+package com.jfrog.ide.eclipse.scan;
+
+import java.util.ArrayList;
+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;
+
+ 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 73723ab..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
@@ -1,65 +1,117 @@
package com.jfrog.ide.eclipse.scan;
+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.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;
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.core.runtime.jobs.Job;
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;
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.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.CliDriverWrapper;
import com.jfrog.ide.eclipse.configuration.XrayServerConfigImpl;
import com.jfrog.ide.eclipse.log.Logger;
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;
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 IProgressMonitor monitor;
- IProject project;
- Log log;
- JfrogCliDriver cliDriver;
+ private static ScanManager instance;
+ 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 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 +119,109 @@ 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) {
- ScanJob.doSchedule(project.getName(), new ScanRunnable(parent, issuesTree, quickScan));
+ 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));
}
/**
- * 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()));
+
+ // 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
+ }
+ });
+ }
- 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();
}
+
}
-
}
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/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/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();
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..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
@@ -1,15 +1,21 @@
package com.jfrog.ide.eclipse.ui;
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.swing.tree.TreeNode;
+
import org.eclipse.jface.viewers.ITreeContentProvider;
-import org.jfrog.build.extractor.scan.DependencyTree;
+import com.jfrog.ide.common.nodes.FileIssueNode;
+import com.jfrog.ide.common.nodes.FileTreeNode;
/**
* 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 +24,36 @@ 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();
+ 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();
+ }
+ if (element instanceof FileIssueNode) {
+ return ((FileIssueNode) element).getParent();
+ }
+ return null;
}
@Override
public boolean hasChildren(Object element) {
- return !((DependencyTree) element).isLeaf();
+ 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 c51272c..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,9 +17,10 @@
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;
+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 = new ArrayList();
public SearchableTree(Composite parent, ColumnLabelProvider labelProvider) {
super(parent, true);
@@ -62,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();
@@ -86,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;
@@ -106,11 +110,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/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());
+ }
}
+
}
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 589654d..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,14 +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;
@@ -19,8 +22,6 @@
public class IssuesTree extends SearchableTree {
private static IssuesTree instance;
-
- private DependencyTree root = new DependencyTree();
private ComponentIssueTable componentIssueTable;
private TreeViewerColumn issuesCountColumn;
@@ -34,12 +35,13 @@ public static IssuesTree getInstance() {
private IssuesTree(Composite parent) {
super(parent, new IssuesTreeColumnLabelProvider());
- issuesCountColumn = createColumn("Issues (0)", new IssueCountColumnLabelProvider(this), SWT.RIGHT, 0);
- applyFiltersForAllProjects();
+ 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());
}
@@ -50,38 +52,38 @@ 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
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() {
@@ -89,4 +91,8 @@ public static void disposeTree() {
instance.dispose();
}
}
+
+ private void showScanResults() {
+
+ }
}
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());
}
}