From 0adbfbc77a4c9a7661b796d93c47cbf04b0e3a6b Mon Sep 17 00:00:00 2001 From: Chris Edwards Date: Fri, 19 Dec 2025 11:29:20 -0500 Subject: [PATCH 1/3] Add environments filter to LibraryFilterForm MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Support filtering libraries by environment (DEVELOPMENT, QA, PRODUCTION) to match TeamServer NgLibraryFilterRequest capabilities. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- .../http/LibraryFilterForm.java | 19 +++++ .../http/LibraryFilterFormTest.java | 76 +++++++++++++++++++ 2 files changed, 95 insertions(+) create mode 100644 sdk/src/test/java/com/contrastsecurity/http/LibraryFilterFormTest.java diff --git a/sdk/src/main/java/com/contrastsecurity/http/LibraryFilterForm.java b/sdk/src/main/java/com/contrastsecurity/http/LibraryFilterForm.java index 1856b79f..c9d2e346 100644 --- a/sdk/src/main/java/com/contrastsecurity/http/LibraryFilterForm.java +++ b/sdk/src/main/java/com/contrastsecurity/http/LibraryFilterForm.java @@ -21,6 +21,7 @@ */ import java.util.ArrayList; +import java.util.EnumSet; import java.util.List; import java.util.stream.Collectors; @@ -64,6 +65,7 @@ public String toString() { private LibraryQuickFilterType quickFilter; private boolean includeUsed; private boolean includeUnused; + private EnumSet environments; public LibraryFilterForm() { super(); @@ -78,6 +80,7 @@ public LibraryFilterForm() { this.quickFilter = null; this.includeUsed = false; this.includeUnused = false; + this.environments = EnumSet.noneOf(ServerEnvironment.class); } public List getApps() { @@ -160,6 +163,14 @@ public void setIncludeUnused(boolean includeUnused) { this.includeUnused = includeUnused; } + public EnumSet getEnvironments() { + return environments; + } + + public void setEnvironments(EnumSet environments) { + this.environments = environments; + } + @Override public String toString() { String formString = super.toString(); @@ -199,6 +210,14 @@ public String toString() { filters.add("quickFilter=" + quickFilter.toString()); } + if (environments != null && !environments.isEmpty()) { + filters.add( + "environments=" + + environments.stream() + .map(ServerEnvironment::toURIString) + .collect(Collectors.joining(","))); + } + filters.add("includeUsed=" + includeUsed); filters.add("includeUnused=" + includeUnused); diff --git a/sdk/src/test/java/com/contrastsecurity/http/LibraryFilterFormTest.java b/sdk/src/test/java/com/contrastsecurity/http/LibraryFilterFormTest.java new file mode 100644 index 00000000..df73c611 --- /dev/null +++ b/sdk/src/test/java/com/contrastsecurity/http/LibraryFilterFormTest.java @@ -0,0 +1,76 @@ +package com.contrastsecurity.http; + +/*- + * #%L + * Contrast Java SDK + * %% + * Copyright (C) 2022 - 2025 Contrast Security, Inc. + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import static org.assertj.core.api.Assertions.assertThat; + +import java.util.EnumSet; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +final class LibraryFilterFormTest { + + LibraryFilterForm form; + + @BeforeEach + public void setUp() { + form = new LibraryFilterForm(); + } + + @Test + public void toString_should_include_environments_when_set() { + form.setEnvironments(EnumSet.of(ServerEnvironment.DEVELOPMENT, ServerEnvironment.PRODUCTION)); + String qs = form.toString(); + + assertThat(qs).contains("environments="); + assertThat(qs).contains("DEVELOPMENT"); + assertThat(qs).contains("PRODUCTION"); + } + + @Test + public void toString_should_not_include_environments_when_empty() { + String qs = form.toString(); + + assertThat(qs).doesNotContain("environments="); + } + + @Test + public void toString_should_include_single_environment() { + form.setEnvironments(EnumSet.of(ServerEnvironment.QA)); + String qs = form.toString(); + + assertThat(qs).contains("environments=QA"); + } + + @Test + public void getEnvironments_should_return_set_environments() { + EnumSet expected = + EnumSet.of(ServerEnvironment.DEVELOPMENT, ServerEnvironment.QA); + form.setEnvironments(expected); + + assertThat(form.getEnvironments()).isEqualTo(expected); + } + + @Test + public void environments_should_be_empty_by_default() { + assertThat(form.getEnvironments()).isEmpty(); + } +} From 076523d92c7ab5f2c68f57a0e8ed521cf05e7fc9 Mon Sep 17 00:00:00 2001 From: Chris Edwards Date: Fri, 19 Dec 2025 11:37:40 -0500 Subject: [PATCH 2/3] Add statuses filter to LibraryFilterForm MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Support filtering libraries by status (CURRENT, FLAGGED, STALE, etc.) to match TeamServer NgLibraryFilterRequest capabilities. Note: Named 'statuses' (plural) since parent FilterForm already has 'status' as a String field. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- .../http/LibraryFilterForm.java | 14 +++++++ .../http/LibraryFilterFormTest.java | 40 +++++++++++++++++++ 2 files changed, 54 insertions(+) diff --git a/sdk/src/main/java/com/contrastsecurity/http/LibraryFilterForm.java b/sdk/src/main/java/com/contrastsecurity/http/LibraryFilterForm.java index c9d2e346..093ec34c 100644 --- a/sdk/src/main/java/com/contrastsecurity/http/LibraryFilterForm.java +++ b/sdk/src/main/java/com/contrastsecurity/http/LibraryFilterForm.java @@ -66,6 +66,7 @@ public String toString() { private boolean includeUsed; private boolean includeUnused; private EnumSet environments; + private List statuses; public LibraryFilterForm() { super(); @@ -81,6 +82,7 @@ public LibraryFilterForm() { this.includeUsed = false; this.includeUnused = false; this.environments = EnumSet.noneOf(ServerEnvironment.class); + this.statuses = new ArrayList<>(); } public List getApps() { @@ -171,6 +173,14 @@ public void setEnvironments(EnumSet environments) { this.environments = environments; } + public List getStatuses() { + return statuses; + } + + public void setStatuses(List statuses) { + this.statuses = statuses; + } + @Override public String toString() { String formString = super.toString(); @@ -218,6 +228,10 @@ public String toString() { .collect(Collectors.joining(","))); } + if (!statuses.isEmpty()) { + filters.add("statuses=" + String.join(",", statuses)); + } + filters.add("includeUsed=" + includeUsed); filters.add("includeUnused=" + includeUnused); diff --git a/sdk/src/test/java/com/contrastsecurity/http/LibraryFilterFormTest.java b/sdk/src/test/java/com/contrastsecurity/http/LibraryFilterFormTest.java index df73c611..930415d6 100644 --- a/sdk/src/test/java/com/contrastsecurity/http/LibraryFilterFormTest.java +++ b/sdk/src/test/java/com/contrastsecurity/http/LibraryFilterFormTest.java @@ -22,7 +22,9 @@ import static org.assertj.core.api.Assertions.assertThat; +import java.util.Arrays; import java.util.EnumSet; +import java.util.List; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -73,4 +75,42 @@ public void getEnvironments_should_return_set_environments() { public void environments_should_be_empty_by_default() { assertThat(form.getEnvironments()).isEmpty(); } + + @Test + public void toString_should_include_statuses_when_set() { + form.setStatuses(Arrays.asList("CURRENT", "FLAGGED")); + String qs = form.toString(); + + assertThat(qs).contains("statuses="); + assertThat(qs).contains("CURRENT"); + assertThat(qs).contains("FLAGGED"); + } + + @Test + public void toString_should_not_include_statuses_when_empty() { + String qs = form.toString(); + + assertThat(qs).doesNotContain("statuses="); + } + + @Test + public void toString_should_include_single_status() { + form.setStatuses(Arrays.asList("STALE")); + String qs = form.toString(); + + assertThat(qs).contains("statuses=STALE"); + } + + @Test + public void getStatuses_should_return_set_statuses() { + List expected = Arrays.asList("CURRENT", "UNKNOWN"); + form.setStatuses(expected); + + assertThat(form.getStatuses()).isEqualTo(expected); + } + + @Test + public void statuses_should_be_empty_by_default() { + assertThat(form.getStatuses()).isEmpty(); + } } From 4f8e349e4beaec5fca7ab250b5e04dc5483fd71c Mon Sep 17 00:00:00 2001 From: Chris Edwards Date: Fri, 19 Dec 2025 11:45:28 -0500 Subject: [PATCH 3/3] Add severities filter to LibraryFilterForm MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Support filtering libraries by CVE severity (CRITICAL, HIGH, MEDIUM, LOW, NOTE) to achieve parity with TeamServer's NgLibraryFilterRequest. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- .../http/LibraryFilterForm.java | 14 +++++++ .../http/LibraryFilterFormTest.java | 38 +++++++++++++++++++ 2 files changed, 52 insertions(+) diff --git a/sdk/src/main/java/com/contrastsecurity/http/LibraryFilterForm.java b/sdk/src/main/java/com/contrastsecurity/http/LibraryFilterForm.java index 093ec34c..8afd9056 100644 --- a/sdk/src/main/java/com/contrastsecurity/http/LibraryFilterForm.java +++ b/sdk/src/main/java/com/contrastsecurity/http/LibraryFilterForm.java @@ -67,6 +67,7 @@ public String toString() { private boolean includeUnused; private EnumSet environments; private List statuses; + private List severities; public LibraryFilterForm() { super(); @@ -83,6 +84,7 @@ public LibraryFilterForm() { this.includeUnused = false; this.environments = EnumSet.noneOf(ServerEnvironment.class); this.statuses = new ArrayList<>(); + this.severities = new ArrayList<>(); } public List getApps() { @@ -181,6 +183,14 @@ public void setStatuses(List statuses) { this.statuses = statuses; } + public List getSeverities() { + return severities; + } + + public void setSeverities(List severities) { + this.severities = severities; + } + @Override public String toString() { String formString = super.toString(); @@ -232,6 +242,10 @@ public String toString() { filters.add("statuses=" + String.join(",", statuses)); } + if (!severities.isEmpty()) { + filters.add("severities=" + String.join(",", severities)); + } + filters.add("includeUsed=" + includeUsed); filters.add("includeUnused=" + includeUnused); diff --git a/sdk/src/test/java/com/contrastsecurity/http/LibraryFilterFormTest.java b/sdk/src/test/java/com/contrastsecurity/http/LibraryFilterFormTest.java index 930415d6..b4d53920 100644 --- a/sdk/src/test/java/com/contrastsecurity/http/LibraryFilterFormTest.java +++ b/sdk/src/test/java/com/contrastsecurity/http/LibraryFilterFormTest.java @@ -113,4 +113,42 @@ public void getStatuses_should_return_set_statuses() { public void statuses_should_be_empty_by_default() { assertThat(form.getStatuses()).isEmpty(); } + + @Test + public void toString_should_include_severities_when_set() { + form.setSeverities(Arrays.asList("CRITICAL", "HIGH")); + String qs = form.toString(); + + assertThat(qs).contains("severities="); + assertThat(qs).contains("CRITICAL"); + assertThat(qs).contains("HIGH"); + } + + @Test + public void toString_should_not_include_severities_when_empty() { + String qs = form.toString(); + + assertThat(qs).doesNotContain("severities="); + } + + @Test + public void toString_should_include_single_severity() { + form.setSeverities(Arrays.asList("MEDIUM")); + String qs = form.toString(); + + assertThat(qs).contains("severities=MEDIUM"); + } + + @Test + public void getSeverities_should_return_set_severities() { + List expected = Arrays.asList("LOW", "NOTE"); + form.setSeverities(expected); + + assertThat(form.getSeverities()).isEqualTo(expected); + } + + @Test + public void severities_should_be_empty_by_default() { + assertThat(form.getSeverities()).isEmpty(); + } }