Skip to content

Commit 16c5cf2

Browse files
ackeShawkyZ
andcommitted
feat: filters for severity and ignores
Co-authored-by: Abdelrahman Shawki Hassan <shawki.hassan@snyk.io>
1 parent 9302af7 commit 16c5cf2

20 files changed

Lines changed: 419 additions & 118 deletions

plugin/plugin.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -141,7 +141,7 @@
141141
name="Ignored Issues">
142142
</command>
143143
<command
144-
defaultHandler="io.snyk.eclipse.plugin.views.snyktoolview.handlers.snykFilterFixableIssuesHandler"
144+
defaultHandler="io.snyk.eclipse.plugin.views.snyktoolview.handlers.FilterFixableIssuesHandler"
145145
id="io.snyk.eclipse.plugin.commands.snykFilterFixableIssues"
146146
name="AI Fixable">
147147
</command>
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
package io.snyk.eclipse.plugin.views.snyktoolview;
2+
3+
import java.util.function.Predicate;
4+
5+
import org.eclipse.jface.viewers.TreeViewer;
6+
7+
import io.snyk.eclipse.plugin.SnykStartup;
8+
import io.snyk.eclipse.plugin.properties.preferences.Preferences;
9+
import io.snyk.languageserver.protocolextension.messageObjects.scanResults.Issue;
10+
11+
public class TreeFilterManager {
12+
13+
private TreeViewer treeView;
14+
private TreeViewerFilter filter;
15+
private static TreeFilterManager filterManager;
16+
17+
public synchronized static TreeFilterManager getInstance() {
18+
if (filterManager != null) {
19+
return filterManager;
20+
}
21+
filterManager = new TreeFilterManager();
22+
setupFilters();
23+
return filterManager;
24+
}
25+
26+
private static void setupFilters() {
27+
String filterFixableIssues = Preferences.FILTER_FIXABLE_ISSUES;
28+
boolean booleanPref = Preferences.getInstance().getBooleanPref(Preferences.FILTER_FIXABLE_ISSUES);
29+
30+
TreeFilterManager filterManager = TreeFilterManager.getInstance();
31+
32+
if (booleanPref) {
33+
filterManager.addTreeFilter(filterFixableIssues, issue -> issue.hasFix());
34+
}
35+
}
36+
37+
private TreeFilterManager() {
38+
treeView = SnykStartup.getView().getTreeViewer();
39+
filter = new TreeViewerFilter();
40+
}
41+
42+
public void addTreeFilter(String filterName, Predicate<? super Issue> filterPredicate) {
43+
filter.setFilterPredicate(filterName, filterPredicate);
44+
treeView.addFilter(filter);
45+
updateTree(treeView);
46+
}
47+
48+
public void removeTreeFilter(String filterName) {
49+
filter.removeFilterPredicate(filterName);
50+
treeView.addFilter(filter);
51+
updateTree(treeView);
52+
}
53+
54+
public void removeTreeFilters() {
55+
treeView.resetFilters();
56+
updateTree(treeView);
57+
}
58+
59+
private void updateTree(TreeViewer treeView) {
60+
treeView.getControl().setRedraw(false);
61+
treeView.refresh();
62+
treeView.getControl().setRedraw(true);
63+
}
64+
65+
}
Lines changed: 26 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1,55 +1,48 @@
11
package io.snyk.eclipse.plugin.views.snyktoolview;
22

3-
import java.util.ArrayList;
4-
import java.util.List;
3+
import java.util.Map;
4+
import java.util.concurrent.ConcurrentHashMap;
5+
import java.util.function.Predicate;
56

6-
import org.eclipse.jface.viewers.ILabelProvider;
77
import org.eclipse.jface.viewers.TreeViewer;
88
import org.eclipse.jface.viewers.Viewer;
99
import org.eclipse.jface.viewers.ViewerFilter;
1010

