This is an automated email from the ASF dual-hosted git repository.
jamesbognar pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/juneau.git
The following commit(s) were added to refs/heads/master by this push:
new 5eaed24813 FilteredMap/MapBuilder improvements
5eaed24813 is described below
commit 5eaed24813db54a472c0ddd9a255fc774811ae9a
Author: James Bognar <[email protected]>
AuthorDate: Sun Dec 14 16:35:18 2025 -0500
FilteredMap/MapBuilder improvements
---
.../juneau/commons/collections/ListBuilder.java | 27 ++++++++++
.../juneau/commons/collections/MapBuilder.java | 11 ----
.../juneau/commons/collections/SetBuilder.java | 27 ++++++++++
.../commons/collections/ListBuilder_Test.java | 62 ++++++++++++++++++++++
.../commons/collections/SetBuilder_Test.java | 62 ++++++++++++++++++++++
5 files changed, 178 insertions(+), 11 deletions(-)
diff --git
a/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/collections/ListBuilder.java
b/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/collections/ListBuilder.java
index 0de6e3f0ea..a3b3166a57 100644
---
a/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/collections/ListBuilder.java
+++
b/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/collections/ListBuilder.java
@@ -83,6 +83,11 @@ import org.apache.juneau.commons.utils.*;
* .addAll(<jv>existing</jv>)
* .add(4, 5, 6)
* .build();
+ *
+ * <jc>// FluentList wrapper - use buildFluent()</jc>
+ * FluentList<String> <jv>fluent</jv> =
ListBuilder.<jsm>create</jsm>(String.<jk>class</jk>)
+ * .add(<js>"one"</js>, <js>"two"</js>)
+ * .buildFluent();
* </p>
*
* <h5 class='section'>Thread Safety:</h5>
@@ -285,6 +290,28 @@ public class ListBuilder<E> {
return list;
}
+ /**
+ * Builds the list and wraps it in a {@link FluentList}.
+ *
+ * <p>
+ * This is a convenience method that calls {@link #build()} and wraps
the result in a {@link FluentList}.
+ *
+ * <h5 class='section'>Example:</h5>
+ * <p class='bjava'>
+ * <jk>import static</jk>
org.apache.juneau.commons.utils.CollectionUtils.*;
+ *
+ * FluentList<String> <jv>list</jv> =
ListBuilder.<jsm>create</jsm>(String.<jk>class</jk>)
+ * .add(<js>"one"</js>, <js>"two"</js>)
+ * .buildFluent();
+ * </p>
+ *
+ * @return The built list wrapped in a {@link FluentList}, or {@code
null} if {@link #sparse()} is set and the list is empty.
+ */
+ public FluentList<E> buildFluent() {
+ List<E> result = build();
+ return result == null ? null : new FluentList<>(result);
+ }
+
/**
* Registers value converters that can adapt incoming values in {@link
#addAny(Object...)}.
*
diff --git
a/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/collections/MapBuilder.java
b/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/collections/MapBuilder.java
index 24b0d095b2..12a3ef1dc4 100644
---
a/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/collections/MapBuilder.java
+++
b/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/collections/MapBuilder.java
@@ -434,17 +434,6 @@ public class MapBuilder<K,V> {
return this;
}
- /**
- * Forces the existing set to be copied instead of appended to.
- *
- * @return This object.
- */
- public MapBuilder<K,V> copy() {
- if (nn(map))
- map = new LinkedHashMap<>(map);
- return this;
- }
-
/**
* Applies a default filter that excludes common "empty" or "unset"
values from being added to the map.
*
diff --git
a/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/collections/SetBuilder.java
b/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/collections/SetBuilder.java
index 1f77101821..98d135cbd4 100644
---
a/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/collections/SetBuilder.java
+++
b/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/collections/SetBuilder.java
@@ -90,6 +90,11 @@ import org.apache.juneau.commons.utils.*;
* Set<String> <jv>maybeNull</jv> =
SetBuilder.<jsm>create</jsm>(String.<jk>class</jk>)
* .sparse()
* .build(); <jc>// Returns null, not empty set</jc>
+ *
+ * <jc>// FluentSet wrapper - use buildFluent()</jc>
+ * FluentSet<String> <jv>fluent</jv> =
SetBuilder.<jsm>create</jsm>(String.<jk>class</jk>)
+ * .add(<js>"one"</js>, <js>"two"</js>)
+ * .buildFluent();
* </p>
*
* <h5 class='section'>Thread Safety:</h5>
@@ -288,6 +293,28 @@ public class SetBuilder<E> {
return set;
}
+ /**
+ * Builds the set and wraps it in a {@link FluentSet}.
+ *
+ * <p>
+ * This is a convenience method that calls {@link #build()} and wraps
the result in a {@link FluentSet}.
+ *
+ * <h5 class='section'>Example:</h5>
+ * <p class='bjava'>
+ * <jk>import static</jk>
org.apache.juneau.commons.utils.CollectionUtils.*;
+ *
+ * FluentSet<String> <jv>set</jv> =
SetBuilder.<jsm>create</jsm>(String.<jk>class</jk>)
+ * .add(<js>"one"</js>, <js>"two"</js>)
+ * .buildFluent();
+ * </p>
+ *
+ * @return The built set wrapped in a {@link FluentSet}, or {@code
null} if {@link #sparse()} is set and the set is empty.
+ */
+ public FluentSet<E> buildFluent() {
+ Set<E> result = build();
+ return result == null ? null : new FluentSet<>(result);
+ }
+
/**
* Registers value converters that can adapt incoming values in {@link
#addAny(Object...)}.
*
diff --git
a/juneau-utest/src/test/java/org/apache/juneau/commons/collections/ListBuilder_Test.java
b/juneau-utest/src/test/java/org/apache/juneau/commons/collections/ListBuilder_Test.java
index 65500d9600..9a9e094e6e 100644
---
a/juneau-utest/src/test/java/org/apache/juneau/commons/collections/ListBuilder_Test.java
+++
b/juneau-utest/src/test/java/org/apache/juneau/commons/collections/ListBuilder_Test.java
@@ -628,5 +628,67 @@ class ListBuilder_Test extends TestBase {
assertNotNull(list);
assertThrows(UnsupportedOperationException.class, () ->
list.add("a"));
}
+
+
//-----------------------------------------------------------------------------------------------------------------
+ // BuildFluent
+
//-----------------------------------------------------------------------------------------------------------------
+
+ @Test
+ void n01_buildFluent_returnsFluentList() {
+ var list = ListBuilder.create(String.class)
+ .add("a", "b", "c")
+ .buildFluent();
+
+ assertNotNull(list);
+ assertTrue(list instanceof FluentList);
+ assertSize(3, list);
+ assertList(list, "a", "b", "c");
+ }
+
+ @Test
+ void n02_buildFluent_sparseEmpty() {
+ var list = ListBuilder.create(String.class)
+ .sparse()
+ .buildFluent();
+
+ assertNull(list);
+ }
+
+ @Test
+ void n03_buildFluent_withSorted() {
+ var list = ListBuilder.create(String.class)
+ .add("c", "a", "b")
+ .sorted()
+ .buildFluent();
+
+ assertNotNull(list);
+ assertTrue(list instanceof FluentList);
+ assertList(list, "a", "b", "c");
+ }
+
+ @Test
+ void n04_buildFluent_withUnmodifiable() {
+ var list = ListBuilder.create(String.class)
+ .add("a", "b", "c")
+ .unmodifiable()
+ .buildFluent();
+
+ assertNotNull(list);
+ assertTrue(list instanceof FluentList);
+ assertSize(3, list);
+ assertThrows(UnsupportedOperationException.class, () ->
list.add("d"));
+ }
+
+ @Test
+ void n05_buildFluent_fluentMethods() {
+ var list = ListBuilder.create(String.class)
+ .add("a", "b")
+ .buildFluent();
+
+ assertNotNull(list);
+ // Test that FluentList methods work
+ list.a("c").aa(l("d", "e"));
+ assertList(list, "a", "b", "c", "d", "e");
+ }
}
diff --git
a/juneau-utest/src/test/java/org/apache/juneau/commons/collections/SetBuilder_Test.java
b/juneau-utest/src/test/java/org/apache/juneau/commons/collections/SetBuilder_Test.java
index 049f0f195d..9719ad8b06 100644
---
a/juneau-utest/src/test/java/org/apache/juneau/commons/collections/SetBuilder_Test.java
+++
b/juneau-utest/src/test/java/org/apache/juneau/commons/collections/SetBuilder_Test.java
@@ -667,4 +667,66 @@ class SetBuilder_Test extends TestBase {
assertNotNull(set);
assertThrows(UnsupportedOperationException.class, () ->
set.add("a"));
}
+
+
//-----------------------------------------------------------------------------------------------------------------
+ // BuildFluent
+
//-----------------------------------------------------------------------------------------------------------------
+
+ @Test
+ void p01_buildFluent_returnsFluentSet() {
+ var set = SetBuilder.create(String.class)
+ .add("a", "b", "c")
+ .buildFluent();
+
+ assertNotNull(set);
+ assertTrue(set instanceof FluentSet);
+ assertSize(3, set);
+ assertList(set, "a", "b", "c");
+ }
+
+ @Test
+ void p02_buildFluent_sparseEmpty() {
+ var set = SetBuilder.create(String.class)
+ .sparse()
+ .buildFluent();
+
+ assertNull(set);
+ }
+
+ @Test
+ void p03_buildFluent_withSorted() {
+ var set = SetBuilder.create(String.class)
+ .add("c", "a", "b")
+ .sorted()
+ .buildFluent();
+
+ assertNotNull(set);
+ assertTrue(set instanceof FluentSet);
+ assertList(set, "a", "b", "c");
+ }
+
+ @Test
+ void p04_buildFluent_withUnmodifiable() {
+ var set = SetBuilder.create(String.class)
+ .add("a", "b", "c")
+ .unmodifiable()
+ .buildFluent();
+
+ assertNotNull(set);
+ assertTrue(set instanceof FluentSet);
+ assertSize(3, set);
+ assertThrows(UnsupportedOperationException.class, () ->
set.add("d"));
+ }
+
+ @Test
+ void p05_buildFluent_fluentMethods() {
+ var set = SetBuilder.create(String.class)
+ .add("a", "b")
+ .buildFluent();
+
+ assertNotNull(set);
+ // Test that FluentSet methods work
+ set.a("c").aa(l("d", "e"));
+ assertList(set, "a", "b", "c", "d", "e");
+ }
}
\ No newline at end of file