diff --git a/bundle/icons/critical.png b/bundle/icons/critical.png index 9e61d5c..302b300 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..7f32696 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..4f99c4b 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..8284d6c 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 index ea57326..2014d4d 100755 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/src/main/java/com/jfrog/ide/eclipse/scan/ScanManager.java b/bundle/src/main/java/com/jfrog/ide/eclipse/scan/ScanManager.java index c4cd81f..508dacc 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,8 +1,6 @@ package com.jfrog.ide.eclipse.scan; 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; @@ -32,7 +30,6 @@ * @author yahavi */ public class ScanManager { - static final Path HOME_PATH = Paths.get(System.getProperty("user.home"), ".jfrog-eclipse-plugin"); private static ScanManager instance; private IProgressMonitor monitor; private IWorkspace iworkspace; @@ -177,10 +174,18 @@ public void run(IProgressMonitor monitor) throws CoreException { log.info("Finished audit scan successfully.\n" + auditResults.getRes()); log.debug(auditResults.getErr()); - log.debug("Updating scan cache."); - ScanCache.getInstance().updateScanResults(sarifParser.parse(auditResults.getRes())); - - // TODO: update issues tree + log.debug("Updating scan results in UI."); + issuesTree.addScanResults(sarifParser.parse(auditResults.getRes())); + // update the issues tree in the UI with the scan results + parent.getDisplay().syncExec(new Runnable() { + @Override + public void run() { + if (monitor.isCanceled()) { + return; + } + issuesTree.showResultsOnTree(); + } + }); } } catch (CancellationException ce) { log.info(ce.getMessage()); 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..a0b99a1 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,7 +1,12 @@ package com.jfrog.ide.eclipse.ui; +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. @@ -9,7 +14,6 @@ * @author yahavi */ public class ScanTreeContentProvider implements ITreeContentProvider { - private static final DependencyTree[] EMPTY_NODE = new DependencyTree[0]; @Override public Object[] getElements(Object element) { @@ -18,16 +22,38 @@ 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) { + List elementList = (List) element; + // Verify the element is a List of FileTreeNode, then return its elements + if(!elementList.isEmpty() && elementList.get(0) instanceof FileTreeNode) { + return elementList.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..a5be9a1 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; @@ -19,6 +20,7 @@ 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.utils.ProjectsMap; /** @@ -28,9 +30,9 @@ */ public abstract class SearchableTree extends FilteredTree { - protected ProjectsMap projects = new ProjectsMap(); - protected ComponentDetails componentDetails; private TreeColumnLayout treeLayout = new TreeColumnLayout(); + protected ComponentDetails componentDetails; + protected List scanResults = new ArrayList(); public SearchableTree(Composite parent, ColumnLabelProvider labelProvider) { super(parent, true); @@ -106,14 +108,16 @@ public void expandAll() { } public void reset() { - projects.clear(); + scanResults.clear(); } - public void addScanResults(String projectName, DependencyTree dependencyTree) { - projects.put(projectName, dependencyTree); + public void addScanResults(List results) { + scanResults.addAll(results); + } + + public void showResultsOnTree() { + treeViewer.setInput(scanResults); } - - public abstract void applyFilters(ProjectsMap.ProjectKey projectName); public abstract void applyFiltersForAllProjects(); } diff --git a/bundle/src/main/java/com/jfrog/ide/eclipse/ui/XrayScanToolbar.java b/bundle/src/main/java/com/jfrog/ide/eclipse/ui/XrayScanToolbar.java index d13e5f1..01a6c59 100644 --- a/bundle/src/main/java/com/jfrog/ide/eclipse/ui/XrayScanToolbar.java +++ b/bundle/src/main/java/com/jfrog/ide/eclipse/ui/XrayScanToolbar.java @@ -3,6 +3,8 @@ import org.eclipse.swt.SWT; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.ToolBar; +import org.eclipse.swt.widgets.ToolItem; + import com.jfrog.ide.eclipse.ui.actions.CollapseAll; import com.jfrog.ide.eclipse.ui.actions.ExpandAll; import com.jfrog.ide.eclipse.ui.actions.Filter; @@ -14,18 +16,25 @@ public class XrayScanToolbar extends Panel { private Filter filter; + private final int SPACER_WIDTH = 20; public XrayScanToolbar(Composite parent) { super(parent); ToolBar toolBar = new ToolBar(this, SWT.NONE); new Refresh(toolBar); + createSeparator(toolBar, SPACER_WIDTH); new CollapseAll(toolBar); + createSeparator(toolBar, SPACER_WIDTH); new ExpandAll(toolBar); - filter = new Filter(toolBar); toolBar.pack(); } public void setFilterType(Filter.FilterType filterType) { filter.setFilterType(filterType); } + + private void createSeparator(ToolBar toolBar, int width) { + ToolItem sep = new ToolItem(toolBar, SWT.SEPARATOR); + sep.setWidth(width); + } } 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..771f35c 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 @@ -5,7 +5,8 @@ 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 +23,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..a8300c4 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,6 +1,6 @@ package com.jfrog.ide.eclipse.ui.issues; -import java.util.Map.Entry; +import java.util.ArrayList; import org.eclipse.jface.viewers.TreeViewerColumn; import org.eclipse.swt.SWT; @@ -8,10 +8,8 @@ import org.jfrog.build.extractor.scan.DependencyTree; import com.google.common.collect.Lists; -import com.jfrog.ide.common.filter.FilterManager; -import com.jfrog.ide.eclipse.ui.FilterManagerSingleton; +import com.jfrog.ide.common.nodes.FileTreeNode; import com.jfrog.ide.eclipse.ui.SearchableTree; -import com.jfrog.ide.eclipse.utils.ProjectsMap.ProjectKey; /** * @author yahavi @@ -19,8 +17,6 @@ public class IssuesTree extends SearchableTree { private static IssuesTree instance; - - private DependencyTree root = new DependencyTree(); private ComponentIssueTable componentIssueTable; private TreeViewerColumn issuesCountColumn; @@ -34,8 +30,7 @@ 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); } @Override @@ -48,40 +43,16 @@ public void setComponentIssueTable(ComponentIssueTable componentIssueTable) { this.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 + ")"); - } - } - @Override public void applyFiltersForAllProjects() { - 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() { 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..1ef37cd 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,12 @@ 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 com.jfrog.ide.common.nodes.subentities.Severity; + +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.parse.Applicability; import com.jfrog.ide.eclipse.ui.IconManager; /** @@ -15,8 +19,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()); } }