11+
import io.snyk.languageserver.protocolextension.messageObjects.scanResults.Issue;
12+
1113
public class TreeViewerFilter extends ViewerFilter {
12-
private List<String> searchStrings;
13-
private boolean matchAll; // If true, all filters must match; if false, any filter can match
14+
private Map<String, Predicate<? super Issue>> filters;
1415

1516
public TreeViewerFilter() {
16-
this.searchStrings = new ArrayList<>();
17-
this.matchAll = true; // Default to matching all filters
18-
}
19-
20-
public void addSearchText(String s) {
21-
if (s != null && !s.isEmpty()) {
22-
this.searchStrings.add(".*" + s.toLowerCase() + ".*");
23-
}
24-
}
25-
26-
public void clearSearchText() {
27-
this.searchStrings.clear();
28-
}
29-
30-
public void setMatchAll(boolean matchAll) {
31-
this.matchAll = matchAll;
17+
filters = new ConcurrentHashMap<>();
3218
}
3319

3420
@Override
3521
public boolean select(Viewer viewer, Object parentElement, Object element) {
36-
if (searchStrings.isEmpty()) {
22+
if (!(element instanceof IssueTreeNode) || !(viewer instanceof TreeViewer))
3723
return true;
38-
}
3924

40-
TreeViewer treeViewer = (TreeViewer) viewer;
41-
String label = ((ILabelProvider) treeViewer.getLabelProvider()).getText(element);
25+
IssueTreeNode IssueTreeNode = (IssueTreeNode) element;
26+
var issue = IssueTreeNode.getIssue();
27+
if (issue == null) {
28+
return true;
29+
}
4230

43-
if (label == null) {
44-
return false;
31+
for (var kv : this.filters.entrySet()) {
32+
var filter = kv.getValue();
33+
if (!filter.test(issue)) {
34+
return false;
35+
}
4536
}
37+
return true;
38+
}
4639

47-
String labelLower = label.toLowerCase();
40+
public void setFilterPredicate(String filterName, Predicate<? super Issue> predicate) {
41+
this.filters.put(filterName, predicate);
42+
}
4843

49-
if (matchAll) {
50-
return searchStrings.stream().allMatch(s -> labelLower.matches(s));
51-
} else {
52-
return searchStrings.stream().anyMatch(s -> labelLower.matches(s));
53-
}
44+
public void removeFilterPredicate(String filterName) {
45+
this.filters.remove(filterName);
5446
}
47+
5548
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package io.snyk.eclipse.plugin.views.snyktoolview.filters;
2+
3+
public interface BaseFilter {
4+
public void applyFilter();
5+
}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package io.snyk.eclipse.plugin.views.snyktoolview.filters;
2+
3+
import io.snyk.eclipse.plugin.properties.preferences.Preferences;
4+
import io.snyk.eclipse.plugin.views.snyktoolview.TreeFilterManager;
5+
6+
public class FixableFilter implements BaseFilter {
7+
private TreeFilterManager filterManager;
8+
private Preferences preferences;
9+
private String preferenceKey;
10+
11+
public FixableFilter(TreeFilterManager filterManager, Preferences preferences, String preferenceKey) {
12+
this.filterManager = filterManager;
13+
this.preferences = preferences;
14+
this.preferenceKey = preferenceKey;
15+
16+
}
17+
18+
@Override
19+
public void applyFilter() {
20+
boolean booleanPref = this.preferences.getBooleanPref(Preferences.FILTER_FIXABLE_ISSUES);
21+
22+
if (booleanPref) {
23+
this.filterManager.addTreeFilter(this.preferenceKey, issue -> issue.hasFix());
24+
} else {
25+
this.filterManager.removeTreeFilter(this.preferenceKey);
26+
}
27+
28+
}
29+
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package io.snyk.eclipse.plugin.views.snyktoolview.filters;
2+
3+
import io.snyk.eclipse.plugin.properties.preferences.Preferences;
4+
import io.snyk.eclipse.plugin.views.snyktoolview.TreeFilterManager;
5+
6+
public class IgnoresFilter implements BaseFilter {
7+
private TreeFilterManager filterManager;
8+
private Preferences preferences;
9+
private String preferenceKey;
10+
11+
public IgnoresFilter(TreeFilterManager filterManager, Preferences preferences, String preferenceKey) {
12+
this.filterManager = filterManager;
13+
this.preferences = preferences;
14+
this.preferenceKey = preferenceKey;
15+
}
16+
17+
@Override
18+
public void applyFilter() {
19+
boolean booleanPref = this.preferences.getBooleanPref(Preferences.FILTER_FIXABLE_ISSUES);
20+
21+
if (booleanPref) {
22+
filterManager.removeTreeFilter(preferenceKey);
23+
} else {
24+
filterManager.addTreeFilter(preferenceKey, issue -> issue.isIgnored());
25+
}
26+
27+
}
28+
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package io.snyk.eclipse.plugin.views.snyktoolview.filters;
2+
3+
import io.snyk.eclipse.plugin.properties.preferences.Preferences;
4+
import io.snyk.eclipse.plugin.views.snyktoolview.TreeFilterManager;
5+
6+
public class IgnoresOpenIssuesFilter implements BaseFilter {
7+
private TreeFilterManager filterManager;
8+
private Preferences preferences;
9+
private String preferenceKey;
10+
11+
public IgnoresOpenIssuesFilter(TreeFilterManager filterManager, Preferences preferences, String preferenceKey) {
12+
this.filterManager = filterManager;
13+
this.preferences = preferences;
14+
this.preferenceKey = preferenceKey;
15+
}
16+
17+
@Override
18+
public void applyFilter() {
19+
boolean booleanPref = this.preferences.getBooleanPref(Preferences.FILTER_IGNORES_SHOW_OPEN_ISSUES);
20+
21+
if (booleanPref) {
22+
filterManager.removeTreeFilter(preferenceKey);
23+
} else {
24+
filterManager.addTreeFilter(preferenceKey, issue -> issue.isIgnored());
25+
}
26+
27+
}
28+
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package io.snyk.eclipse.plugin.views.snyktoolview.filters;
2+
3+
import io.snyk.eclipse.plugin.domain.ProductConstants;
4+
import io.snyk.eclipse.plugin.properties.preferences.Preferences;
5+
import io.snyk.eclipse.plugin.views.snyktoolview.TreeFilterManager;
6+
7+
public class SeverityCriticalFilter implements BaseFilter {
8+
private TreeFilterManager filterManager;
9+
private Preferences preferences;
10+
private String preferenceKey;
11+
12+
public SeverityCriticalFilter(TreeFilterManager filterManager, Preferences preferences, String preferenceKey) {
13+
this.filterManager = filterManager;
14+
this.preferences = preferences;
15+
this.preferenceKey = preferenceKey;
16+
}
17+
18+
@Override
19+
public void applyFilter() {
20+
boolean booleanPref = this.preferences.getBooleanPref(preferenceKey);
21+
22+
if (booleanPref) {
23+
this.filterManager.removeTreeFilter(this.preferenceKey);
24+
} else {
25+
this.filterManager.addTreeFilter(this.preferenceKey,
26+
issue -> !issue.severity().equals(ProductConstants.SEVERITY_CRITICAL));
27+
}
28+
29+
}
30+
}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package io.snyk.eclipse.plugin.views.snyktoolview.filters;
2+
3+
import io.snyk.eclipse.plugin.domain.ProductConstants;
4+
import io.snyk.eclipse.plugin.properties.preferences.Preferences;
5+
import io.snyk.eclipse.plugin.views.snyktoolview.TreeFilterManager;
6+
7+
public class SeverityHighFilter implements BaseFilter {
8+
private TreeFilterManager filterManager;
9+
private Preferences preferences;
10+
private String preferenceKey;
11+
12+
public SeverityHighFilter(TreeFilterManager filterManager, Preferences preferences, String preferenceKey) {
13+
this.filterManager = filterManager;
14+
this.preferences = preferences;
15+
this.preferenceKey = preferenceKey;
16+
}
17+
18+
@Override
19+
public void applyFilter() {
20+
boolean booleanPref = this.preferences.getBooleanPref(this.preferenceKey);
21+
22+
if (booleanPref) {
23+
this.filterManager.removeTreeFilter(this.preferenceKey);
24+
} else {
25+
this.filterManager.addTreeFilter(this.preferenceKey,
26+
issue -> !issue.severity().equals(ProductConstants.SEVERITY_HIGH));
27+
}
28+
}
29+
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package io.snyk.eclipse.plugin.views.snyktoolview.filters;
2+
3+
import io.snyk.eclipse.plugin.domain.ProductConstants;
4+
import io.snyk.eclipse.plugin.properties.preferences.Preferences;
5+
import io.snyk.eclipse.plugin.views.snyktoolview.TreeFilterManager;
6+
7+
public class SeverityLowFilter implements BaseFilter {
8+
private TreeFilterManager filterManager;
9+
private Preferences preferences;
10+
private String preferenceKey;
11+
12+
public SeverityLowFilter(TreeFilterManager filterManager, Preferences preferences, String preferenceKey) {
13+
this.filterManager = filterManager;
14+
this.preferences = preferences;
15+
this.preferenceKey = preferenceKey;
16+
}
17+
18+
@Override
19+
public void applyFilter() {
20+
boolean booleanPref = this.preferences.getBooleanPref(this.preferenceKey);
21+
22+
if (booleanPref) {
23+
this.filterManager.removeTreeFilter(this.preferenceKey);
24+
} else {
25+
this.filterManager.addTreeFilter(this.preferenceKey,
26+
issue -> !issue.severity().equals(ProductConstants.SEVERITY_LOW));
27+
}
28+
29+
}
30+
}

0 commit comments

Comments
 (0)