From b3eb2215d2d77083b3828d58c319077eec3bf5ca Mon Sep 17 00:00:00 2001 From: Ben Durrans Date: Fri, 7 Mar 2025 09:55:44 +0000 Subject: [PATCH 1/4] fix: open/ignored issue filtering --- CHANGELOG.md | 4 ++++ .../plugin/views/snyktoolview/filters/BaseFilter.java | 2 +- .../filters/IgnoresIgnoredIssuesFilter.java | 4 ++-- .../snyktoolview/filters/IgnoresOpenIssuesFilter.java | 10 +++++----- .../java/io/snyk/languageserver/SnykIssueCache.java | 4 ++-- 5 files changed, 14 insertions(+), 10 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ebfd00c5..f7a16554 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ # Snyk Security Changelog +## [3.1.1] +### Fixes +- fixes open & ignored issue filtering + ## [3.1.0] ### Changes - add option for using a folder as reference instead of a branch in net-new scanning diff --git a/plugin/src/main/java/io/snyk/eclipse/plugin/views/snyktoolview/filters/BaseFilter.java b/plugin/src/main/java/io/snyk/eclipse/plugin/views/snyktoolview/filters/BaseFilter.java index 19a8cfd6..a38e3b2e 100644 --- a/plugin/src/main/java/io/snyk/eclipse/plugin/views/snyktoolview/filters/BaseFilter.java +++ b/plugin/src/main/java/io/snyk/eclipse/plugin/views/snyktoolview/filters/BaseFilter.java @@ -28,4 +28,4 @@ public void applyFilter() { this.filterManager.addTreeFilter(this.filterName, predicate); } } -} \ No newline at end of file +} diff --git a/plugin/src/main/java/io/snyk/eclipse/plugin/views/snyktoolview/filters/IgnoresIgnoredIssuesFilter.java b/plugin/src/main/java/io/snyk/eclipse/plugin/views/snyktoolview/filters/IgnoresIgnoredIssuesFilter.java index dfabde5f..7368b090 100644 --- a/plugin/src/main/java/io/snyk/eclipse/plugin/views/snyktoolview/filters/IgnoresIgnoredIssuesFilter.java +++ b/plugin/src/main/java/io/snyk/eclipse/plugin/views/snyktoolview/filters/IgnoresIgnoredIssuesFilter.java @@ -8,10 +8,10 @@ import io.snyk.languageserver.protocolextension.messageObjects.scanResults.Issue; public class IgnoresIgnoredIssuesFilter extends BaseFilter { - private static final Predicate predicate = issue -> issue.isIgnored(); + private static final Predicate predicate = issue -> !issue.isIgnored(); public IgnoresIgnoredIssuesFilter(TreeFilterManager tfm) { super(FILTER_IGNORES_SHOW_IGNORED_ISSUES, predicate, tfm); } -} \ No newline at end of file +} diff --git a/plugin/src/main/java/io/snyk/eclipse/plugin/views/snyktoolview/filters/IgnoresOpenIssuesFilter.java b/plugin/src/main/java/io/snyk/eclipse/plugin/views/snyktoolview/filters/IgnoresOpenIssuesFilter.java index 2efe86a7..50cf7d70 100644 --- a/plugin/src/main/java/io/snyk/eclipse/plugin/views/snyktoolview/filters/IgnoresOpenIssuesFilter.java +++ b/plugin/src/main/java/io/snyk/eclipse/plugin/views/snyktoolview/filters/IgnoresOpenIssuesFilter.java @@ -1,16 +1,16 @@ package io.snyk.eclipse.plugin.views.snyktoolview.filters; -import static io.snyk.eclipse.plugin.preferences.Preferences.FILTER_IGNORES_SHOW_IGNORED_ISSUES; +import static io.snyk.eclipse.plugin.preferences.Preferences.FILTER_IGNORES_SHOW_OPEN_ISSUES; import java.util.function.Predicate; import io.snyk.eclipse.plugin.views.snyktoolview.TreeFilterManager; import io.snyk.languageserver.protocolextension.messageObjects.scanResults.Issue; -public class IgnoresOpenIssuesFilter extends BaseFilter { - private static final Predicate predicate = issue -> !issue.isIgnored(); +public class IgnoresOpenIssuesFilter extends BaseFilter { + private static final Predicate predicate = issue -> issue.isIgnored(); public IgnoresOpenIssuesFilter(TreeFilterManager tfm) { - super(FILTER_IGNORES_SHOW_IGNORED_ISSUES, predicate, tfm); + super(FILTER_IGNORES_SHOW_OPEN_ISSUES, predicate, tfm); } -} \ No newline at end of file +} diff --git a/plugin/src/main/java/io/snyk/languageserver/SnykIssueCache.java b/plugin/src/main/java/io/snyk/languageserver/SnykIssueCache.java index 7a7285bb..4754539e 100644 --- a/plugin/src/main/java/io/snyk/languageserver/SnykIssueCache.java +++ b/plugin/src/main/java/io/snyk/languageserver/SnykIssueCache.java @@ -56,8 +56,8 @@ public void clearAll() { * @param path The file path for which issues should be removed */ public void removeAllIssuesForPath(String path) { - codeSecurityIssues.clear(); - codeQualityIssues.clear(); + codeSecurityIssues.remove(path); + codeQualityIssues.remove(path); ossIssues.remove(path); iacIssues.remove(path); } From 8076339b8badf99ec4cef2e0fb29826f7323814f Mon Sep 17 00:00:00 2001 From: Ben Durrans Date: Mon, 10 Mar 2025 09:36:55 +0000 Subject: [PATCH 2/4] fix: Correct CHANGELOG version --- CHANGELOG.md | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f7a16554..6dc92f51 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,15 +1,14 @@ # Snyk Security Changelog -## [3.1.1] -### Fixes -- fixes open & ignored issue filtering - ## [3.1.0] ### Changes - add option for using a folder as reference instead of a branch in net-new scanning - add scan summary to custom UI, updating scan statuses live - added support for DeepCode AI Fixes +### Fixes +- fixes open & ignored issue filtering toggles + ## [3.0.0] ### Changes - process api URL from hasAuthenticated message From 66de784c2b6fe640d034f50748124961fc30417c Mon Sep 17 00:00:00 2001 From: Ben Durrans Date: Mon, 10 Mar 2025 15:45:29 +0000 Subject: [PATCH 3/4] chore: invert filter predicate logic The previous logic was sound but confusing to follow, this makes more sense (hopefully) --- .../eclipse/plugin/views/snyktoolview/TreeViewerFilter.java | 2 +- .../plugin/views/snyktoolview/filters/BaseFilter.java | 4 ++-- .../plugin/views/snyktoolview/filters/FixableFilter.java | 6 ++++-- .../snyktoolview/filters/IgnoresIgnoredIssuesFilter.java | 2 +- .../views/snyktoolview/filters/IgnoresOpenIssuesFilter.java | 2 +- .../plugin/views/snyktoolview/filters/ProductFilter.java | 4 ++-- .../plugin/views/snyktoolview/filters/SeverityFilter.java | 6 +++--- 7 files changed, 14 insertions(+), 12 deletions(-) diff --git a/plugin/src/main/java/io/snyk/eclipse/plugin/views/snyktoolview/TreeViewerFilter.java b/plugin/src/main/java/io/snyk/eclipse/plugin/views/snyktoolview/TreeViewerFilter.java index f520040d..bedc688f 100644 --- a/plugin/src/main/java/io/snyk/eclipse/plugin/views/snyktoolview/TreeViewerFilter.java +++ b/plugin/src/main/java/io/snyk/eclipse/plugin/views/snyktoolview/TreeViewerFilter.java @@ -48,7 +48,7 @@ private boolean isIssueVisible(IssueTreeNode issueNode) { } for (var filter : this.filters.values()) { - if (!filter.test(issue)) { + if (filter.test(issue)) { return false; } } diff --git a/plugin/src/main/java/io/snyk/eclipse/plugin/views/snyktoolview/filters/BaseFilter.java b/plugin/src/main/java/io/snyk/eclipse/plugin/views/snyktoolview/filters/BaseFilter.java index a38e3b2e..faff404e 100644 --- a/plugin/src/main/java/io/snyk/eclipse/plugin/views/snyktoolview/filters/BaseFilter.java +++ b/plugin/src/main/java/io/snyk/eclipse/plugin/views/snyktoolview/filters/BaseFilter.java @@ -23,9 +23,9 @@ public void applyFilter() { boolean booleanPref = this.preferences.getBooleanPref(this.filterName); if (booleanPref) { - this.filterManager.removeTreeFilter(this.filterName); + this.filterManager.removeTreeFilter(this.filterName); // Showing "a thing" removes it from being filtered out. } else { - this.filterManager.addTreeFilter(this.filterName, predicate); + this.filterManager.addTreeFilter(this.filterName, predicate); // Hiding (unchecking) "a thing" adds a filter to filter it out. } } } diff --git a/plugin/src/main/java/io/snyk/eclipse/plugin/views/snyktoolview/filters/FixableFilter.java b/plugin/src/main/java/io/snyk/eclipse/plugin/views/snyktoolview/filters/FixableFilter.java index 4145be73..2656bdec 100644 --- a/plugin/src/main/java/io/snyk/eclipse/plugin/views/snyktoolview/filters/FixableFilter.java +++ b/plugin/src/main/java/io/snyk/eclipse/plugin/views/snyktoolview/filters/FixableFilter.java @@ -8,7 +8,7 @@ import io.snyk.languageserver.protocolextension.messageObjects.scanResults.Issue; public class FixableFilter extends BaseFilter { - private static final Predicate predicate = issue -> issue.hasFix(); + private static final Predicate predicate = issue -> !issue.hasFix(); // Inverse predicate, see below. public FixableFilter(TreeFilterManager tfm) { super(FILTER_SHOW_ONLY_FIXABLE, predicate, tfm); @@ -16,7 +16,9 @@ public FixableFilter(TreeFilterManager tfm) { @Override public void applyFilter() { - // this is inverse to the other filters, so we need to overwrite the BaseFilter logic + // This is inverse to the other filters, so we need to overwrite the BaseFilter logic. + // Deselecting show fixable issues should not hide fixable issues and show all issues. + // Therefore when deactivated we cannot have a filter added, so the logic is flipped. boolean booleanPref = preferences.getBooleanPref(this.filterName); if (booleanPref) { diff --git a/plugin/src/main/java/io/snyk/eclipse/plugin/views/snyktoolview/filters/IgnoresIgnoredIssuesFilter.java b/plugin/src/main/java/io/snyk/eclipse/plugin/views/snyktoolview/filters/IgnoresIgnoredIssuesFilter.java index 7368b090..24de654c 100644 --- a/plugin/src/main/java/io/snyk/eclipse/plugin/views/snyktoolview/filters/IgnoresIgnoredIssuesFilter.java +++ b/plugin/src/main/java/io/snyk/eclipse/plugin/views/snyktoolview/filters/IgnoresIgnoredIssuesFilter.java @@ -8,7 +8,7 @@ import io.snyk.languageserver.protocolextension.messageObjects.scanResults.Issue; public class IgnoresIgnoredIssuesFilter extends BaseFilter { - private static final Predicate predicate = issue -> !issue.isIgnored(); + private static final Predicate predicate = issue -> issue.isIgnored(); public IgnoresIgnoredIssuesFilter(TreeFilterManager tfm) { super(FILTER_IGNORES_SHOW_IGNORED_ISSUES, predicate, tfm); diff --git a/plugin/src/main/java/io/snyk/eclipse/plugin/views/snyktoolview/filters/IgnoresOpenIssuesFilter.java b/plugin/src/main/java/io/snyk/eclipse/plugin/views/snyktoolview/filters/IgnoresOpenIssuesFilter.java index 50cf7d70..e72db00a 100644 --- a/plugin/src/main/java/io/snyk/eclipse/plugin/views/snyktoolview/filters/IgnoresOpenIssuesFilter.java +++ b/plugin/src/main/java/io/snyk/eclipse/plugin/views/snyktoolview/filters/IgnoresOpenIssuesFilter.java @@ -8,7 +8,7 @@ import io.snyk.languageserver.protocolextension.messageObjects.scanResults.Issue; public class IgnoresOpenIssuesFilter extends BaseFilter { - private static final Predicate predicate = issue -> issue.isIgnored(); + private static final Predicate predicate = issue -> !issue.isIgnored(); public IgnoresOpenIssuesFilter(TreeFilterManager tfm) { super(FILTER_IGNORES_SHOW_OPEN_ISSUES, predicate, tfm); diff --git a/plugin/src/main/java/io/snyk/eclipse/plugin/views/snyktoolview/filters/ProductFilter.java b/plugin/src/main/java/io/snyk/eclipse/plugin/views/snyktoolview/filters/ProductFilter.java index 403d892b..12aeb04f 100644 --- a/plugin/src/main/java/io/snyk/eclipse/plugin/views/snyktoolview/filters/ProductFilter.java +++ b/plugin/src/main/java/io/snyk/eclipse/plugin/views/snyktoolview/filters/ProductFilter.java @@ -22,7 +22,7 @@ public ProductFilter(TreeFilterManager tfm, String filterName) { @SuppressWarnings("rawtypes") private static Predicate getPredicate(String filterName) { String filterableIssueType = preferenceToProductConstants.get(filterName); - Predicate predicate = issue -> !issue.filterableIssueType().equals(filterableIssueType); + Predicate predicate = issue -> issue.filterableIssueType().equals(filterableIssueType); return predicate; } -} \ No newline at end of file +} diff --git a/plugin/src/main/java/io/snyk/eclipse/plugin/views/snyktoolview/filters/SeverityFilter.java b/plugin/src/main/java/io/snyk/eclipse/plugin/views/snyktoolview/filters/SeverityFilter.java index 3aad9fc7..d95c2b0c 100644 --- a/plugin/src/main/java/io/snyk/eclipse/plugin/views/snyktoolview/filters/SeverityFilter.java +++ b/plugin/src/main/java/io/snyk/eclipse/plugin/views/snyktoolview/filters/SeverityFilter.java @@ -21,7 +21,7 @@ public SeverityFilter(TreeFilterManager tfm, String preferenceKey) { @SuppressWarnings("rawtypes") private static Predicate getPredicate(String preferenceKey) { String severityCondition = preferenceToProductConstants.get(preferenceKey); - Predicate predicate = issue -> !issue.severity().equals(severityCondition); + Predicate predicate = issue -> issue.severity().equals(severityCondition); return predicate; - } -} \ No newline at end of file + } +} From 4598c42ed347302264fb650d15b6f099a0ec9fbc Mon Sep 17 00:00:00 2001 From: Ben Durrans Date: Mon, 10 Mar 2025 16:20:13 +0000 Subject: [PATCH 4/4] fix: tests for predicate filters Also make `testRemoveFilterPredicate` actually test something. --- .../snyktoolview/TreeViewerFilterTest.java | 20 +++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/tests/src/test/java/io/snyk/eclipse/plugin/views/snyktoolview/TreeViewerFilterTest.java b/tests/src/test/java/io/snyk/eclipse/plugin/views/snyktoolview/TreeViewerFilterTest.java index b58f6a4e..bee47d61 100644 --- a/tests/src/test/java/io/snyk/eclipse/plugin/views/snyktoolview/TreeViewerFilterTest.java +++ b/tests/src/test/java/io/snyk/eclipse/plugin/views/snyktoolview/TreeViewerFilterTest.java @@ -43,10 +43,10 @@ void testSelect_IssueTreeNodeWithMatchingFilter() { Issue issue = mock(Issue.class); when(issueNode.getIssue()).thenReturn(issue); - Predicate predicate = i -> true; // Always matches + Predicate predicate = i -> true; // Always matches, so filtered out. filter.putFilterPredicate("test", predicate); - assertTrue(filter.select(mockViewer, null, issueNode)); + assertFalse(filter.select(mockViewer, null, issueNode)); } @Test @@ -55,10 +55,10 @@ void testSelect_IssueTreeNodeWithNonMatchingFilter() { Issue issue = mock(Issue.class); when(issueNode.getIssue()).thenReturn(issue); - Predicate predicate = i -> false; // Never matches + Predicate predicate = i -> false; // Never matches, so not filtered out. filter.putFilterPredicate("test", predicate); - assertFalse(filter.select(mockViewer, null, issueNode)); + assertTrue(filter.select(mockViewer, null, issueNode)); } @Test @@ -85,13 +85,17 @@ void testSelect_FileTreeNodeWithNoVisibleChildren() { @Test void testRemoveFilterPredicate() { - Predicate predicate = i -> false; + IssueTreeNode issueNode = mock(IssueTreeNode.class); + Issue issue = mock(Issue.class); + when(issueNode.getIssue()).thenReturn(issue); + + Predicate predicate = i -> true; // Always matches, so filtered out. filter.putFilterPredicate("test", predicate); - assertTrue(filter.select(mockViewer, null, mock(IssueTreeNode.class))); + assertFalse(filter.select(mockViewer, null, issueNode)); filter.removeFilterPredicate("test"); - assertTrue(filter.select(mockViewer, null, mock(IssueTreeNode.class))); + assertTrue(filter.select(mockViewer, null, issueNode)); } -} \ No newline at end of file +}